我有一个带有多点触控的imageView,大致基于教程。那里的评论者之一提出了一种限制图像拖动到图像边缘以外的半脏方法,这样图像边缘就不能被拖动到其边缘之外。这种方法有些有效,但并不完全。它只限制了两个边缘的拖动。
有没有人知道一种更简洁和实用的限制图像拖动的方法?
这是Android应用程序开发中非常重要的概念,尚未得到充分解决......
我想到了以下几个想法:
1) 当缩放= 1.0F(即最小缩放)时,设置setScaleType(scaleType.fitXY),仅当缩放> 1.0f时启用拖动
2) 当缩放> 1.0f时,设置setScaleType(scaleType.MATRIX),然后确定图像边界和屏幕尺寸,并以某种对我来说太聪明的方式,使用if语句仅在图像边缘不在屏幕上时才允许拖动。我不知道如何声明它。
无论如何,为了完整起见,以下是来自该链接的限制pan代码。这似乎是stackoverflow上最受欢迎的建议,但我认为我们可以做得更好:
有没有人知道一种更简洁和实用的限制图像拖动的方法?
这是Android应用程序开发中非常重要的概念,尚未得到充分解决......
我想到了以下几个想法:
1) 当缩放= 1.0F(即最小缩放)时,设置setScaleType(scaleType.fitXY),仅当缩放> 1.0f时启用拖动
2) 当缩放> 1.0f时,设置setScaleType(scaleType.MATRIX),然后确定图像边界和屏幕尺寸,并以某种对我来说太聪明的方式,使用if语句仅在图像边缘不在屏幕上时才允许拖动。我不知道如何声明它。
无论如何,为了完整起见,以下是来自该链接的限制pan代码。这似乎是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);