【发布时间】:2011-10-04 16:24:16
【问题描述】:
我有一个大致基于this tutorial 的多点触控图像视图。那里的一位评论者提出了一种半脏方法,将图像拖动限制在图像的边界内,使图像边缘不能被拖动到其边缘之外。这种方法有点工作,但不是完全有效。它只限制两条边的拖动。
有谁知道限制图像拖动的不那么凌乱且实用的方法?
对于 Android 应用程序开发来说,这是一个非常重要的概念,但没有得到充分的解决......
我想到了以下想法:
1) setScaleType(scaleType.fitXY) 当 zoom = 1.0F(即最小缩放)时,只有在 zoom > 1.0f 时才启用拖动
2) 当缩放 > 1.0f 时,setScaleType(scaleType.MATRIX),然后您确定图像边界和屏幕尺寸,并且以某种方式对我来说太聪明了,使用 if 语句您只允许在图像边缘拖动不在屏幕上。我不知道如何声明,就是这样。
无论如何,为了完整起见,这里是来自该链接的限制平移代码。这似乎是 stackoverflow 上最受欢迎的建议,但我认为我们可以做得更好:
// limit pan
matrix.getValues(matrixValues);
float currentY = matrixValues[Matrix.MTRANS_Y];
float currentX = matrixValues[Matrix.MTRANS_X];
float currentScale = matrixValues[Matrix.MSCALE_X];
float currentHeight = height * currentScale;
float currentWidth = width * currentScale;
float dx = event.getX() - start.x;
float dy = event.getY() - start.y;
float newX = currentX+dx;
float newY = currentY+dy;
RectF drawingRect = new RectF(newX, newY, newX+currentWidth, newY+currentHeight);
float diffUp = Math.min(viewRect.bottom-drawingRect.bottom, viewRect.top-drawingRect.top);
float diffDown = Math.max(viewRect.bottom-drawingRect.bottom, viewRect.top-drawingRect.top);
float diffLeft = Math.min(viewRect.left-drawingRect.left, viewRect.right-drawingRect.right);
float diffRight = Math.max(viewRect.left-drawingRect.left, viewRect.right-drawingRect.right);
if(diffUp > 0 ){
dy +=diffUp;
}
if(diffDown < 0){
dy +=diffDown;
}
if( diffLeft> 0){
dx += diffLeft;
}
if(diffRight < 0){
dx += diffRight;
}
matrix.postTranslate(dx, dy);
【问题讨论】: