Track Pixel от Pixel Movement в Android
-
22-10-2019 - |
Вопрос
Я пишу приложение для 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();
}
}
Спасибо.
Решение
У нас была такая же проблема, и мы не смогли получить дальнейшую точность. Я не уверен, что фреймворк предложит пиксельное движение. Однако, когда пользователь делает точные движения с более медленной скоростью, это имеет тенденцию быть более точным. Таким образом, если у пользователя есть палец вниз и буквально перемещает один пиксель, вы должны получить это событие. Однако, если они быстро проведут 800 пикселей, не ожидайте 800 событий.
Другие советы
Вот немного точнее, чем просто Getx & Gety: исторические события Touch. Я уверен, что это работает от 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);
}
}