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