【问题标题】:ClickListener added to view of MotionLayout prevents layout from responding to events将 ClickListener 添加到 MotionLayout 的视图可防止布局响应事件
【发布时间】:2021-01-07 06:19:54
【问题描述】:

我在 MotionLayout 中有 ImageView,用于动画在屏幕上移动 ImageView。我还想在 ImageView 中添加一个 ClickListener,这样当 ImageView 被简单地点击/轻敲而不是移动时就可以发挥作用。

我按照here 的建议编写了一个仅处理ACTION_MOVE 的自定义 MotionLayout,但在 onCreate() 中将 ClickListener 添加到 ImageView 后,只有 ClickListener 代码会运行,而 MotionLayout 不会响应。我也尝试过在自定义 ImageView 中覆盖 onTouchEvent() 但没有奏效。

自定义 MotionLayout 内部

       <FrameLayout
            android:id="@+id/bottomCard"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <TapImageView
                android:id="@+id/bottom"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:scaleType="fitXY" />
        </FrameLayout>

        <FrameLayout
            android:id="@+id/topCard"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <TapImageView
                android:id="@+id/top"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:scaleType="fitXY" />
        </FrameLayout>

自定义 ImageView 内部

override fun onTouchEvent(event: MotionEvent?): Boolean {
        when (event?.action) {
            MotionEvent.ACTION_UP -> {
                super.onTouchEvent(event)
                Toast.makeText(context, "Works", Toast.LENGTH_LONG)
                    .show()
                return false
            }

        }
        return super.onTouchEvent(event)
    }

我也尝试过活动 onCreate()

  binding.topCard.setOnClickListener {
            Toast.makeText(applicationContext, "Works", Toast.LENGTH_LONG)
                .show()
        }

感谢您的关注!

【问题讨论】:

    标签: android xml kotlin animation clicklistener


    【解决方案1】:

    如果您有自己的 Click 侦听器,则需要从中启动转换。 如果按钮不仅仅是动画。您可能想要对动画做出一些决定。 从 motionScene 中删除 并添加 motionLayout.transitionToState(R.id.mystate);到您的点击处理程序

    【讨论】:

      【解决方案2】:

      显然,当 MotionEvent 正在拖动时,它不应该让子视图消费该事件,所以。我将motionevent截取为底层代码。它有效。

       private var touchDownX = 0f
      private var touchDownY = 0f
      private var mScrolling = false
      private val touchSlop = ViewConfiguration.get(context).scaledTouchSlop
      
      override fun onInterceptTouchEvent(event: MotionEvent): Boolean {
          when (event.action) {
              MotionEvent.ACTION_DOWN -> {
                  touchDownX = event.x
                  touchDownY = event.y
                  mScrolling = false
              }
              MotionEvent.ACTION_MOVE -> mScrolling = abs(touchDownY - event.y) >= touchSlop
              MotionEvent.ACTION_UP -> mScrolling = false
          }
          return if (mScrolling) true else super.onInterceptTouchEvent(event)
      }
      

      【讨论】:

        猜你喜欢
        • 2020-08-04
        • 2011-05-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多