我的理解是,当你有一个太小而不容易触摸的视图时,你应该使用TouchDelegate来增加该视图的可点击区域。
然而,在谷歌上搜索用法示例,会出现多个人问这个问题,但答案很少。
有没有人知道为视图设置触摸代理的正确方法,比如说,在每个方向上将其可点击区域增加4个像素?
发布于 2009-08-27 21:21:54
我问了一个在谷歌工作的朋友,他们能帮我弄清楚如何使用TouchDelegate。这是我们想出来的:
final View parent = (View) delegate.getParent();
parent.post( new Runnable() {
// Post in the parent's message queue to make sure the parent
// lays out its children before we call getHitRect()
public void run() {
final Rect r = new Rect();
delegate.getHitRect(r);
r.top -= 4;
r.bottom += 4;
parent.setTouchDelegate( new TouchDelegate( r , delegate));
}
});
发布于 2013-03-04 11:01:13
我能够通过在一个屏幕上使用多个视图(复选框)来实现这一点,这很大程度上来自于this blog post。基本上,您采用emmby的解决方案,并将其应用于每个按钮及其父按钮。
public static void expandTouchArea(final View bigView, final View smallView, final int extraPadding) {
bigView.post(new Runnable() {
@Override
public void run() {
Rect rect = new Rect();
smallView.getHitRect(rect);
rect.top -= extraPadding;
rect.left -= extraPadding;
rect.right += extraPadding;
rect.bottom += extraPadding;
bigView.setTouchDelegate(new TouchDelegate(rect, smallView));
}
});
}
在我的例子中,我有一个覆盖在顶部的复选框的图像视图的网格视图,并按如下方式调用该方法:
CheckBox mCheckBox = (CheckBox) convertView.findViewById(R.id.checkBox1);
final ImageView imageView = (ImageView) convertView.findViewById(R.id.imageView1);
// Increase checkbox clickable area
expandTouchArea(imageView, mCheckBox, 100);
对我来说效果很好。
发布于 2012-11-07 21:33:40
此解决方案由@BrendanWeinstein在评论中发布。
您可以重写View
的getHitRect(Rect)
方法,而不是发送TouchDelegate
(如果您正在扩展一个方法)。
public class MyView extends View { //NOTE: any other View can be used here
/* a lot of required methods */
@Override
public void getHitRect(Rect r) {
super.getHitRect(r); //get hit Rect of current View
if(r == null) {
return;
}
/* Manipulate with rect as you wish */
r.top -= 10;
}
}
https://stackoverflow.com/questions/1343222
复制相似问题