Anwenden aufeinanderfolgende Animationen Image in Android
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);
}
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);
}