在界限内滚动时的抖动行为

时间:2014-03-21 02:44:00

标签: android canvas scroll ontouchevent

经过长时间的中断,我回到了去年我正在研究的项目,其中涉及尝试滚动网格。我通过处理ACTION_MOVE扩展onTouchEvent的自定义类Canvas中的case MotionEvent.ACTION_MOVE: pointerIndex = event.findPointerIndex(activePointerId); pointer.set(event.getX(pointerIndex),event.getY(pointerIndex)); //compute how far the finger slid float dx = pointer.x - start.x; float dy = pointer.y - start.y; //adjust displacement values so that we don't go beyond the bounds //determined by the (transformed) corners matrix.mapPoints(transformedCorners,originalCorners); //horizontal distance between left corners float maxHorDisp = originalCorners[0] - transformedCorners[0]; //horizontal distance between right corners float minHorDisp = originalCorners[2] - transformedCorners[2]; //vertical distance between top corners float maxVertDisp = originalCorners[1] - transformedCorners[1]; //vertical distance between bottom corners float minVertDisp = originalCorners[3] - transformedCorners[3]; dx = Math.max(minHorDisp,Math.min(maxHorDisp,dx); dy = Math.max(minVertDisp, Math.min(maxVertDisp,dy); //Only move if finger slides far away enough from the starting point distance = Math.sqrt(dx*dx + dy*dy); if((mode == DRAG) && (distance > 25)){ dspl.set(dx, dy); matrix.set(savedMatrix); matrix.postTranslate(dspl.x, dspl.y); invalidate(); } 案例实现了这一点,而且一切都运行得非常顺利。

我的问题是我只希望用户能够滚动画布到目前为止,并且在达到某些边界后停止滚动。所以我尝试了这个:

originalCorners

这里,viewWidth = w; viewHeight = h; originalCorners[0] = 0; originalCorners[1] = 0; originalCorners[2] = w; originalCorners[3] = h; 只是一个浮点数组,可以在任何转换发生之前跟踪屏幕的角落,并按照以下方式进行初始化:

transformedCorners

matrix.mapPoints(transformedCorners,originalCorners);是另一个浮点数组,用于跟踪发生任何翻译或缩放后角落的位置。它总是更新如下: {{1}}

这种实现了我停止滚动越过边界的目标,但是当在任何方向上滑动太远时(在到达边界之前),网格开始像疯了一样抖动。您最初过早停止,但如果您继续沿同一方向滑动,最终可能会使网格边缘与屏幕边缘重合。

我尝试过一些东西(比如向xMax,yMax添加一点缓冲值并从xMin,yMin中减去它)但没有任何效果。

那么我如何摆脱抖动并使其成为可以让网格的边缘与屏幕边缘重合,只需一次平滑滑动?

非常感谢!

0 个答案:

没有答案