5

onInterceptTouch(MotionEvent)为了允许水平滚动,我正在覆盖。然而,我发现我无法检测到用户何时触摸了嵌入的 v。视图上的 x、y 类似于 2000、2400,而视图上的 x、yMotionEvent.getX(),getY()类似于 400,500

View v = findViewById(R.id.myView);

Rect r = new Rect();
v.getHitRect(r);
int[] loc = new int[2];
v.gtLocationOnScreen(loc);

int x = loc[0];
int y = loc[1];

// Result x,y are huge numbers 2400, etc
// event.getX() is 30, event.getY() == 500 nothing close to 2400.

if (r.contains((int)event.getX(), (int)event.getY())
{
   return false;  // this is never true even when I click right on View v.
 }
4

2 回答 2

18

我知道这是一个老问题,大部分都在链接的帖子中得到了回答,但我刚刚遇到了这个问题,所以我想我会填写我的解决方案。

private boolean isTouchInView(View view, MotionEvent event) {
    Rect hitBox = new Rect();
    view.getGlobalVisibleRect(hitBox);
    return hitBox.contains((int) event.getRawX(), (int) event.getRawY());
}
于 2015-02-17T21:02:39.370 回答
3

尝试使用getRawX()getRawY()。这些将为您提供所需的绝对位置。

看:

我如何知道 MotionEvent 是相对的还是绝对的?

您还必须调整目标视图的位置,以解决其他视图的任何位移,如下所示:

int[] screenLocation = new int[2];
view.getLocationOnScreen(screenLocation);
hitRect.offset(screenLocation[0] - view.getLeft(), screenLocation[1] - view.getTop());

//Then check if source view is contained in target view

x=event.getRawX();
y=event.getRawY();

if (hitRect.contains(x, y)) {

//do your stuff

}
于 2012-12-18T06:49:56.897 回答