2

我注意到到目前为止所有的 MotionLayouts 总是捕捉到它们的一个最终状态,即使你在动画的中途拖动一个视图,停止,然后放手。我想要实现的是让motionlayout 只对用户交互和动量起作用。如果用户在动画中间放开,它应该在动量用完后完全停止,并且不会继续插值直到明确定义的状态,这是默认行为。

列表、滚动视图、coordinatorlayouts 都支持这种“中途”停止,那么为什么不支持motionlayout呢?

那么有谁知道如何冻结状态之间运动布局的进度?它应该适用于时间线上的任何位置,所以我不想添加额外的状态,因为它需要 100 个状态。

4

2 回答 2

8

添加一个onTouchUp到您的OnSwipe. stop可能是你想要的。decelerate似乎是越野车。无论如何,如果它连接到滚动视图,则停止更多的是减速,因为视图将提供自己的减速。

    <OnSwipe
        app:dragDirection="dragUp"
        app:onTouchUp="stop"
        app:touchAnchorId="@id/scrollView"
        app:touchAnchorSide="top" />

在这里找到这个:https ://mikescamell.com/motionlayoutquickie-ontouchup/

于 2019-06-04T09:34:39.240 回答
0

您可以使用motionLayout.setProgress()方法设置位置,并在转换发生变化或松开手指时执行此操作 - 在 OnTouch 方法中的 MotionEvent.ACTION_UP 上。

第一个变体:

motionLayout.setTransitionListener(new MotionLayout.TransitionListener() {

        // Other methods

        @Override
        public void onTransitionChange(MotionLayout motionLayout, int i, int i1, float v) {
            // v == motionLayout.getProgress();
            motionLayout.setProgress(v);
        }

        // Other methods
    });

第二种变体:

if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
    motionLayout.setProgress(motionLayout.getProgress());
}
于 2019-03-18T23:08:18.763 回答