在AppCompat v23中为ActionMode禁用动画

时间:2015-09-06 17:55:38

标签: android animation

在AppCompat的第23版中,为ActionMode引入了淡入/淡出动画,但我需要禁用它。

动机:我改变了TabLayout的背景颜色,我无法重现同样的淡入淡出动画,所以它看起来很奇怪。我尝试使用ObjectAnimator,但它不像新的AppCompat v23那样具有正确的“alpha”效果。

根据这里appcompat-v7 v23.0.0 statusbar color black when in ActionMode(来自Mattia的答案),似乎动画是用Java创建的(因此无法覆盖“anim”文件夹中的xml):

mFadeAnim = ViewCompat.animate(mActionModeView).alpha(0f);

有关如何禁用新ActionMode动画的任何想法吗?

在两种颜色之间再现相同的效果对我来说也是另一种选择,但如前所述,它感觉不一样......

谢谢,Andrea

3 个答案:

答案 0 :(得分:3)

我遇到了同样的问题。我这样解决了:

1)显示actionmode:我不禁用fadein动画:我只是将actionbar的颜色设置为与actionmode相同的颜色。

2)隐藏动作模式:为了禁用fadingout,我只需在onDestroyActionMode中进行此调用:

findViewById(R.id.action_mode_bar).setVisibility(View.INVISIBLE);

不要忘记在此之后将之前的颜色设置为操作栏。

答案 1 :(得分:0)

我也发现了这个问题,我想提出另一种解决方案:尝试使TabLayout背景颜色更改动画化,与ActionMode同步。

    int colorFrom;
    int colorTo;

    TypedValue colorPrimaryTypedValue = new TypedValue();
    TypedValue actionModeBackgroundTypedValue = new TypedValue();
    getActivity().getTheme().resolveAttribute(R.attr.colorPrimary, colorPrimaryTypedValue, true);
    getActivity().getTheme().resolveAttribute(R.attr.actionModeBackground, actionModeBackgroundTypedValue, true);

    if (actionModeVisible) {
        colorFrom = colorPrimaryTypedValue.data;
        colorTo = actionModeBackgroundTypedValue.data;
    } else {
        colorFrom = actionModeBackgroundTypedValue.data;
        colorTo = colorPrimaryTypedValue.data;
    }


    ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), colorFrom, colorTo);
    colorAnimation.setDuration(350); // milliseconds
    colorAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

        @Override
        public void onAnimationUpdate(ValueAnimator animator) {
            mTabLayout.setBackgroundColor((int) animator.getAnimatedValue());
        }

    });
    colorAnimation.start();

希望这对其他人有帮助!

答案 2 :(得分:0)

自定义视图的解决方案。

@Override
public void onDestroyActionMode(ActionMode mode) {
   ((View) mode.getCustomView().getParent()).setVisibility(View.INVISIBLE);
}

启动操作模式时,必须将回调实现传递给它。此回调的方法之一是onDestroyActionMode。在此方法中,您将收到ActionMode的实例。这样,您可以访问在其上设置的自定义视图并隐藏其父容器。