在Android中逐像素移动

时间:2011-11-28 18:54:10

标签: android ontouchevent

我正在编写一款需要非常精确的动作测量的Android应用。理想情况下,我希望如果用户将手指放在屏幕上并移动一个像素,我就可以跟踪它。目前,我正在重写onTouch以跟踪用户的位置。问题是,当手指在屏幕上快速移动时,onTouch在一次移动中错过了15px。是否有更精确的方法来执行onTouch?

这是我目前正在做的一个例子:

@Override
public boolean onTouch(View view, MotionEvent event){
    if(event.getAction() == MotionEvent.ACTION_MOVE){
         Log.d(TAG, event.getX() + ", " + event.getY();
    }
}

感谢。

2 个答案:

答案 0 :(得分:3)

这里比getX& amp;更精确一点getY:历史触摸事件。我确定这可以从SDK8开始,但是还没有在较低版本上测试它。

    @Override public boolean onTouchEvent(MotionEvent event) {
        int action = event.getAction();
        mCurDown = action == MotionEvent.ACTION_DOWN
                || action == MotionEvent.ACTION_MOVE;
        int N = event.getHistorySize();
        for (int i=0; i<N; i++) {
            drawPoint(event.getHistoricalX(i), event.getHistoricalY(i),
                    event.getHistoricalPressure(i),
                    event.getHistoricalSize(i));
        }
        drawPoint(event.getX(), event.getY(), event.getPressure(),
                event.getSize());
        return true;
    }

    private void drawPoint(float x, float y, float pressure, float size) {
        mCurX = (int)x;
        mCurY = (int)y;
        mCurPressure = pressure;
        mCurSize = size;
        mCurWidth = (int)(mCurSize*(getWidth()/3));
        if (mCurWidth < 1) mCurWidth = 1;
        if (mCurDown && mBitmap != null) {
            int pressureLevel = (int)(mCurPressure*255);
            mPaint.setARGB(pressureLevel, 255, 255, 255);
            mCanvas.drawCircle(mCurX, mCurY, mCurWidth, mPaint);
            mRect.set(mCurX-mCurWidth-2, mCurY-mCurWidth-2,
                    mCurX+mCurWidth+2, mCurY+mCurWidth+2);
            invalidate(mRect);
        }
    }

答案 1 :(得分:2)

我们遇到了同样的问题,无法进一步提高精确度。我不确定该框架将提供逐像素移动。然而,当用户以较慢的速度进行精确移动时,这往往更准确。因此,如果用户的手指向下并且字面上移动了一个像素,那么您应该得到该事件。但是,如果他们快速刷过800像素,则不要指望800个事件。