我想将连续动画(比如ScaleAnimation)应用于显示资源图像的ImageView。动画由按钮触发。例如,我想在每次点击按钮时逐步放大图像。
我在动画上设置了fillAfter =“true”。但是,所有动画都从ImageView的原始状态开始。似乎ImageView重置其状态并且动画始终相同,而不是从上一个动画的最终状态开始。
我做错了什么?
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);
}
答案 0 :(得分:3)
似乎ImageView重置了 它的状态和动画总是如此 同样的,而不是从 上一个动画的最终状态。
正!我确信fillAfter="true"
有用,但我还没有弄明白。
您需要做的是在每个AnimationListener
相关性上设置Animation
,并在侦听器的onAnimationEnd()
中执行某些操作以实际保持动画的结束状态。我没有和ScaleAnimation
玩过,所以我不太确定“坚持最终状态”的方法是什么。如果这是AlphaAnimation
,从1.0
转到0.0
,您可以在INVISIBLE
中制作小工具GONE
或onAnimationEnd()
。
答案 1 :(得分:1)
我遇到了同样的问题,并创建了以下代码,以便轻松使用不同的动画。它现在仅支持翻译和alpha级别,因为我没有使用缩放,但可以轻松扩展以支持更多功能。
我在开始动画之前重置了滚动和可见性,但这只是因为我需要开/关动画。
并且“doEnd”布尔值是为了避免递归上的堆栈溢出(scrollTo为了一些不明原因调用onAnimationEnd ...)
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);
}