我设法为我的Image添加了一个缩放动画,使其从原始大小增长到更大的大小。但是,我需要添加动画代码的另一个副本,使其缩小到其“#”;原始尺寸。我想在布尔值为真时循环播放动画。
我参与了一些参数,但我无法使其发挥作用。到目前为止,这是我的代码:
class AnimateButton extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
Boolean isGlowing = true; //Make it run forever
while (isGlowing) {
scal_grow = new ScaleAnimation(0, 1.2f, 0, 1.2f, Animation.RELATIVE_TO_SELF, (float) 0.5, Animation.RELATIVE_TO_SELF, (float) 0.5);
scal_grow.setDuration(1500);
scal_grow.setFillAfter(true);
runOnUiThread(new Runnable() {
@Override
public void run() {
btn_layer.setAnimation(scal_grow);
}
});
try {
Thread.sleep(1500);
} catch (Exception e) { }
//Add a reverse animation such that it goes back to the original size
}
return null;
}
}
我应该做些什么改变?
答案 0 :(得分:9)
在android中,除了UIThread(主线程)之外的任何其他线程都不会发生动画和UI更新。
删除AsyncTask并尝试使用ViewPropertyAnimator,它在性能方面优于ScaleAnimation。另外,它只是一行。
缩放:
btn_layer.animate().scaleX(1.2f).scaleY(1.2f).setDuration(1500).start();
到unscale:
btn_layer.animate().scaleX(0.8f).scaleY(0.8f).setDuration(1500).start();
更新
PropertyValuesHolder scalex = PropertyValuesHolder.ofFloat(View.SCALE_X, 1.2f);
PropertyValuesHolder scaley = PropertyValuesHolder.ofFloat(View.SCALE_Y, 1.2f);
ObjectAnimator anim = ObjectAnimator.ofPropertyValuesHolder(btn_layer, scalex, scaley);
anim.setRepeatCount(ValueAnimator.INFINITE);
anim.setRepeatMode(ValueAnimator.REVERSE);
anim.setDuration(1500);
anim.start();
答案 1 :(得分:3)
我绝对建议不要使用旧版android.view.animation
动画,而是使用Property Animations。旧视图动画效果不佳,并且不像您期望的那样在视图上工作。
使用属性动画,这个脉冲动画非常简单。你可以用XML定义它:
<animator xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1500"
android:valueFrom="1"
android:valueTo="1.2"
android:valueType="floatType"
android:repeatCount="infinite"
android:repeatMode="reverse"/>
当你应用它时,动画将通过反转无限重复。
在Java中它看起来像这样:
PropertyValuesHolder scalex = PropertyValuesHolder.ofFloat(View.SCALE_X, 1.2f);
PropertyValuesHolder scaley = PropertyValuesHolder.ofFloat(View.SCALE_Y, 1.2f);
ObjectAnimator anim = ObjectAnimator.ofPropertyValuesHolder(btn_layer, scalex, scaley);
anim.setRepeatCount(ValueAnimator.INFINITE);
anim.setRepeatMode(ValueAnimator.REVERSE);
anim.setDuration(1500);
anim.start();
这将为您提供更加期待的体验,并为您提供线程和时间安排。当您想要停止动画时,只需致电s.cancel()
即可。
答案 2 :(得分:0)
要取消刻度,你可以使用它:
ID
缩放和缩放的方法:
ScaleAnimation unscal_grow = new ScaleAnimation(1.2f, 1.0f, 1.2f, 1.0f, Animation.RELATIVE_TO_SELF, (float) 0.5, Animation.RELATIVE_TO_SELF, (float) 0.5);
unscal_grow .setDuration(1500);
unscal_grow .setFillAfter(true);