Domanda

Le scrivo un app Android che richiede misure molto precise di movimento. Idealmente, vorrei che se l'utente ha il dito sullo schermo e si sposta di un pixel, posso seguirlo. Attualmente, sto imperativi onTouch per tenere traccia in cui l'utente è. Il problema è che, quando i movimenti delle dita veloci attraverso lo schermo, manca onTouch tanto quanto 15px in un movimento. C'è un modo più preciso per fare questo che onTouch?

Questo è un esempio di quello che sto facendo attualmente:

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

Grazie.

È stato utile?

Soluzione

Abbiamo avuto lo stesso problema, e siamo riusciti a ottenere più precisione. Io non sono sicuro che il quadro offrirò movimento pixel-by-pixel. Tuttavia, quando un utente effettua movimenti precisi a velocità inferiori, questo tende ad essere più precisi. Quindi, se l'utente ha il proprio giù dito e si muove un singolo pixel letteralmente, si dovrebbe ottenere tale evento. Tuttavia, se strisciare rapidamente attraverso 800 pixel, non aspettatevi 800 eventi.

Altri suggerimenti

Ecco un po 'più preciso di quello appena GetX & Gety: eventi storici tocco. Sono sicuro che questo funziona da SDK8 up, ma non l'ho testato su versioni più bassi.

    @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);
        }
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top