TouchDelegate的用法

文章目錄


近期在學習Android的事件點擊中發現了TouchDelegate,字面意思是"觸摸委託",在進一步的瞭解中,發現在你想要擴大View的點擊範圍,但是不能改變佈局的時候還是比較實用的。

如何使用

首先,來看下如何使用TouchDelegate。
如果你希望將子View的點擊範圍擴大到父View範圍,你就可以使用TouchDelegate來做到。先看下示意圖:
在這裏插入圖片描述
如圖所示,子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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章