一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第N天,点击查看活动详情。
1.clipChildren属性介绍
来自ViewGroup中的属性clipChildren用于定义一个子元素是否被限制在其父元素中进行绘制。通常用于动画效果中绘制需要超出原有尺寸限制的元素时使用。在这种情况下,需要将该属性值设置为false以确保该元素可以超出边界。缺省值为true,也即子元素不可以超出父元素的边界。
2.超出父View的子View的点击事件
一般可以在爷View上通过onTouchListener()方法把事件传给子View,前提是子View没有超过爷View。
如果不行就在爷View上通过onTouchListener()方法把方法传给子View
3.在RecyclerView里面用clipChildren属性
有个这样子的需求,每个item有个超过父类的的气泡框显示,这时候点击事件很难用onTouchListener处理。
因为点击第二个气泡时,点击事件无法判断分发给第一个item还是第二个item。
解决方法:
1.继承RecyclerView,重写onInterceptTouchEvent(),遍历item获取气泡相对于屏幕的位置再判断事件是否在气泡框范围内
2.在activity中重写dispatchTouchEvent(),先判断点击事件是否在RecyclerView里面,再遍历item获取气泡相对于屏幕的位置
基本逻辑都是一样的
if (e.getAction() == MotionEvent.ACTION_UP) {
// 判断每个气泡的位置,然后在位置范围内就处方点击事件
int x = (int) e.getRawX();
int y = (int) e.getRawY();
Rect r = new Rect();
for (int i = 0; i < pRcv.getChildCount(); i++) {
View qipao = pRcv.getChildAt(i).findViewById(R.id.气泡id);
if (changeDrug != null) {
// 获取气泡在屏幕的位置
qipao.getGlobalVisibleRect(r);
// 先判断气泡是否显示,再判断点击事件是否在气泡范围内
if (qipao.getVisibility() == View.VISIBLE && r.contains(x, y)) {
qipao.callOnClick();
return true;
}
}
}
}
return false;
结束语
希望大家不会遇到这么坑的需求!!!!!!!