Android触摸范围_TouchDelegate

在开发中经常碰到控件的点击区域过小导致用户点击过程中不能触发事件的响应. 这种不友好的用户体验我们应该杜绝.

常用的解决办法有两种:

  • 设置padding值. 但是这需要计算本身大小和扩大的点击范围. 麻烦
  • 增加父布局. 多敲一行代码都嫌麻烦,更别说多写个布局.

TouchDelegate

这是扩展控件的关键类. 该方法可以对控件进行上下左右的扩展触摸范围.

构造方法:

1
2
TouchDelegate (Rect bounds,
View delegateView)

步骤:

  1. 创建TouchDelegate对象
  2. 需要扩展的控件的父布局设置TouchDelegate
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@BindView(R.id.text)
TextView mText;
private Rect mRect;
private View mParent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
// post是控件的延迟队列操作
((View) mText.getParent()).post(new Runnable() {
@Override
public void run() {
Rect bounds = new Rect();
mText.getHitRect(bounds); // 得到默认触摸范围
bounds.bottom += 200; // 修改范围
// 创建TouchDeletegate对象
TouchDelegate touchDelegate = new TouchDelegate(bounds, mText);
// 父布局设置TouchDelegate
((View) mText.getParent()).setTouchDelegate(touchDelegate);
}
});
}

恢复默认

要想恢复默认的触摸范围, 只需要设置个空的rect就行了.

1
2
3
4
5
6
7
8
9
10
11
12
((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);
}
}
});