Domanda

Vorrei applicare animazioni successive (diciamo ScaleAnimation) a un ImageView che mostra un'immagine di una risorsa. L'animazione viene attivato da un pulsante. Ad esempio, mi piacerebbe per ingrandire in modo incrementale un'immagine ad ogni clic del pulsante.

Ho impostato fillAfter = "true" l'animazione. Tuttavia, tutte le animazioni iniziano dallo stato originale del ImageView. Sembra che l'ImageView ripristina il suo stato e l'animazione è sempre lo stesso, invece di partire dallo stato finale dell'animazione precedente.

Che cosa sto facendo di sbagliato?

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); 
}
È stato utile?

Soluzione

  

E 'come se il ripristino ImageView   il suo stato e l'animazione è sempre   lo stesso, invece di partire dalla   stato finale dell'animazione precedente.

Proprio! Sono sicuro che ci sia un uso per fillAfter="true", ma non ho ancora capito il punto per esso.

Quello che dovete fare è impostare un AnimationListener su ogni Animation di rilevanza, e fare qualcosa in onAnimationEnd() di chi ascolta in realtà persistere lo stato finale dell'animazione. Non ho giocato con ScaleAnimation quindi non sono abbastanza sicuro che cosa il modo di "persistere lo stato finale" sarebbe. Se questo fosse un AlphaAnimation, passando da 1.0 a 0.0, si renderebbe il widget di INVISIBLE o GONE in onAnimationEnd(), per esempio.

Altri suggerimenti

Ho avuto lo stesso problema e ha creato il seguente codice per usare facilmente le animazioni differenti. Supporta solo la traduzione e alfa livelli per ora come non ho usato il ridimensionamento, ma potrebbe facilmente essere esteso per supportare più funzionalità.

I resettare il libro e la visibilità prima di iniziare l'animazione, ma questo è solo perché avevo bisogno di on / off animazioni.

E il booleano "doEnd" è lì per evitare un overflow dello stack sulla ricorsione (scrollTo richiede onAnimationEnd per qualche oscura ragione ...)

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);
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top