L'applicazione di animazioni successive al ImageView in Android
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);
}
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);
}