经过长时间的中断,我回到了去年我正在研究的项目,其中涉及尝试滚动网格。我通过处理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中减去它)但没有任何效果。
那么我如何摆脱抖动并使其成为可以让网格的边缘与屏幕边缘重合,只需一次平滑滑动?
非常感谢!