踩一下clipChildren的坑

753 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第N天,点击查看活动详情

1.clipChildren属性介绍

来自ViewGroup中的属性clipChildren用于定义一个子元素是否被限制在其父元素中进行绘制。通常用于动画效果中绘制需要超出原有尺寸限制的元素时使用。在这种情况下,需要将该属性值设置为false以确保该元素可以超出边界。缺省值为true,也即子元素不可以超出父元素的边界。

2.超出父View的子View的点击事件

一般可以在爷View上通过onTouchListener()方法把事件传给子View,前提是子View没有超过爷View。

如果不行就在爷View上通过onTouchListener()方法把方法传给子View

3.在RecyclerView里面用clipChildren属性

image-20220406145243974.png

有个这样子的需求,每个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;

结束语

希望大家不会遇到这么坑的需求!!!!!!!