TouchDelegate的用法

文章目录

  • 如何使用

近期在学习Android的事件点击中发现了TouchDelegate,字面意思是"触摸委托",在进一步的了解中,发现在你想要扩大View的点击范围,但是不能改变布局的时候还是比较实用的。

如何使用

首先,来看下如何使用TouchDelegate。
如果你希望将子View的点击范围扩大到父View范围,你就可以使用TouchDelegate来做到。先看下示意图:
TouchDelegate的用法_第1张图片
如图所示,子View的点击范围就是子View本身,但是我想要扩展点击事件到父View的范围,也就是蓝色的范围。那么我们就可以使用TouchDelegate。
代码:

	/** 
     * 扩大View的触摸和点击响应范围,最大不超过其父View范围 
     *  
     * @param view 
     * @param top 
     * @param bottom 
     * @param left 
     * @param right 
     */  
    public static void expandViewTouchDelegate(final View view, final int top,  
            final int bottom, final int left, final int right) {  

        ((View) view.getParent()).post(new Runnable() {  
            @Override  
            public void run() {  
                Rect bounds = new Rect();  
                view.setEnabled(true);  
                view.getHitRect(bounds);  

                bounds.top -= top;  
                bounds.bottom += bottom;  
                bounds.left -= left;  
                bounds.right += right;  

                TouchDelegate touchDelegate = new TouchDelegate(bounds, view);  

                if (View.class.isInstance(view.getParent())) {  
                    ((View) view.getParent()).setTouchDelegate(touchDelegate);  
                }  
            }  
        });  
    }

如果想要取消:

 	/** 
     * 还原View的触摸和点击响应范围,最小不小于View自身范围 
     *  
     * @param view 
     */  
    public static void restoreViewTouchDelegate(final View view) {  

        ((View) view.getParent()).post(new Runnable() {  
            @Override  
            public void run() {  
                Rect bounds = new Rect();  
                bounds.setEmpty();  
                TouchDelegate touchDelegate = new TouchDelegate(bounds, view);  

                if (View.class.isInstance(view.getParent())) {  
                    ((View) view.getParent()).setTouchDelegate(touchDelegate);  
                }  
            }  
        });  
    } 

采取此种方法的两点注意:

  1. 若View的自定义触摸范围超出Parent的大小,则超出的那部分无效。
  2. 一个Parent只能设置一个View的TouchDelegate,设置多个时只有最后设置的生效。

对于TouchDelegate的用法其实是非常简单的。由于一个父控件只能允许一个子View扩大触摸区域,设置多个时只有最后设置的生效。那么遇到多个子View的情况需要怎么解决呢?
通过查找资料,发现已经有大神解决了链接:浅谈TouchDelegate的坑与用法以及ListView Tips & Tricks #5: Enlarged Touchable Areas

你可能感兴趣的:(android学习,TouchDelegate)