【问题标题】:Disable Animation for ActionMode in AppCompat v23在 AppCompat v23 中禁用 ActionMode 的动画
【发布时间】:2021-08-25 09:19:34
【问题描述】:

在 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 动画吗?

在两种颜色之间复制相同的效果对我来说也是一种替代方法,但如前所述,感觉不一样...

谢谢,安德里亚

【问题讨论】:

    标签: android animation


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      希望这对其他人有帮助!

      【讨论】:

        【解决方案3】:

        自定义视图的解决方案。

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

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

        【讨论】:

          【解决方案4】:

          要显示无动画的上下文操作栏 (CAB),请在调用 startSupportActionMode 后添加:

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

          隐藏没有动画的 CAB:

          override fun onDestroyActionMode(mode: ActionMode?) {
              (mode?.customView?.parent as View).visibility = View.GONE
          }
          

          这需要为 CAB 使用 customView 而不是使用菜单。

          【讨论】:

            猜你喜欢
            • 2016-06-11
            • 2015-11-26
            • 1970-01-01
            • 2015-11-12
            • 2015-01-15
            • 1970-01-01
            • 1970-01-01
            • 2015-03-15
            • 1970-01-01
            相关资源
            最近更新 更多