Android 不带动画的bottomSheetBehavior设置状态
我用design library23.0.2尝试了新的Android 不带动画的bottomSheetBehavior设置状态,android,android-design-library,android-coordinatorlayout,bottom-sheet,Android,Android Design Library,Android Coordinatorlayout,Bottom Sheet,我用design library23.0.2尝试了新的bottomsheetbehavior,但我认为它太有限了。当我使用setState()方法更改状态时,底部页面使用ad动画移动到新状态 如何在没有动画的情况下立即更改状态?我没有看到一个公共方法可以做到这一点。不幸的是,看起来你不能。调用BottomSheetBehavior的setState以同步或异步调用开始设置动画(子对象、状态)结束。而且无法覆盖这些方法,因为setState是最终的,并且startSettingAnimation具
bottomsheetbehavior
,但我认为它太有限了。当我使用setState()
方法更改状态时,底部页面使用ad动画移动到新状态
如何在没有动画的情况下立即更改状态?我没有看到一个公共方法可以做到这一点。不幸的是,看起来你不能。调用
BottomSheetBehavior
的setState
以同步或异步调用开始设置动画(子对象、状态)
结束。而且无法覆盖这些方法,因为setState
是最终的,并且startSettingAnimation
具有包可见修改器。查看来源以了解更多信息
我也有同样的问题,但方式有点不同-在结算动画调用之前,我的UI状态将
sethidable
更改为false,因此我得到了IllegalStateException
。我将考虑使用<代码> ButoSoeTeCalBeuts<代码>来正确地处理这个问题。 如果你真的需要它,那么你可以求助于反射:
fun BottomSheetBehavior.getViewDragHelper(): ViewDragHelper? = BottomSheetBehavior::class.java
.getDeclaredField("viewDragHelper")
.apply { isAccessible = true }
.let { field -> field.get(this) as? ViewDragHelper? }
fun ViewDragHelper.getScroller(): OverScroller? = ViewDragHelper::class.java
.getDeclaredField("mScroller")
.apply { isAccessible = true }
.let { field -> field.get(this) as? OverScroller? }
然后,当状态更改时,可以使用这些扩展方法:
bottomSheetBehavior.setBottomSheetCallback(object : BottomSheetCallback() {
override fun onSlide(view: View, offset: Float) {}
override fun onStateChanged(view: View, state: Int) {
if (state == STATE_SETTLING) {
try {
bottomSheetBehavior.getViewDragHelper()?.getScroller()?.abortAnimation()
} catch(e: Throwable) {}
}
}
})
我要补充的是,代码并不完美,每次状态更改时获取字段的效率不高,这是为了简单起见。如果要删除显示/关闭动画,可以使用
dialog.window?.setWindowAnimations(-1)
。例如:
class MyDialog(): BottomSheetDialogFragment() {
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
val dialog = super.onCreateDialog(savedInstanceState)
dialog.window?.setDimAmount(0f) // for removing the dimm
dialog.window?.setWindowAnimations(-1) // for removing the animation
return dialog
}
}
当我调用setState()以展开时,我会得到动画,但对于STATE_COLLAPSED,我不会得到它。这让我很困惑。Android issuetracker上的相应问题好吧,在他们添加它之前,这是有效的。