MotionLayout - OnSwipe 不适用于可点击的子项

7 android android-animation android-touch-event android-swipe android-motionlayout

我遇到了一个问题MotionLayout,如果用户在可点击的项目上开始滑动,则无法向上/向下滑动。我希望用户能够在屏幕的任何部分上滑动,并触发滑动过渡。

基本上,该行为与 Android 版 Yelp 应用程序当前的行为非常相似。在屏幕上的任意位置向上滑动会将搜索栏移动到屏幕顶部。请观看有关滑动行为的视频。

我的转换代码如下所示:

<Transition
    app:constraintSetStart="@id/start"
    app:constraintSetEnd="@id/end"
    >
    <OnSwipe
        app:dragDirection="dragUp"
        app:onTouchUp="decelerate"
        />
</Transition>
Run Code Online (Sandbox Code Playgroud)

我的代码看起来MotionLayout像这样:

<androidx.constraintlayout.motion.widget.MotionLayout
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     app:layoutDescription="@xml/motion_scene">
     >

     <!-- other views -->

     <LinearLayout
        android:orientation="vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        >

        <TextView
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@string/title"
           android:textColor="@color/black"
           android:textSize="14sp"
           android:lineSpacingExtra="7sp"
           android:fontFamily="@font/avenir"
           android:layout_marginBottom="16dp"
           />

       <GridView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:numColumns="2"
            android:verticalSpacing="8dp"
            android:horizontalSpacing="12dp"
            android:stretchMode="columnWidth"
            tools:listitem="@layout/griditem" <!-- This layout file contains a single <Button/> -->
            />
    </LinearLayout>
</androidx.constraintlayout.motion.widget.MotionLayout>
Run Code Online (Sandbox Code Playgroud)

以下是我尝试过但无法正常工作的所有内容:

  1. 覆盖可点击视图的onInterceptTouchEventViewGroup视图(此处仅返回 true 将导致我想要的滑动行为,但随后应该可点击的子视图不再可点击。)
override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
    if (ev?.action == MotionEvent.ACTION_DOWN) {
        onTouchEvent(ev)
        return false
    }
    return true
}
Run Code Online (Sandbox Code Playgroud)
  1. onTouchEvent在可点击的子视图中覆盖
override fun onTouchEvent(event: MotionEvent?): Boolean {
    if (event?.action == MotionEvent.ACTION_DOWN) {
        super.onTouchEvent(event)
        return false
    }
    return super.onTouchEvent(event)
}
Run Code Online (Sandbox Code Playgroud)
  1. 覆盖onInterceptTouchEventMotionLayout
override fun onInterceptTouchEvent(event: MotionEvent?): Boolean {
    if (event?.action == MotionEvent.ACTION_MOVE) {
        return super.onInterceptTouchEvent(event)
    }
    return false
}
Run Code Online (Sandbox Code Playgroud)

我已经查看了所有这些 StackOverflow 帖子(以及更多帖子,但这些是最相关的):

关于我可以在这里做什么以便能够滑动和单击项目有什么想法吗?

小智 3

我成功了。这里有两件事有帮助:

  1. 我使用 GridLayoutManager 将 GridView 切换为 RecyclerView,并设置app:touchAnchorId为 RecyclerView 的 id。
  2. 实际上,我在 MotionScene 文件中有两个过渡,另一个过渡(不是 OnSwipe)是第一个。MotionScene 文件中的顺序很重要。我调换了两个转换的顺序,然后就开始工作了。但是,一旦触发其他转换,它将停止工作,因此我必须setTransition在适当的时候将转换重置回 OnSwipe 转换。

我希望这可以帮助遇到这个问题的人。


归档时间:

查看次数:

4763 次

最近记录:

5 年,8 月 前