0

アクティビティにボタンのグリッドがあります。ユーザーがこのボタンのグリッド上で指をスライドさせると、タッチされたすべてのボタンが基本的に記録されるようになり、どのボタンがタッチされたかがわかります。

私はこれについて調査を行ってきましたが、ほとんどの例はビットマップを使用しているため、これがどのように行われるかわかりません。選択された最初のビューは、 my から取得される唯一のビューですOnTouchListener。私の読書から、これに使用されるものは何ですか?使用するとMotionEvent.ACTION_MOVE言った人を見ましたが、ユーザーが指をスワイプしているときに他のどのボタンが押され、どのボタンが押されていないかを判断するためにこれがどのように使用されるかわかりません画面上。view.getRawX()view.getRawY()

私は Android を初めて使用するので、これが思ったよりもはるかに単純な作業である場合は申し訳ありません。これはそれほど複雑であるべきではないと思うので、どんな意見でも大歓迎です。お時間をいただきありがとうございます!:)

4

2 に答える 2

2

View が true を返し、タッチ イベントを消費していることを示すと、残りのビューはそれを受け取りません。あなたができることは、すべてのタッチイベントをインターセプトして処理するカスタムを作成することViewGroupです (グリッドがあると言いますが、私は仮定しますか?)。GridView

public class InterceptingGridView extends GridView {
    private Rect mHitRect = new Rect();

    public InterceptingGridView (Context context) {
        super(context);
    }

    public InterceptingGridView (Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onInterceptTouchEvent (MotionEvent ev) {
        //Always let the ViewGroup handle the event
        return true;
    }

    @Override
    public boolean onTouchEvent (MotionEvent ev) {
        int x = Math.round(ev.getX());
        int y = Math.round(ev.getY());

        for (int i = 0; i < getChildCount(); i++) {
            View child = getChildAt(i);
            child.getHitRect(mHitRect);

            if (mHitRect.contains(x, y)) {
                /*
                 * Dispatch the event to the containing child. Note that using this
                 * method, children are not guaranteed to receive ACTION_UP, ACTION_CANCEL,
                 * or ACTION_DOWN events and should handle the case where only an ACTION_MOVE is received.
                 */
                child.dispatchTouchEvent(ev);
            }
        }

        //Make sure to still call through to the superclass, so that
        //the ViewGroup still functions normally (e.g. scrolling)
        return super.onTouchEvent(ev);
    }
}

イベントをどのように処理するかは、必要なロジックによって異なりますが、重要なのは、コンテナー ビューがすべてのタッチ イベントを消費し、子へのイベントのディスパッチを処理できるようにすることです。

于 2013-05-01T03:44:05.933 に答える
0

多分これはあなたを助けるでしょう:

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

        int action = event.getAction() & MotionEvent.ACTION_MASK;
        int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT;
        int pointerId = event.getPointerId(pointerIndex);


        switch (action) {
        case MotionEvent.ACTION_DOWN:
        case MotionEvent.ACTION_POINTER_DOWN:

            break;

        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_POINTER_UP:
        case MotionEvent.ACTION_CANCEL:

            break;

        case MotionEvent.ACTION_MOVE:
            int pointerCount = event.getPointerCount();
            for (int i = 0; i < pointerCount; i++) {

            }
            break;
        }

        return true;

}

マルチタッチで動作します

于 2013-05-01T03:36:54.483 に答える