java - 为什么我的拖动方法滞后?

标签 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);
        }

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

最佳答案

当用户拖动时,您将收到许多带有 ACTION_MOVEMotionEvent。每个事件的历史记录大小都会比上一个事件更大。这意味着用户拖动的次数越多或手指按住的时间越长,您的 for 循环的执行时间就会越长。

您实际上没有必要循环所有历史值来计算当前已拖动的距离。只需保存初始 ACTION_DOWN 的 X 值,然后在每次 ACTION_MOVE 上将最新的 X 值与保存的值进行比较。

关于java - 为什么我的拖动方法滞后?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41454278/

相关文章:

android - 为什么 ACTION_DOWN 可能偶尔不会在 Android 中为 ListView 触发

java - 创建一个简单、简单的游戏引擎

java - 如何使用 Java 扫描 root 中的 SUID 文件并访问其属性?

Android 检查设备上的 GPS 可用性

android - 如何为使用 Canvas : Android 绘制的内容设置 ontouch 监听器

java - 如何在android中的触摸比例动画上应用imageView?

java - 使用 iReport 创建 pdf 时使用自定义字体

java - 在java中,如何将日志消息与多个字符串模式相匹配

android - 在 Android 上使用 java.time 时出现 NoClassDefFoundError

java - 获取错误 java.lang.ArrayIndexOutOfBoundsException : too much data for RSA block