5

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.
 }
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 に答える