android焦点分发无法获取到Down事件,却有Move和Up

博客探讨了在Android中,当焦点分发时遇到Down事件无法获取,但Move和Up事件正常的情况。通过分析父View的onInterceptTouchEvent和子View的onTouchEvent,解释了Down事件被消费和滑动事件的处理。当底层布局为ScrollView时,即使没有消费Down事件,也会出现Move和Up,因为ScrollView默认会处理Down事件。返回true会导致ScrollView无法滑动,正确的做法是return super.onTouchEvent()。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

**首先:在父view里面重新拦截方法,判断他是一个滑动事件的时候return true,将事件拦截给自己的ontouchEvent。

**

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
switch (event.getAction()) {重点内容
case MotionEvent.ACTION_DOWN:
startY = (int) event.getRawY();
case MotionEvent.ACTION_MOVE:
endY = (int) event.getRawY();
if (Math.abs(Math.abs(startY) - Math.abs(endY)) < 10) {
return super.onInterceptTouchEvent(event);
} else {
return true;
}
case MotionEvent.ACTION_UP:
startY = (int) event.getRawY();
break;
case MotionEvent.ACTION_CANCEL:
startY = (int) event.getRawY();
break;
default:
break;
}
return super.onInterceptTouchEvent(event);
}

然后:再重写onTouchEvent

@Override
public boolean onTouchEvent(MotionEvent ev) {
// TODO Auto-generated method stub
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
打印down
break;
case MotionEvent.ACTION_MOVE:
打印move
break;
case MotionEvent.ACTION_UP:
打印up
break;
default:
break;
}
return super.onTouchEvent(ev);
}

此时发现运行滑动屏幕只有down事件,因为没有消费down事件不会有move和up事件产生。 所以我们把布局改成中间放一个有点击事件的button,如下:

这里写图片描述

此时如果点击button以外的部分滑动一段距离,发现依然只有down,因为没人消费down事件。 此时如果点击button滑动一段距离,发现底层的布局打印出了move和up,并没有down。 原因是:button要消费这个down事件所以产生了move和up,但是当你滑动一段距离时,down是给了button消费了,产生的move和up被拦截给了底层的布局

**

这时候有特殊的情况,比如底层布局是一个ScrollView:

你会发现,此时如果点击button以外的部分滑动一段距离,发现有down,move和up,并没有view去消费这个down,为何会有move和up? 其实这个问题很简单,因为scrollview是可以点击的,也就是clickable = true的。其实默认的scrollview自动就是消费了这个down,所以会有move和up. 此时如果点击button滑动一段距离,发现底层的布局打印出了move和up,并没有down。原因是一样的,button消费了down,拦截给底层后,已经没有down了,只剩下move和up。

既然ScrollView是自己就有消费down,那么我在ontouchevent里面return true会怎样呢? 结果就是ScrollView无法滑动了。因为滑动是写在 super.onTouchEvent();里面的。只有return super.onTouchEvent();才能滑动。

**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值