扩大View点击范围

padding方式

适合图片等dp或px为单位的view,
不适合textview、button这种以或含sp计算单位的view。

TouchDelegate方式

有时候美工提供给我们的图标是很小的,但却要在如此小的图标上附加点击事件,如果不做处理,用户在使用的时候是很难点中的。当然,我们可以通过布局做调整处理,但是往往是布局变得更复杂。现在我们通过TouchDelegate来扩大View点击区域方式解决这个问题。

作用

假设有两个View,分别是v1、v2,可以通过v1.setTouchDelegate(new TouchDelegate(bounds, v2))来委派触摸事件,其中bounds是一个Rect。执行该这个方法后,v1中bounds区域的触摸事件TouchEvent将会传递给v2。

代码

    public static void setTouchDelegate(final View view, final int expandTouchWidth) {
        final View parentView = (View) view.getParent();
        parentView.post(new Runnable() {
            @Override
            public void run() {
                final Rect rect = new Rect();
                view.getHitRect(rect); // view构建完成后才能获取,所以放在post中执行
                // 4个方向增加矩形区域
                rect.top -= expandTouchWidth;
                rect.bottom += expandTouchWidth;
                rect.left -= expandTouchWidth;
                rect.right += expandTouchWidth;

                parentView.setTouchDelegate(new TouchDelegate(rect, view));
            }
        });
    }

使用的时候只需在onCreate中或其他合适的地方调用setTouchDelegate(v2, 100),v2是要扩大点击区域的view,100是v2四周要扩大的点击区域px值。

注意点

  1. 必须保证parent足够大,如果自定义的范围超出parent的大小,则超出的那部分无效。
  2. 一个parent只能设置一个触摸委派,设置多个时,只有最后设置的child有效。如果希望一个view能设置多个委派,需要再自定义parent

参考

利用TouchDelegate扩大View点击区域
ListView Tips & Tricks #5: Enlarged Touchable Areas

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,132评论 25 708
  • 1、设置UILabel行间距 NSMutableAttributedString* attrString = [[...
    十年一品温如言1008阅读 1,705评论 0 3
  • 转自:http://www.code4app.com/blog-866962-1317.html1、设置UILab...
    MMOTE阅读 1,664评论 1 1
  • 记得以前有段时间网上很流行一段话―― 同学读书我读书,同学工作我读书,同学结婚我还在读书,同学生娃了我还是在读书…...
    倒立的兔子阅读 362评论 2 2
  • 它乘着我的,美好的愿望 以及,青涩的过往 它飞去了,蓝澈的天上 它告别那 相识的欣喜,和动情的期望 当阳光,融化了...
    爱读书的喵123阅读 254评论 0 2