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

时间:2017-01-04 00:04:39

标签: java android ontouchlistener lag

我在以下情况下使用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);
        }

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

1 个答案:

答案 0 :(得分:1)

当用户拖动时,您会收到许多MotionEventACTION_MOVE。每个事件的历史记录大小都比上一个大。这意味着您的for循环需要更长的时间来执行用户拖动的时间越长或者他们的手指停留时间越长。

为了找出拖动的当前距离,您实际上不需要遍历所有历史值。只需保存初始ACTION_DOWN的X值,然后在每个ACTION_MOVE上保存,即可将最新的X值与保存的值进行比较。