我试图为一个简单的任务找到最简单的解决方案:在视图上闪烁项目(每秒隐藏/显示)。但是我找到的解决方案似乎有点过于复杂。
我不能使用 Timer/TimerTask 对,因为这会导致尝试从不同线程访问 View 的异常。
我找到的唯一解决方案是:
package com.my.package;
import android.animation.ValueAnimator;
import android.view.View;
... other imports ...
public class MyView extends View {
private ValueAnimator myAnimator = ValueAnimator.ofInt(0, 2);
private boolean itemVisible;
... all constructors are calling the init() method ...
init() {
myAnimator.setDuration(1000);
myAnimator.addListener(new MyAnimatorListener(this));
myAnimator.setRepeatCount(ValueAnimator.INFINITE);
myAnimator.start();
}
private class MyAnimatorListener implements ValueAnimator.AnimatorListener {
private MyView myView;
MyAnimatorListener(MyView myView) {
this.myView = myView;
}
@Override
public void onAnimationStart(Animator animator) { }
@Override
public void onAnimationCancel(Animator animator) { }
@Override
public void onAnimationRepeat(Animator animator) {
myView.toggleItemVisibility();
}
@Override
public void onAnimationEnd(Animator animator) { }
}
public void toggleItemVisibility() {
itemVisible = !itemVisible;
invalidate();
}
@Override
protected void onDraw(Canvas canvas) {
...
if (itemVisible) {
... draw item ...
}
...
}
}
这样做的问题是:
ValueAnimator.ofInt(0, 2)
即使这不会用于任何事情。我只是点击repeat
事件。(我不能使用该update
事件,因为即使值没有改变,也会为每一帧调用它。)repeat
使用了。有没有更简单的解决方案?
只需使用 aHandler
发布 aRunnable
然后使用postDelayed
. 应该按照以下方式工作,
final Handler handler = new Handler();
final Runnable runnable = new Runnable() {
@Override
public void run() {
myView.toggleItemVisibility();
handler.postDelayed(this, 1000);
}
};
handler.postDelayed(runnable, 1000);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句