3

我正在编写一个应用程序,其中包含一个像facebook 聊天头这样的元素,它可以使用手指在屏幕上自由移动。我试图找出视图的速度,以便在调用 ACTION_UP 后确定视图的最终位置。问题是速度跟踪器返回的速度有时是正确的,但有一半是错误的。

很多时候,当我尝试将聊天头向右扔时,它会给出一个负的 x 速度,这是一种不稳定的行为。所以我进入了手机的开发者设置并激活了指针位置选项。现在在手机的顶部,在状态栏的顶部,显示的'Xv'值总是正确的,但是用androidVelocityTracker测量的X速度的打印日志仍然不稳定。

这是我的代码:

chatHead.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        int rawX = (int) event.getRawX();
        int rawY = (int) event.getRawY();
        int pointerIndex = 0;
        int pointerId = event.getPointerId(pointerIndex);

            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN
                    //velocity tracker
                    if (mTracker == null) {
                        mTracker = VelocityTracker.obtain();
                    } else {
                        mTracker.clear();
                    }
                    mTracker.addMovement(event);
                    return true;

                case MotionEvent.ACTION_UP:
                    Log.d(TAG, "x velocity = " + lastKnownXVelocity);
                    Log.d(TAG, "y velocity = " + lastKnownYVelocity);
                    return true;

                case MotionEvent.ACTION_MOVE:
                    //01. add movement to velocity trakcer
                    mTracker.addMovement(event);
                    mTracker.computeCurrentVelocity(1000);
                    lastKnownXVelocity = VelocityTrackerCompat.getXVelocity(mTracker, pointerId);
                    lastKnownYVelocity = VelocityTrackerCompat.getYVelocity(mTracker, pointerId);
                    //lastKnownXVelocity = mTracker.getXVelocity(); //have also tried this code...it's shows no different results
                    //lastKnownYVelocity = mTracker.getYVelocity();

                    //02. code to drag the circle on pointer move
                    globalParams.x = paramsX;
                    globalParams.y = paramsY;
                    windowManager.updateViewLayout(chatHead, globalParams);
                    return true;

                case MotionEvent.ACTION_CANCEL:
                    // Return a VelocityTracker object back to be re-used by others.
                    mTracker.recycle();
                    break;
            }
            return false;
    }
});

请让我知道我是否犯了一些错误或什么?或者有没有其他方法可以获得正确的速度。

提前致谢!

4

0 回答 0