在我的应用程序中,我使用了一个底部工作表(来自支持库),效果很好。现在,我想在向上拖动工作表时为布局更改设置动画。为此,我创建了 BottomSheetCallback
的子类(这通常是 Fragment 的内部类,因此并非所有在此 calss 中使用的对象都在此处初始化):
public class MyBehavior extends BottomSheetBehavior.BottomSheetCallback {
Transition transition;
float lastOffset = 0;
Scene scene;
public PlayerBehavior() {
TransitionInflater inflater = TransitionInflater.from(getContext());
transition = inflater.inflateTransition(R.transition.player);
//transition.setDuration(300);
scene = fullLayout;
transition.setInterpolator(new Interpolator() {
@Override
public float getInterpolation(float v) {
return lastOffset;
}
});
}
@Override
public void onStateChanged(@NonNull View bottomSheet, int newState) {
if(newState == BottomSheetBehavior.STATE_DRAGGING) {
TransitionManager.go(scene, transition);
}
}
@Override
public void onSlide(View bottomSheet, final float slideOffset) {
scene = (slideOffset > lastOffset) ? smallLayout : fullLayout;
lastOffset = slideOffset;
}
}
如您所见,我还从不同的布局文件创建了两个 Scene
和一个自定义 Transition
以使用 TransitionManager
在场景之间制作动画。 My problem is that the Transition
should be based on the slideOffset
parameter (in range of 0-1) but the TransitionManager
uses the Animation
后台类,在 Android 中通常是基于时间的。
我尝试创建自定义 Intapolator,但这无法正常工作。那么我如何创建一个基于外部变量而不是时间的 Transition
呢?
原文由 Cilenco 发布,翻译遵循 CC BY-SA 4.0 许可协议
根据您的描述,我认为您正在尝试实现类似 google maps bottom sheet 的行为。布局随着 bottomsheet 被向上拖动而改变。
如果这是您想要实现的目标,那么您不需要强制执行自定义动画,因为 bottomsheetdialog 本身在合并到父 Coordinator Layout 中时具有这些动画行为。
这是我如何实现相同行为的示例代码。当 bottomsheet 被拖动到全屏大小时,它也会使 FloatingActionButton 不可见:
希望这可以解决您要实现的目标。