为什么我的拖拽方法滞后?

v1l68za4  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(212)

我用的是 onTouchEvent() 方法与以下情况:

case MotionEvent.ACTION_MOVE:
                if (motionEvent.getHistorySize() > 0) {
                    for (int i = 1, n = motionEvent.getHistorySize(); i < n; i++) {
                        int calcX = (int) motionEvent.getHistoricalX(i) - (int) motionEvent.getHistoricalX(i - 1);
                        treesX += calcX;
                    }
                }
break;

这个 treesX 变量表示将背景绘制为位图的点,在该点旁边绘制另一个背景,并将屏幕宽度添加到该点 treesX ,滚动屏幕宽度后,两个图像都跳回一个屏幕宽度,以提供无缝背景的效果,如下代码所示:

public void draw() {
        if (ourHolder.getSurface().isValid()) {
            canvas = ourHolder.lockCanvas();

            if ((int) treesX < -screenWidth) {
                treesX += screenWidth;
            }
            if ((int) treesX > 0) {
                treesX -= screenWidth;
            }
            canvas.drawBitmap(trees, null, new Rect((int) treesX, 0, screenWidth + (int) treesX, screenHeight), paint);
            canvas.drawBitmap(trees, null, new Rect((int) treesX + screenWidth, 0, 2 * screenWidth + (int) treesX, screenHeight), paint);

            }
            ourHolder.unlockCanvasAndPost(canvas);
        }

这意味着两个背景应该总是紧挨着对方,但是当我滚动屏幕时,它们会稍微分开或重叠,有什么方法可以纠正这个问题吗?代码中导致它们不同步的任何部分?

3gtaxfhh

3gtaxfhh1#

当用户拖动时,您将收到许多 MotionEvent s与 ACTION_MOVE . 每个事件的历史大小都将大于上一个事件。这意味着你的 for 执行循环所需的时间越长,用户拖得越多,或者他们的手指放得越低。
你真的不需要在所有的历史值上循环,只需要计算出当前被拖走的距离。只需保存初始值的x值 ACTION_DOWN ,然后在每个 ACTION_MOVE 将最近的x值与保存的x值进行比较。

相关问题