Question

Je suis en train d'écrire une application Android qui nécessite des mesures très précises de mouvement. Idéalement, je voudrais que l'utilisateur a son doigt sur l'écran et se déplace d'un pixel, je peux le suivre. À l'heure actuelle, je suis PRÉPONDÉRANTS OnTouch de suivre où l'utilisateur est. Le problème est, lorsque le doigt se déplace rapidement à travers l'écran, OnTouch manque autant que 15px dans un mouvement. Est-il un moyen plus précis pour ce faire que OnTouch?

Ceci est un exemple de ce que je fais actuellement:

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

Merci.

Était-ce utile?

La solution

Nous avons eu le même problème, et nous avons été incapables d'obtenir plus de précision. Je ne suis pas sûr que le cadre offrirai mouvement pixel par pixel. Cependant, lorsqu'un utilisateur effectue des mouvements précis à des vitesses plus lentes, cela tend à être plus précis. Ainsi, si l'utilisateur a son doigt vers le bas et se déplace littéralement un seul pixel, vous devriez obtenir cet événement. Cependant, si elles swipe rapidement à travers 800 pixels, ne vous attendez pas à 800 événements.

Autres conseils

Voici un peu plus précis que seulement GetX et Gety: événements tactiles historiques. Je suis sûr que des œuvres de SDK8, mais ne l'ai pas testé sur les versions inférieures.

    @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);
        }
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top