Pregunta

Estoy escribiendo una aplicación de Android que requiere mediciones de movimiento muy precisas. Idealmente, me gustaría que el usuario tenga el dedo en la pantalla y mueva un píxel, puedo rastrearlo. Actualmente, estoy anulando a OnTouch para rastrear dónde está el usuario. El problema es que, cuando el dedo se mueve rápidamente por la pantalla, Ontouch pierde hasta 15 px en un movimiento. ¿Existe una forma más precisa de hacer esto en el que Ontouch?

Este es un ejemplo de lo que estoy haciendo actualmente:

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

Gracias.

¿Fue útil?

Solución

Tuvimos el mismo problema y no pudimos obtener más precisión. No estoy seguro de que el marco ofrezca movimiento píxel por píxel. Sin embargo, cuando un usuario está haciendo movimientos precisos a velocidades más lentas, esto tiende a ser más preciso. Entonces, si el usuario tiene el dedo hacia abajo y literalmente mueve un solo píxel, debe obtener ese evento. Sin embargo, si se deslizan rápidamente en 800 píxeles, no espere 800 eventos.

Otros consejos

Aquí hay un poco más preciso que GetX & Gety: Historical Touch Events. Estoy seguro de que esto funciona desde SDK8 UP, pero no lo ha probado en versiones más bajas.

    @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);
        }
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top