我正在尝试修改用作Button背景的BitmapDrawable的颜色。我需要使用setColorFilter(),所以我相信我需要使用ValueAnimator并在AnimatorUpdateListener中调用setColorFilter(),如下所示:
final Integer colorFrom = G.actResources.getColor(R.color.TS_Orange); // color to fade from
final Integer colorTo = G.actResources.getColor(R.color.white); // color to fade to
final Button brow = ...; // get my Button object
final Drawable bd = brow.getBackground(); // get my BitmapDrawable
ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), colorFrom, colorTo);
colorAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animator) {
Integer i = (Integer)animator.getAnimatedValue();
if (i == colorTo)
bd.clearColorFilter();
else
bd.setColorFilter(i, PorterDuff.Mode.MULTIPLY);
brow.invalidate(); // What do I need to do here, to ensure the View is updated?
}
});
我的问题是动画有时会起作用,有时却不起作用。我发现确保动画按预期显示的唯一完全可靠的方法是在动画侦听器回调中的封闭ViewGroup上调用requestLayout()。但当然这非常慢,使动画以大约2 fps的速度运行。
那么确保UI系统使用更新的颜色重新绘制View的最轻量级方法是什么?我已经尝试过View.invalidate(),Drawable.invalidateSelf(),以及我能想到的几乎所有内容。
值得注意的是,虽然在动画监听器回调中对封闭的ViewGroup调用requestLayout()在大多数三星设备上一直很慢,但在Nexus 4等上用得非常快。但是自Android 4.4.3更新以来它在Nexus 4中变得最慢!