自定义控件给子View分配点击事件
自定义控件有时候需要给子控件分配点击事件,如果用注册OnClickLisenter,显的有点low,特别是子控件较多的情况.
网上没找到解决方案,爬了下ListView的源码.发现了一段.
- 重写onTouchEvent,获取点击的x,y;
- 遍历子view,判断是否有view包含这个点;
- 注册回调接口,点击事件传递过去.并返回ture,代表事件终止.
关键对象和代码
Rect rect = new Rect();
view.getHitRect(rect)//如方法名字意思,获取view的范围矩形
rect.contains((int) x, (int) y)//该矩形是否包含这个点
代码如下
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
float x = event.getX();
float y = event.getY();
Rect rect = new Rect();
for (int i = 0; i < getChildCount(); i++) {
getChildAt(i).getHitRect(rect);
if (rect.contains((int) x, (int) y)) {
if (listener != null) {
listener.click(getChildAt(i), i);
getChildAt(i).performClick();
return true;
}
}
}
}
return super.onTouchEvent(event);
}
private OnItemClickListener listener;
public void setOnItemClickListener(OnItemClickListener listener) {
this.listener = listener;
}
public interface OnItemClickListener {
void click(View view, int position);
}
本文介绍了一种自定义控件中实现子View点击事件的方法。通过重写onTouchEvent获取触摸坐标,并遍历子View检查触摸点是否落在某个View内。若在,则触发注册的回调接口,完成点击事件的传递。
929

被折叠的 条评论
为什么被折叠?



