文章目錄
近期在學習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);
}
}
});
}
採取此種方法的兩點注意:
- 若View的自定義觸摸範圍超出Parent的大小,則超出的那部分無效。
- 一個Parent只能設置一個View的TouchDelegate,設置多個時只有最後設置的生效。
對於TouchDelegate的用法其實是非常簡單的。由於一個父控件只能允許一個子View擴大觸摸區域,設置多個時只有最後設置的生效。那麼遇到多個子View的情況需要怎麼解決呢?
通過查找資料,發現已經有大神解決了鏈接:淺談TouchDelegate的坑與用法以及ListView Tips & Tricks #5: Enlarged Touchable Areas