如何为ActionBar的ActionMode动画背景?

6

背景

可以更改操作栏(Action Bar)的背景,甚至可以在两种颜色之间进行动画效果,如下所示:

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();
}

问题

我找不到一种方法来获取操作模式的视图,以便在某些情况下(当它显示时)更改其背景。

我的尝试

我唯一找到的是一个hack-y方法,它假设操作模式的id将保持不变,即使这只能用于“完成”按钮的视图(看起来像“V”的那个,实际上更像是“取消”)。

我还发现可以通过主题更改它,但这不是我需要的,因为我需要在程序中动态更改。

问题

如何获取操作模式的视图,或者更准确地说,如何使用动画更改其背景?


请查看此链接:http://cyrilmottier.com/2012/11/27/actionbar-on-the-move/ - Zohra Khan
@ZohraKhan 正如我之前提到的,我知道如何更改操作栏的背景。我想知道如何更改其ActionMode的背景。 - android developer
1个回答

11

如何获取actionMode的视图,或者更准确地说,如何使用动画更改其背景?

很遗憾,您有两个选择,但都不涉及本地ActionMode API:

ActionBarContextView负责控制ActionMode

  1. 使用Resources.getIdentifier调用Activity.findViewById并传入系统用于ActionBarContextView的ID
  2. 使用反射访问ActionBarImpl中的Field

以下是两种方法的示例:

使用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.BLACKColor.BLUE的过渡效果,持续时间为2500

Example


标题布局?这只是文本显示区域(在您的图像中为“文本选择”)吗? - android developer
那它几乎没用了...有没有其他的方法可以克服这个问题? - android developer
@androiddeveloper 不,据我所知没有。 - adneal
1
你可能会忘记上下文视图设置为可访问(contextView.setAccessible(true)); - Volodymyr Machekhin
Resources.getIdentifier 对我不起作用,但是 reflection 可以。 但请记住这一行代码:contextView.setAccessible(true); 除非它抛出 IllegalAccessExceptions 异常。 - Phong Nguyen
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接