分两步:
- 得到View的绘制区域
- 判断点是否在绘制区域内
得到View的绘制区域
public class View
public void getDrawingRect(Rect outRect) {
outRect.left = mScrollX;
outRect.top = mScrollY;
outRect.right = mScrollX + (mRight - mLeft);
outRect.bottom = mScrollY + (mBottom - mTop);
}
}
返回视图的可见绘图边界。使用 getScrollX()、getScrollY()、getWidth() 和 getHeight() 中的值填充输出矩形。这些边界不考虑当前在视图上设置的任何转换属性,例如 setScaleX或 setRotation。
判断点是否在绘制区域内
public final class Rect {
public boolean contains(int x, int y) {
return left < right && top < bottom // check for empty first
&& x >= left && x < right && y >= top && y < bottom;
}
}
如果 (x,y) 在矩形内,则返回 true。左侧和顶部被认为在内部,而右侧和底部则不是。这意味着要包含 x,y:left <= x < right 和 top <= y < bottom。一个空的矩形永远不会包含任何点。
最后
把上面两步结合起来,就可以自定义点击事件分发:
rootView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int x = (int) event.getX();
int y = (int) event.getY();
Rect rect = new Rect();
tvKnow.getDrawingRect(rect);
boolean contains = rect.contains(x, y);
if (contains) {
tvKnow.dispatchTouchEvent(event);
}
return true;
}
});