获取android ACTION_DOWN和ACTION_UP事件之间的距离

时间:2013-04-03 10:13:05

标签: android canvas surfaceview ontouchevent motionevent

我希望获得用户按下屏幕的点(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);

        }
}

谢谢

1 个答案:

答案 0 :(得分:1)

onTouch()处理程序中,您仍在执行此位:

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

即使事件不是ACTION_DOWN或ACTION_UP。

因此,bmpXbmpYdx和{{1}之间可能会增加/减少dy / ACTION_DOWN几百倍由于在初始向下和最终向上事件之间发生的(可能有数百个)ACTION_DOWN事件(以及可能还有其他事件)。

此外,通常您希望对象在手势期间实际跟踪手指过程,因此您可能希望为ACTION_DOWN设置特定的处理程序。