我在以下情况下使用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);
}
这意味着两个背景应该总是彼此相邻,但是当我滚动屏幕时,它们会稍微分开或略微重叠,有什么办法可以纠正这个问题吗?代码的任何部分导致它们不同步?
答案 0 :(得分:1)
当用户拖动时,您会收到许多MotionEvent
个ACTION_MOVE
。每个事件的历史记录大小都比上一个大。这意味着您的for
循环需要更长的时间来执行用户拖动的时间越长或者他们的手指停留时间越长。
为了找出拖动的当前距离,您实际上不需要遍历所有历史值。只需保存初始ACTION_DOWN
的X值,然后在每个ACTION_MOVE
上保存,即可将最新的X值与保存的值进行比较。