自定义控件给子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);
}