onTouchEvent方法中MotionEvent.CANCEL动作分析和遇到

在监听手指滑动的时候,会有两个方法可选onTouch方法和onTouchEvent方法.

简单记录下两个方法的区别:
onTouch方法:onTouch方法是View的 OnTouchListener借口中定义的方法。当一个View绑定了OnTouchLister后,当有touch事件触发时,就会调用onTouch方法。(当把手放到View上后,onTouch方法被一遍一遍地被调用)

2.onTouchEvent方法:onTouchEvent方法是override 的Activity的方法。重新了Activity的onTouchEvent方法后,当屏幕有touch事件时,此方法就会别调用。(当把手放到Activity上时,onTouchEvent方法就会一遍一遍地被调用)


当给一个view添加了onTouch事件的监听后,事件首先是onTouch方法执行,如果onTouch返回值为true,表示这个touch事件被onTouch方法处理完毕,不会把touch事件再传递给Activity,也就是说onTouchEvent方法不会被调用,如果onTouch的返回值是false,表示这个touch事件没有被view完全处理,onTouch返回以后,touch事件被传递给Activity,onTouchEvent方法被调用。PS:当返回的是super.onTouchEvent(event)的值时,会执行onTouchEvent方法。

言归正传,onTouchEvent作为监听手指滑动的方法,常用的就是MotionEvent.ACTION_DOWN,MotionEvent.ACTION_MOVE,MotionEvent.ACTION_UP三个动作,通过getAction()获取状态并做处理,处理完成后会return true,表示该动作已经处理完成,如果return false会让事件会回传到父控件来处理。

MotionEvent.ACTION_CANCEL根据官方的文档,讲的是当前手势被释放,你将不会接收到其他的事件,应该向ACTION_UP一样对待它。在使用时,会发现在滑动时,滑动到某些区域会直接获取MotionEvent.ACTION_CANCEL动作,但是实际上手指还在屏幕上,没有移开,根据说明是父控件截断了事件的传递,那个就修改父控件的onInterceptTouchEvent方法,直接返回false,让事件传递下去,不要被拦截。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
我不知道具体情况,但是重写 RecyclerView onTouchEvent 通常是为了实现一些特殊的触摸行为,比如滑动删除、拖拽排序等。以下是可能的一些代码实现: 1. 滑动删除 ``` @Override public boolean onTouchEvent(MotionEvent e) { switch (e.getAction()) { case MotionEvent.ACTION_DOWN: mIsSwiping = false; mDownX = e.getX(); mDownY = e.getY(); return super.onTouchEvent(e); case MotionEvent.ACTION_MOVE: float dx = e.getX() - mDownX; float dy = e.getY() - mDownY; if (Math.abs(dx) > mTouchSlop && Math.abs(dy) < mTouchSlop) { mIsSwiping = true; int position = getChildAdapterPosition(findChildViewUnder(e.getX(), e.getY())); if (position != RecyclerView.NO_POSITION) { mSwipePosition = position; } } return super.onTouchEvent(e); case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: if (mIsSwiping) { if (dx > 0) { // swiped right, perform delete action mAdapter.deleteItem(mSwipePosition); } else { // swiped left, reset item view mAdapter.notifyItemChanged(mSwipePosition); } mIsSwiping = false; mSwipePosition = RecyclerView.NO_POSITION; return true; } return super.onTouchEvent(e); } return super.onTouchEvent(e); } ``` 2. 拖拽排序 ``` @Override public boolean onTouchEvent(MotionEvent e) { switch (e.getAction()) { case MotionEvent.ACTION_DOWN: mDragPosition = getChildAdapterPosition(findChildViewUnder(e.getX(), e.getY())); if (mDragPosition != RecyclerView.NO_POSITION) { mDraggedViewHolder = getChildViewHolder(findChildViewUnder(e.getX(), e.getY())); mDragStartX = mDraggedViewHolder.itemView.getX(); mDragStartY = mDraggedViewHolder.itemView.getY(); mDragStartTouchX = e.getX(); mDragStartTouchY = e.getY(); if (mItemTouchHelper != null) { mItemTouchHelper.startDrag(mDraggedViewHolder); } } return super.onTouchEvent(e); case MotionEvent.ACTION_MOVE: return mDraggedViewHolder != null && mItemTouchHelper != null && mItemTouchHelper.onTouchEvent(e); case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: if (mDraggedViewHolder != null) { mDraggedViewHolder.itemView.animate().x(mDragStartX).y(mDragStartY).setDuration(150).start(); mDraggedViewHolder = null; mDragPosition = RecyclerView.NO_POSITION; return true; } return super.onTouchEvent(e); } return super.onTouchEvent(e); } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值