Frage

Ich möchte aufeinanderfolgende Animationen (zB ScaleAnimation) zu einem Image aufzubringen, um eine Ressource Bild zeigt. Die Animation wird durch eine Taste ausgelöst. Zum Beispiel würde ich inkrementell gerne ein Bild auf jede Taste klicken vergrößern.

Ich habe fillAfter = "true" auf der Animation gesetzt. Doch all die Animationen starten aus dem ursprünglichen Zustand des Image. Es scheint, als ob der Image setzt seinen Zustand und die Animation ist immer das gleiche, statt aus dem Endzustand der vorherigen Animation zu starten.

Was mache ich falsch?

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Button button = (Button)findViewById(R.id.Button01);
    button.setOnClickListener(new OnClickListener() {

        public void onClick(View arg0) {
            animate();

        }});
}

private void animate() {
    ImageView imageView = (ImageView) findViewById(R.id.ImageView01);

    ScaleAnimation scale = new ScaleAnimation((float)1.0, (float)1.5, (float)1.0, (float)1.5);
    scale.setFillAfter(true);
    scale.setDuration(500);
    imageView.startAnimation(scale); 
}
War es hilfreich?

Lösung

  

Es scheint, als ob das Image zurückgesetzt   sein Zustand und die Animation ist immer   die gleichen sind, anstatt aus dem Ausgangs   Endzustand der vorherigen Animation.

Genau! Ich bin sicher, es gibt eine Verwendung für fillAfter="true", aber ich habe nicht der Punkt wird für sie noch dachte.

Was Sie tun müssen, ist ein AnimationListener auf jeden Animation von Relevanz einrichten und etwas tun, in der onAnimationEnd() des Zuhörers bestehen tatsächlich den Endstatus der Animation. Ich habe nicht mit ScaleAnimation gespielt, damit ich nicht ganz sicher bin, was die Art und Weise, „den Endzustand zu anhalten“ wäre. Wenn dies eine AlphaAnimation ist, von 1.0 zu 0.0 gehen, würden Sie das Widget INVISIBLE oder GONE in onAnimationEnd() machen, zum Beispiel.

Andere Tipps

Ich habe das gleiche Problem hatte und den folgenden Code erstellt auf einfache Weise verwenden verschiedene Animationen. Es unterstützt nur Übersetzung und alpha-Spiegel für jetzt, da ich nicht Skalierung verwendet habe, aber leicht erweitert werden könnte, um mehr Funktionen zu unterstützen.

setze ich das Buch und die Sichtbarkeit vor der Animation starten, aber das ist nur, weil ich brauchte Ein / Aus-Animationen.

Und die „doEnd“ boolean gibt es einen Stapelüberlauf auf der Rekursion zu vermeiden (scrollTo ruft onAnimationEnd aus unerfindlichen Gründen ...)

private void setViewPos(View view, Animation anim, long time){
    // Get the transformation
    Transformation trans = new Transformation();
    anim.getTransformation(time, trans);

    // Get the matrix values
    float[] values = new float[9];
    Matrix m = trans.getMatrix();
    m.getValues(values);

    // Get the position and apply the scroll
    final float x = values[Matrix.MTRANS_X];
    final float y = values[Matrix.MTRANS_Y];
    view.scrollTo(-(int)x, -(int)y);

    // Show/hide depending on final alpha level
    if (trans.getAlpha() > 0.5){
        view.setVisibility(VISIBLE);
    } else {
        view.setVisibility(INVISIBLE);       
    }
}

private void applyAnimation(final View view, final Animation anim){
    view.scrollTo(0, 0);
    view.setVisibility(VISIBLE);

    anim.setAnimationListener(new AnimationListener(){
        private boolean doEnd = true;

        @Override
        public void onAnimationEnd(Animation animation) {
            if (doEnd){
                doEnd = false;
                setViewPos(view, animation, anim.getStartTime() + anim.getDuration());
            }
        }

        @Override
        public void onAnimationRepeat(Animation animation) {
        }

        @Override
        public void onAnimationStart(Animation animation) {
        }

    });

    view.startAnimation(anim);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top