我有一个imageView多点触控大致基于this tutorial。其中一位评论者将一种半脏方法限制图像拖动到图像的边界,以便图像边缘不能被拖拽到其边缘之外。这种方法sorta工作,但不完全。它仅限制两条边的拖动。如何限制在Android图像平移边界imageView
有谁知道一个不太混乱,实际上限制图像拖动功能的方法?
这是Android应用开发未充分解决一个非常重要的概念....
我想以下思路:
1)setScaleType(scaleType.fitXY)当变焦= 1.0F(即最小变焦),只有在变焦> 1.0f时才启用拖动。
2)当zoom> 1.0f时,setScaleType(scaleType.MATRIX),然后确定图像边界和屏幕尺寸,并以某种方式对我来说太聪明了,使用if语句只允许在图像边缘不在屏幕上时进行拖动。我不知道该如何声明,是事情。
无论如何,为了完整性,这里是来自该链接的限制泛代码。这似乎是计算器上最流行的建议,但我认为我们可以做的更好:
// 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);
你救了我的一天!奇妙的工作! –
谢谢,这段代码帮了我很多,很好! –
我只是要确保通过图像宽度和高度除以2,这很好!我发现它将转换后的值存储在RectF对象中稍微干净一点,该对象也计算了宽度和高度。 – Swindler