我主要是onInterceptTouch(MotionEvent)为了允许水平滚动.然而,我发现我无法检测到用户何时触摸了嵌入的v.视图上的x,y MotionEvent.getX(),getY()就像2000,2400 ,而像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.
}
Run Code Online (Sandbox Code Playgroud)
Ada*_*m W 13
我知道这是一个老问题,主要是在链接帖子中回答,但我刚遇到这个问题,所以我想我会填写我的解决方案.
private boolean isTouchInView(View view, MotionEvent event) {
Rect hitBox = new Rect();
view.getGlobalVisibleRect(hitBox);
return hitBox.contains((int) event.getRawX(), (int) event.getRawY());
}
Run Code Online (Sandbox Code Playgroud)
尝试使用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
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2868 次 |
| 最近记录: |