题
我正在编写一个Android应用程序,需要非常精确的运动测量。理想情况下,如果用户在屏幕上有手指并移动一个像素,我会喜欢它,我可以跟踪它。目前,我正在覆盖以跟踪用户的位置。问题是,当手指在整个屏幕上快速移动时,OnTouch在动作中却丢失了多达15px。是否有更精确的方法可以做到这一点?
这是我目前正在做的示例:
@Override
public boolean onTouch(View view, MotionEvent event){
if(event.getAction() == MotionEvent.ACTION_MOVE){
Log.d(TAG, event.getX() + ", " + event.getY();
}
}
谢谢。
解决方案
我们遇到了同样的问题,无法获得进一步的精确度。我不确定该框架是否会逐个像素运动。但是,当用户以较慢的速度进行精确的运动时,这往往更准确。因此,如果用户将手指放下并从字面上移动一个像素,则应该得到该事件。但是,如果他们迅速在800个像素上滑动,请不要期望800个事件。
其他提示
这里不仅仅是GetX&Gety:历史触摸事件。我敢肯定,这可以从SDK8 UP中使用,但尚未在较低版本上进行测试。
@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);
}
}
不隶属于 StackOverflow