Android中TouchDelegate仅右下角生效,扩大图标点击区域全方向拓展失效如何解决
TouchDelegate点击区域仅右下生效修复方案
核心问题:坐标调整逻辑错误
getHitRect()返回的是子控件相对于父容器的坐标矩形,Android视图坐标系原点为父视图左上角,x轴向右递增,y轴向下递增,你当前的调整逻辑完全相反:
- 向左扩大区域需要减小
left值,你执行left += 8dp相当于把左边界右移,反而压缩了左侧点击范围 - 向上扩大区域需要减小
top值,你执行top += 18dp相当于把上边界下移,压缩了顶部点击范围
只有右下的right +=、bottom +=逻辑是正确的,因此只有这两个方向拓展生效。
修复后代码
findViewById(R.id.theme_parent).post(new Runnable() { @Override public void run() { Rect delegateArea = new Rect(); darkTheme.setEnabled(true); darkTheme.getHitRect(delegateArea); // 按需调整各方向拓展数值 delegateArea.right += convertDpToPixel(18); delegateArea.left -= convertDpToPixel(8); // 向左拓展改为减 delegateArea.top -= convertDpToPixel(18); // 向上拓展改为减 delegateArea.bottom += convertDpToPixel(18); TouchDelegate touchDelegate = new TouchDelegate(delegateArea, darkTheme); if(View.class.isInstance(darkTheme.getParent())) { ((View) darkTheme.getParent()).setTouchDelegate(touchDelegate); } } });
额外配置检查
- 如果父容器有多个子控件需要设置
TouchDelegate,默认的setTouchDelegate仅支持单个生效,需要自定义父容器重写触摸事件分发逻辑,处理多个代理。 - 拓展区域不能超出父视图的绘制边界,若需要拓展到父容器padding区域之外,给父布局添加两个属性:
android:clipChildren="false" android:clipToPadding="false"
内容的提问来源于stack exchange,提问作者pepperlove
相关产品推荐
相关产品推荐

