android 触摸监听重写_Android 触摸事件监听(Activity层,ViewGroup层,View层)详细介绍...

本文详细介绍了Android中不同层次的触摸事件监听处理,包括Activity层、ViewGroup层和View层。讲解了如何在Activity级别实现右滑返回功能,注意事项如设置滑动阈值、防止回滑等。还讨论了如何在ViewGroup和View中处理触摸事件,以及在有子View交互的情况下如何协调。文章提供了具体的代码示例,帮助开发者理解和实现触摸事件监听。
摘要由CSDN通过智能技术生成

Android不同层次的触摸事件监听

APP开发中,经常会遇到有关手势处理的操作,比如向右滑动返回上一个页面。关于触摸事件的处理,我们可以大概处理在不同的层次上。

Activity层:可以看做触摸事件获取的最顶层

ViewGroup层:ViewGroup层可以自主控制是否让子View获取触摸事件

View层:可以决定自己是否真正的消费触摸事件,如果不消费抛给上层ViewGroup

Activity级别的手势监听:(右滑动返回上层界面)

Activity层手势监听的使用场景:一般用于当前页面中没有过多的手势需要处理的时候,至多存在点击事件。对于右滑返回上层界面这种需求,可以将其定义在一个BaseActivity中,子Activity如果需要实现,通过某个开关打开即可。

注意事项 :

1、Activity层,用dispatch可以抓取所有的事件 。

2、对于滑动,要设定一个距离阈值mDistanceGat,用于标记手势是否有效,并且注意往回滑动的处理。

3、如果底层存在点击Item,为了防止滑动过程中变色,可以适时地屏蔽触摸事件:手动构造Cancle事件主动下发,这是为了兼容最基本的点击效果,不过,满足点击的手势判定前, Move事件要正常下发。具体实现如下:

@Override

public boolean dispatchTouchEvent(MotionEvent event) { case MotionEvent.ACTION_MOVE:

if (Math.abs(event.getX() - down_X) > 10

&& flagDirection == MotionDirection.HORIZION) {

MotionEvent e = MotionEvent.obtain(event.getEventTime(),

event.getEventTime(),

MotionEvent.ACTION_CANCEL,

event.getX(),

event.getY(), 0);

super.dispatchTouchEvent(e);

} else {

super.dispatchTouchEvent(event);//不符合条件正常下发

}

4、防止手势的往回滑动,最好利用GestureDectetor来判断,如果存在往回滑动,则手势无效,使用方式如下:

mDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {

@Override

public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {

if (!slideReturnFlag && distanceX > 5) {

slideReturnFlag = true;

}}

5、如何处理Up事件:dispatch是否往下派发。具体的做法是,根据手势是否有效,如果手势无效,那么Up肯定是需要往下派发的。如果有效,根据后续操作进行,因为有时候为了防止子View获取到不必要的点击事件。具体实现如下

@Override

public boolean dispatchTouchEvent(MotionEvent event) {

case MotionEvent.ACTION_UP:

if (mGestureListener != null && !slideReturnFlag

&& flagDirection == MotionDirection.HORIZION) {

if (stateMotion == CurrentMotio

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值