自定义控件给子View分配点击事件

自定义控件给子View分配点击事件

自定义控件有时候需要给子控件分配点击事件,如果用注册OnClickLisenter,显的有点low,特别是子控件较多的情况.
网上没找到解决方案,爬了下ListView的源码.发现了一段.

  1. 重写onTouchEvent,获取点击的x,y;
  2. 遍历子view,判断是否有view包含这个点;
  3. 注册回调接口,点击事件传递过去.并返回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);
}

pompip 原创

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值