我正在使用两个 GradientDrawables 之间的 TransitionDrawable,我将其设置为 Button 的背景可绘制对象。这可以很好地在两个 ColorDrawables 之间进行转换,但是当我尝试使用 GradientDrawables 进行转换时,我得到了一些非常奇怪的结果。
在我的 2.3.5 设备上,一切正常。在我的 4.2.2 设备上,按钮只呈现第一个渐变,根本不重绘。
如果我在开始转换后添加对 view.refreshDrawableState() 或 view.setBackgroundDrawable(drawable) 的调用,它会刷新但事情会变得更奇怪:
- 一些按钮工作正常
- 在过渡期间,一些按钮会在某些点闪烁
- 一个按钮,无论出于何种原因,过渡到黑色而不是第二个渐变可绘制
我正在使用递归帖子循环转换到视图,但我认为这不是问题,因为当我不这样做时会遇到同样的问题。
有谁知道我能做些什么来解决这个问题?以下是相关代码:
private static void highlightView(View view, Context context) {
TransitionDrawable drawable;
GradientDrawable d1 = new GradientDrawable(Orientation.TOP_BOTTOM, new int[] { HIGHLIGHT_COLOR_1, HIGHLIGHT_COLOR_G1 });
d1.setCornerRadius(3f);
GradientDrawable d2 = new GradientDrawable(Orientation.TOP_BOTTOM,
new int[] { HIGHLIGHT_COLOR_2, HIGHLIGHT_COLOR_G2 });
d2.setCornerRadius(3f);
drawable = new TransitionDrawable(new Drawable[] {
d1,
d2
});
view.setBackgroundDrawable(drawable);
drawable.setCrossFadeEnabled(true);
animateBackground(drawable, true, view);
}
private static void animateBackground(final TransitionDrawable drawable,
final boolean forward, final View view) {
if (view.getBackground() != drawable) return;
if (forward) {
drawable.startTransition(HIGHLIGHT_CYCLE / 2);
} else {
drawable.reverseTransition(HIGHLIGHT_CYCLE / 2);
}
view.postDelayed(new Runnable() {
@Override
public void run() {
animateBackground(drawable, !forward, view);
}
}, HIGHLIGHT_CYCLE / 2);
view.refreshDrawableState(); //without this, no transition occurs at all
}