1

のカスタムビュー内のタッチイベントに応答しますonTouchEvent(MotionEvent event)。座標の不一致に問題がありevent.getRaw(Y)ます。ステータスバーを含むタッチのY座標をmyView.getTop()返しますが、ステータスバーを除くビューの上部のY座標を返します。ステータスバーの高さを修正するために、次のハックに頼りました。

// Get the size of the visible window (which excludes the status bar)
Rect rect = new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);

// Get the coordinates of the touch event, subtracting the top margin
final int x = (int) event.getRawX();
final int y = (int) event.getRawY() - rect.top;

より良い解決策はありますか?

4

1 に答える 1

4

親ビューを基準にした座標のみを気にする場合(たとえば、ビューの左上を常に0,0と想定したい場合)、生の同等物の代わりにgetX()とgetY()を使用できます。

それ以外の場合は、基本的に、画面を基準にしたX / Y(getRawX、getRawY)を取得し、ウィンドウを基準にしたX / Y座標に変換しようとしています(ステータスバーはウィンドウの一部ではありません)。

現在のソリューションは機能しますが、他の場所で説明されているように、getWindowVisibileDisplayFrameは過去にわずかに壊れています。より安全な方法は、ウィンドウ内のビューの位置を特定してから、そのビューを基準にしたx/y座標を使用することです。

int[] coords = new int[2];
myView.getLocationInWindow(coords);

final int x = event.getRawX() - coords[0];
final int y = event.getRawY() - coords[1];
于 2012-12-27T20:41:48.653 に答える