在AppCompat v23中禁用ActionMode的动画效果

3
在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

4个回答

4

我曾经也遇到了同样的问题。我是这样解决的:

1)显示操作模式:我没有禁用淡入动画,而是将操作栏的颜色设置为与操作模式相同的颜色。

2)隐藏操作模式:为了禁用淡出效果,在onDestroyActionMode中只需进行以下调用:

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

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

1
我也发现了这个问题,并想提出另一种解决方案:尝试动画化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();

希望这能帮助其他人!

0

在调用startSupportActionMode后,如果想不带动画显示上下文操作栏(CAB),请添加以下代码:

ViewCompat.animate(mode?.customView?.parent as View).alpha(0f)

隐藏 CAB 而不带动画:
override fun onDestroyActionMode(mode: ActionMode?) {
    (mode?.customView?.parent as View).visibility = View.GONE
}

这需要使用自定义视图来替代菜单,以便在CAB中实现。

0

自定义视图的解决方案。

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

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


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