【问题标题】:How to disable android snackbar opening animation from bottom screen如何从底部屏幕禁用 android 小吃店打开动画
【发布时间】:2016-09-05 21:32:09
【问题描述】:

我正在使用来自 GITHUB 的 CustomSnackBar 库,

检查这个:https://github.com/TakeoffAndroid/CustomSnackBar/blob/master/app/src/main/java/com/takeoffandroid/customsnackbar/SnackBar.java

这对于自定义我的小吃店非常有用。

但我想禁用小吃店打开动画,现在它从底部屏幕打开并有一定的持续时间(Y 平移)。

有什么方法可以在没有动画的情况下显示快餐栏或禁用动画或将动画持续时间减少到 0(零)??

  • Android Studio 版本:2.1
  • 编译SdkVersion 23
  • buildToolsVersion "23.0.3"
  • 设计库:com.android.support:design:23.3.0 提前致谢,

【问题讨论】:

    标签: android androiddesignsupport android-snackbar


    【解决方案1】:

    使用当前版本 (design-24.1.0),简单的修复看起来不可能,但有办法破解它(见下文)

    Snackbar内部,调用showView方法来显示snackbar

    final void showView() {
        [...]
    
        if (ViewCompat.isLaidOut(mView)) {
            if (shouldAnimate()) {
                // If animations are enabled, animate it in
                animateViewIn();
            } else {
                // Else if anims are disabled just call back now
                onViewShown();
            }
        }
    
        [...]
    }
    
    private boolean shouldAnimate() {
            return !mAccessibilityManager.isEnabled();
    }
    

    showView 是最终的,所以我们不能做任何事情,而且我们不能触及任何决定小吃栏是否应该动画的代码。

    关于动画本身,方法 animateViewInanimateViewOut 都是私有的,里面的所有代码都依赖于私有字段或常量

    编辑:

    我模拟没有动画的方法是处理 Snackbar 的可见性

    Snackbar snackbar = Snackbar.make(view, message, Snackbar.LENGTH_INDEFINITE);
    
    snackbar.getView().setVisibility(View.INVISIBLE);
    
    [...]
    
    snackbar.setCallback(new Snackbar.Callback() {
          @Override
          public void onShown(Snackbar snackbar) {
            super.onShown(snackbar);
    
            snackbar.getView().setVisibility(View.VISIBLE);
          }
        });
    
    snackbar.show();
    

    因为在我的情况下,我可以控制何时关闭 Snackbar,所以我可以这样做

      snackbar.getView().setVisibility(View.GONE);
    
      snackbar.dismiss();
    

    不幸的是,我认为最后一步对于不确定的 Snackbar 来说并不容易。解决此问题的一种方法是在 LENGTH_SHORT 和 LENGTH_LONG

    期间安排 setVisibility(View.INVISIBLE)

    SnackbarManager 中。我们无法访问常量,但我们可以复制和粘贴

    private static final int SHORT_DURATION_MS = 1500;
    private static final int LONG_DURATION_MS = 2750;
    

    然后在您的代码中,Callback.onShown()

    handler.postDelayed(new Runnable() {
              @Override
              public void run() {
                snackbar.getView().setVisibility(View.INVISIBLE);
              }
            }, LONG_DURATION_MS or SHORT_DURATION_MS)
    

    我自己没有测试过,也许应该在onShown之前调用它。如果有人尝试过,请编辑帖子或在 cmets 中告诉我。

    【讨论】:

    • 好一个。马拉格斯
    【解决方案2】:

    对于 kotlin 用户,您可以尝试以下代码:

    showError(message: String, viewGroup: ViewGroup) {
    
    val duration: Long = 2000
    
    val snackBar = Snackbar.make(viewGroup, message, duration.toInt())
    snackBar.withColor(ContextCompat.getColor(this, com.sdei.sdeiarchitecture.R.color.colorAccent))
    
    val params = snackBar.view.layoutParams as FrameLayout.LayoutParams
    params.gravity = Gravity.TOP
    snackBar.view.layoutParams = params
    
    val messageTv = snackBar.view.findViewById(com.google.android.material.R.id.snackbar_text) as TextView
    messageTv.textSize = 20.0f
    
    snackBar.view.visibility = View.INVISIBLE
    snackBar.addCallback(object : Snackbar.Callback() {
        override fun onShown(snackbar: Snackbar?) {
            super.onShown(snackbar)
            snackbar!!.view.visibility = View.VISIBLE
            Handler().postDelayed({
                snackbar.view.visibility = View.INVISIBLE
            }, duration)
        }
    })
    
    snackBar.show()
    
    }
    

    希望对你有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-13
      • 1970-01-01
      • 1970-01-01
      • 2011-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多