如何从底部屏幕禁用 android 小吃店打开动画
How to disable android snackbar opening animation from bottom screen
我正在使用 GITHUB 中的 CustomSnackBar 库,
这对自定义我的小吃店非常有用。
但我想禁用 snackbar 打开动画,现在它从底部屏幕打开有一些持续时间(Y- 翻译)。
有什么方法可以显示没有动画的小吃店或禁用动画或将动画持续时间减少到 0(零)??
- Android工作室ver:2.1
- compileSdkVersion 23
- buildToolsVersion“23.0.3”
- 设计库:com.android.support:design:23.3.0
提前致谢,
对于当前版本 (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 是最终的,所以我们不能做任何事情,而且我们不能触及任何确定是否应该为 snackbar 设置动画的代码。
关于动画本身,方法animateViewIn和animateViewOut都是私有的,里面的所有代码都依赖私有字段或者常量
编辑:
我模拟没有动画的方法是处理 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之前调用。如果有人尝试过,请编辑 post 或在评论中告诉我。
对于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()
}
希望对您有所帮助。
我正在使用 GITHUB 中的 CustomSnackBar 库,
这对自定义我的小吃店非常有用。
但我想禁用 snackbar 打开动画,现在它从底部屏幕打开有一些持续时间(Y- 翻译)。
有什么方法可以显示没有动画的小吃店或禁用动画或将动画持续时间减少到 0(零)??
- Android工作室ver:2.1
- compileSdkVersion 23
- buildToolsVersion“23.0.3”
- 设计库:com.android.support:design:23.3.0 提前致谢,
对于当前版本 (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 是最终的,所以我们不能做任何事情,而且我们不能触及任何确定是否应该为 snackbar 设置动画的代码。
关于动画本身,方法animateViewIn和animateViewOut都是私有的,里面的所有代码都依赖私有字段或者常量
编辑:
我模拟没有动画的方法是处理 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之前调用。如果有人尝试过,请编辑 post 或在评论中告诉我。
对于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()
}
希望对您有所帮助。