11

ボタンとOnTouchListenerが接続されています。モーション(ユーザーがボタンを押したとき)がボタンの内側または外側で発生したかどうかを確認するにはどうすればよいですか?event.getAction()とevent.getActionMasked()はどちらも、それぞれActionDown、ActionUp、ActionMoveである0、1、または2のみを返します。定数MotionEvent.ACTION_OUTSIDEがあります。これは4ですが、ボタンの外側にタッチをドラッグしても、どういうわけかそれを受け取りません。両方のメソッドから2を受け取ります。どうしたの?

UPD:私は素晴らしい解決策を見つけました-ACTION_UPの後にビューでフォーカスされた状態をチェックするだけです。焦点が合っていない場合は、ビューの外側で動きが発生したことを意味します。

4

6 に答える 6

13

MotionEvent.ACTION_OUTSIDEは、ビューでは機能しません。

1つの解決策は、XとYのタッチ位置を取得し、それがビューの境界内にあるかどうかを確認することです。それは次のように行うことができます:

@Override
public boolean onTouchEvent(MotionEvent e) {
    if (isInside())
        Log.i(TAG, "TOUCH INSIDE");
    else
        Log.i(TAG, "TOUCH OUTSIDE");
    return true;
}

private boolean isInside(View v, MotionEvent e) {
    return !(e.getX() < 0 || e.getY() < 0
            || e.getX() > v.getMeasuredWidth()
            || e.getY() > v.getMeasuredHeight());
}
于 2016-09-10T17:21:21.033 に答える
9

このフラグはWindowsにのみ適用され、ビューには適用されません。ACTION_MOVEビューから指を離すと、イベントは元のビューにとどまります。明確にする必要があるかどうかについては、ソースコードを参照しSeekBarてください。指をバーから離しても、親指は引きずられます。

ウィンドウレベルの使用でこれを行うためFLAG_WATCH_OUTSIDE_TOUCHに、それはうまく機能します。

于 2012-06-23T19:15:07.807 に答える
8

case MotionEvent.ACTION_CANCEL私のために働いた。

于 2013-04-10T12:38:09.693 に答える
4

がにある場合はOnTouchListenerButton内からのみモーションイベントを受信しますButton。はMotionEvent.ACTION_OUTSIDE、モーションイベントが最初にの境界を超えたときにのみ呼び出されます。Viewこれは、のように扱う必要がありACTION_UPます。

于 2012-06-23T19:16:12.557 に答える
1
public static boolean touchWithinBounds(MotionEvent event, View view) {
    if (event == null || view == null || view.getWidth() == 0 || view.getHeight() == 0)
        return false;

    int[] viewLocation = new int[2];
    view.getLocationOnScreen(viewLocation);
    int viewMaxX = viewLocation[0] + view.getWidth() - 1;
    int viewMaxY = viewLocation[1] + view.getHeight() - 1;
    return (event.getRawX() <= viewMaxX && event.getRawX() >= viewLocation[0]
        && event.getRawY() <= viewMaxY && event.getRawY() >= viewLocation[1]);
}

別のビューからタッチイベントを転送する場合の解決策

于 2017-11-03T12:06:26.053 に答える
0

これを試してみてください

private View.OnTouchListener handleTouch = new View.OnTouchListener() {

@Override
public boolean onTouch(View v, MotionEvent event) {

    int x = (int) event.getX();
    int y = (int) event.getY();

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            Log.i("TAG", "touched down");
            break;
        case MotionEvent.ACTION_MOVE:
            Log.i("TAG", "moving: (" + x + ", " + y + ")");
            break;
        case MotionEvent.ACTION_UP:
            Log.i("TAG", "touched up");
            // do what you want when touch active
            break;
        case MotionEvent.ACTION_CANCEL:
            Log.if("TAG","touched canceled")
            // outside of the view 
            //ACTION_MOVE present 
            break:

    }

    return true;
}

};

于 2022-01-30T17:20:55.927 に答える