私は2つのGradientDrawablesの間に2つのTransitionDrawableを使用しており、それをButtonのバックグラウンドドローアブルとして設定しています。これは 2 つの ColorDrawables の間で正常に遷移しますが、GradientDrawables で実行しようとすると、非常に奇妙な結果が得られます。
私の 2.3.5 デバイスでは、すべて問題なく動作します。私の 4.2.2 デバイスでは、ボタンは最初のグラデーションを使用するだけで、再描画はまったく行われません。
遷移を開始した後に view.refreshDrawableState() または view.setBackgroundDrawable(drawable) への呼び出しを追加すると、更新されますが、事態はさらに奇妙になります。
- 一部のボタンは正常に動作します
- トランジション中のポイントで一部のボタンがちらつく
- 何らかの理由で、1 つのボタンが 2 番目のグラデーション ドローアブルではなく黒に遷移する
ビューへの再帰的な投稿でトランジションをループしていますが、そうしないと同じ問題が発生するため、それは問題ではないと思います。
これを修正するために私ができることを誰かが知っていますか? 関連するコードは次のとおりです。
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
}