gpt4 book ai didi

android - 如何在 Android imageView 中限制图像平移边界

转载 作者:太空狗 更新时间:2023-10-29 15:56:32 26 4
gpt4 key购买 nike

我有一个带有多点触控的 imageView,大致基于 this tutorial .那里的一位评论者提出了一种半脏方法,将图像拖动限制在图像的边界内,这样图像边缘就不能被拖动到其边缘之外。这种方法有点管用,但不完全管用。它只限制两条边的拖动。

有谁知道限制图像拖动的不那么困惑且实用的方法吗?

对于 Android 应用程序开发而言,这是一个非常重要的概念,但尚未得到充分解决....

我想到了以下想法:

1) setScaleType(scaleType.fitXY) when zoom = 1.0F (i.e. min zoom), drag only enabled when zoom > 1.0f

2) 当 zoom > 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);

最佳答案

private void limitDrag(Matrix m, ImageView view) {


float[] values = new float[9];
m.getValues(values);
float transX = values[Matrix.MTRANS_X];
float transY = values[Matrix.MTRANS_Y];
float scaleX = values[Matrix.MSCALE_X];
float scaleY = values[Matrix.MSCALE_Y];

Rect bounds = view.getDrawable().getBounds();
int viewWidth = getResources().getDisplayMetrics().widthPixels;
int viewHeight = getResources().getDisplayMetrics().heightPixels;



if(viewHeight<=480)
{

_y_up=0;
}
if(viewHeight>480&&viewHeight<980)
{

_y_up=140;
}

int width = bounds.right - bounds.left;
int height = bounds.bottom - bounds.top;
int __width=width;
int __height=height;
width = viewWidth / 2;
height = viewHeight / 2;


//height = 200 ;
float minX = (-width) ;//* scaleX;
float minY = (-height) ;//* scaleY;


if ((transX) > (viewWidth)) {

//_x_left

transX = viewWidth;
} else if (transX < minX) {


transX = minX;
}


if ((-transX) > (viewWidth)) {
// _x_right
transX = -(viewWidth);
} else if (-transX < minX) {

transX = -(minX+30);
}



if ((transY) > (viewHeight)) {
// _y_up
transY =( viewHeight);


} else if (transY < minY) {

transY = (minY+_y_up);
}

if ((-transY) > (viewHeight)) {
// _y_down
transY = -(viewHeight);

} else if (-transY < minY) {

transY = -(minY+170);
}

values[Matrix.MTRANS_X] = transX;
values[Matrix.MTRANS_Y] = transY;
m.setValues(values);
}

在你的 view.setImageMatrix(matrix) 上面调用它;

关于android - 如何在 Android imageView 中限制图像平移边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7651033/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com