如何在 ImageView 中缩放特定的 XY 坐标(点)
How to zoom at particular XY coordinate(points) in ImageView
我已将此 PhotoView 库用于自定义 ImageView。我想在特定点缩放图像。这是我找到的方法 setScale(float scale, float focalX, float focalY, boolean animate)
我想知道我可以传递什么 focalX
和 focalY
的值,我有当前传递的 X 和 Y 坐标,它缩放到非常不同的位置。
这是一个片段,
intResultX = intTotalX / intArraySize;
intResultY = intTotalY / intArraySize;
mMap.setScale(5, intResultX, intResultY, true);
将缩放设置为指定比例。图像将以点为中心
(焦点X,焦点Y)。这些浮点数的范围从 0 到 1,表示焦点
作为视图左侧和顶部的一小部分。比如左上角
图像的角将是 (0, 0)。右下角是 (1, 1).
public void setZoom(float scale, float focusX, float focusY, ScaleType scaleType) {
/*setZoom can be called before the image is on the screen, but at this point,
image and view sizes have not yet been calculated in onMeasure. Thus, we should
delay calling setZoom until the view has been measured.*/
if (!onDrawReady) {
delayedZoomVariables = new ZoomVariables(scale, focusX, focusY, scaleType);
return;
}
if (scaleType != mScaleType) {
setScaleType(scaleType);
}
resetZoom();
scaleImage(scale, viewWidth / 2, viewHeight / 2, true);
matrix.getValues(m);
m[Matrix.MTRANS_X] = -((focusX * getImageWidth()) - (viewWidth * 0.5f));
m[Matrix.MTRANS_Y] = -((focusY * getImageHeight()) - (viewHeight * 0.5f));
matrix.setValues(m);
fixTrans();
setImageMatrix(matrix);
}
希望这对您有所帮助。编码愉快。
要在 Imageview 中缩放特定的 XY 坐标,您可以传递 focalX 和 focalY 的值以及比例(必须介于 PhotoView 的最大比例和最小比例之间)和布尔值来设置动画。
获取最大-最小尺度的代码:
mPhotoView.getMinimumScale();
mPhotoView.getMaximumScale();
focalX 和 focalY 可以是屏幕上的任意点,这里我举了两个例子,一个是屏幕中心,一个是左上角。以下是两种情况的代码。
代码:
Random r = new Random();
float minScale = mPhotoView.getMinimumScale();
float maxScale = mPhotoView.getMaximumScale();
float randomScale = minScale + (r.nextFloat() * (maxScale - minScale));
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int height = displayMetrics.heightPixels;
int width = displayMetrics.widthPixels;
int centerX=width/2;
int centerY =height/2;
/*pass a value of focalX and focalY to scale image to center*/
//mPhotoView.setScale(randomScale, centerX, centerY, true);
/*pass a value of focalX and focalY to scale image to top left corner*/
mPhotoView.setScale(randomScale, 0, 0, true);
我已将此 PhotoView 库用于自定义 ImageView。我想在特定点缩放图像。这是我找到的方法 setScale(float scale, float focalX, float focalY, boolean animate)
我想知道我可以传递什么 focalX
和 focalY
的值,我有当前传递的 X 和 Y 坐标,它缩放到非常不同的位置。
这是一个片段,
intResultX = intTotalX / intArraySize;
intResultY = intTotalY / intArraySize;
mMap.setScale(5, intResultX, intResultY, true);
将缩放设置为指定比例。图像将以点为中心 (焦点X,焦点Y)。这些浮点数的范围从 0 到 1,表示焦点 作为视图左侧和顶部的一小部分。比如左上角 图像的角将是 (0, 0)。右下角是 (1, 1).
public void setZoom(float scale, float focusX, float focusY, ScaleType scaleType) {
/*setZoom can be called before the image is on the screen, but at this point,
image and view sizes have not yet been calculated in onMeasure. Thus, we should
delay calling setZoom until the view has been measured.*/
if (!onDrawReady) {
delayedZoomVariables = new ZoomVariables(scale, focusX, focusY, scaleType);
return;
}
if (scaleType != mScaleType) {
setScaleType(scaleType);
}
resetZoom();
scaleImage(scale, viewWidth / 2, viewHeight / 2, true);
matrix.getValues(m);
m[Matrix.MTRANS_X] = -((focusX * getImageWidth()) - (viewWidth * 0.5f));
m[Matrix.MTRANS_Y] = -((focusY * getImageHeight()) - (viewHeight * 0.5f));
matrix.setValues(m);
fixTrans();
setImageMatrix(matrix);
}
希望这对您有所帮助。编码愉快。
要在 Imageview 中缩放特定的 XY 坐标,您可以传递 focalX 和 focalY 的值以及比例(必须介于 PhotoView 的最大比例和最小比例之间)和布尔值来设置动画。
获取最大-最小尺度的代码:
mPhotoView.getMinimumScale();
mPhotoView.getMaximumScale();
focalX 和 focalY 可以是屏幕上的任意点,这里我举了两个例子,一个是屏幕中心,一个是左上角。以下是两种情况的代码。
代码:
Random r = new Random();
float minScale = mPhotoView.getMinimumScale();
float maxScale = mPhotoView.getMaximumScale();
float randomScale = minScale + (r.nextFloat() * (maxScale - minScale));
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
int height = displayMetrics.heightPixels;
int width = displayMetrics.widthPixels;
int centerX=width/2;
int centerY =height/2;
/*pass a value of focalX and focalY to scale image to center*/
//mPhotoView.setScale(randomScale, centerX, centerY, true);
/*pass a value of focalX and focalY to scale image to top left corner*/
mPhotoView.setScale(randomScale, 0, 0, true);