0

ユーザーが画面を押したポイント (ACTION_DOWN) と離したポイント (ACTION_UP) の間の距離を取得したいと考えています。これにより、ビットマップ イメージがカーソル位置に戻る (または画面上に戻る) ことなく、(画面外に押し出されても) 同じ量だけビットマップ イメージを移動できるようになります。ただし、私のコードでは、画像が間違った方向に移動したり、画面のプレスを離しても画像が動き続けたりすることがあります。ここで説明する必要があるデバウンスの問題はありますか?

私のonTouchメソッド(ACTION_DOWNポイントとACTION_UPポイントを取得し、一方を他方から減算します)

public boolean onTouch(View v, MotionEvent event) {
    int action = event.getAction();
    if(action == event.ACTION_DOWN) {
    preFingerPosX = event.getX();
        preFingerPosY = event.getY();
    }
    else if(action == event.ACTION_UP) {
        fingerPosX = event.getX();
        fingerPosY = event.getY();
    }
    dx = fingerPosX - preFingerPosX;
    dy = fingerPosY - preFingerPosY;
    bmpX += dx;
    bmpY += dy;

    //invalidate();        
    return true;
}

そして私の run() メソッド

public void run() {
        // TODO Auto-generated method stub
        while(isRunning) {
            if(!surfaceHolder.getSurface().isValid()) {
                continue;
            }


            canvas = surfaceHolder.lockCanvas();

            canvas.drawRGB(0, 0, 0);
            canvas.drawBitmap(bmp, bmpX-(bmp.getWidth()/2),
                                        bmpY-(bmp.getHeight()/2), null);
            surfaceHolder.unlockCanvasAndPost(canvas);

        }
}

ありがとう

4

1 に答える 1

1

ハンドラーでは、onTouch()まだこのビットを実行しています。

dx = fingerPosX - preFingerPosX;
dy = fingerPosY - preFingerPosY;
bmpX += dx;
bmpY += dy;

イベントが ACTION_DOWN または ACTION_UP でない場合でも。

したがって、最初のダウン イベントと最後のアップ イベントの間に発生する (場合によっては数百の) ACTION_DOWN イベント (および場合によっては他のイベントも) により、と の間でbmpXbmpYによってインクリメント/デクリメントdx/dy潜在的に何百回も行われます。ACTION_DOWNACTION_UP

また、通常、ジェスチャ中にオブジェクトが実際に指のプロセスを追跡する必要があるため、ACTION_DOWN 用の特定のハンドラーが必要になる場合があります。

于 2013-04-03T10:19:11.710 に答える