6

バックグラウンド

アクションバーの背景を変更したり、2 つの色の間でアニメーション化することも可能です。

public static void animateBetweenColors(final ActionBar actionBar, final int colorFrom, final int colorTo,
        final int durationInMs) {
    final ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), colorFrom, colorTo);
    colorAnimation.addUpdateListener(new AnimatorUpdateListener() {
        ColorDrawable colorDrawable = new ColorDrawable(colorFrom);

        @Override
        public void onAnimationUpdate(final ValueAnimator animator) {
            colorDrawable.setColor((Integer) animator.getAnimatedValue());
            actionBar.setBackgroundDrawable(colorDrawable);
        }
    });
    if (durationInMs >= 0)
        colorAnimation.setDuration(durationInMs);
    colorAnimation.start();
}

問題

アクションモードのビューを取得する方法が見つからないため、場合によっては (表示中に) 背景を変更できます。

私が試したこと

私が見つけた唯一のものは、アクションモードのIDが同じままであると仮定するハック的な方法であり、これでも「完了」ボタン(「V」のように見えるボタン)のビューに対してのみ機能します実際には「キャンセル」に似ています)。

テーマを介して変更する方法も見つけましたが、プログラムで行う必要があるため、それは必要ありません。

質問

actionMode のビューを取得するにはどうすればよいですか? より正確には、アニメーションを使用して背景を変更するにはどうすればよいですか?

4

1 に答える 1

11

actionMode のビューを取得するにはどうすればよいですか? より正確には、アニメーションを使用して背景を変更するにはどうすればよいですか?

2 つの選択肢がありますが、残念ながらどちらにもネイティブActionModeAPIは含まれていません。

ActionBarContextView、を制御する責任があります。ActionMode

  1. システムが使用する IDResources.getIdentifierを呼び出して渡すために使用します。Activity.findViewByIdActionBarContextView
  2. リフレクションを使用してアクセスFieldするActionBarImpl

両方の例を次に示します。

使用Resources.getIdentifier:

private void animateActionModeViaFindViewById(int colorFrom, int colorTo, int duration) {
    final int amId = getResources().getIdentifier("action_context_bar", "id", "android");
    animateActionMode(findViewById(amId), colorFrom, colorTo, duration);
}

リフレクションの使用:

private void animateActionModeViaReflection(int colorFrom, int colorTo, int duration) {
    final ActionBar actionBar = getActionBar();
    try {
        final Field contextView = actionBar.getClass().getDeclaredField("mContextView");
        animateActionMode((View) contextView.get(actionBar), colorFrom, colorTo, duration);
    } catch (final Exception ignored) {
        // Nothing to do
    }
}

private void animateActionMode(final View actionMode, final int from, int to, int duration) {
    final ValueAnimator va = ValueAnimator.ofObject(new ArgbEvaluator(), from, to);
    final ColorDrawable actionModeBackground = new ColorDrawable(from);
    va.addUpdateListener(new AnimatorUpdateListener() {

        @Override
        public void onAnimationUpdate(final ValueAnimator animator) {
            actionModeBackground.setColor((Integer) animator.getAnimatedValue());
            actionMode.setBackground(actionModeBackground);
        }

    });
    va.setDuration(duration);
    va.start();
}

結果

Color.BLACKからまでのアニメーション結果の gif は次Color.BLUE2500とおりです。

例

于 2014-05-05T00:13:47.940 に答える