отслеживать попиксельное движение в Android - PullRequest
4 голосов
/ 28 ноября 2011

Я пишу приложение для Android, которое требует очень точных измерений движения. В идеале мне бы хотелось, если бы пользователь держал палец на экране и двигал один пиксель, я бы мог это отследить. В настоящее время я перезаписываю onTouch, чтобы отслеживать, где находится пользователь. Проблема в том, что когда палец быстро перемещается по экрану, onTouch пропускает целых 15 пикселей в движении. Есть ли более точный способ сделать это на Touch?

Это пример того, что я сейчас делаю:

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

Спасибо.

Ответы [ 2 ]

3 голосов
/ 28 августа 2012

Это немного точнее, чем просто getX & getY: исторические события касания. Я уверен, что это работает с 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);
        }
    }
2 голосов
/ 28 ноября 2011

У нас была та же проблема, и мы не смогли получить дополнительную точность.Я не уверен, что фреймворк будет предлагать попиксельное движение.Однако, когда пользователь делает точные движения на более медленных скоростях, это имеет тенденцию быть более точным.Итак, если пользователь опускает палец вниз и буквально перемещает один пиксель, вы должны получить это событие.Однако, если они быстро проведут через 800 пикселей, не ожидайте 800 событий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...