计算获取的ImageView图片显示时的实际大小(ps:这里会用到可见ImageView的宽高主要是因为我需要根据可见ImageView的宽高来设置其他控件的宽高,还有就是后面关于图像与屏幕坐标点的转换会需要用到)
private void setLayoutParams() {
int[] size = ImageUtils.getRealImgShowSize(mImageView);
mRealImgShowWidth = size[0];
mRealImgShowHeight = size[1];
ViewGroup.LayoutParams params = mImageView.getLayoutParams();
params.height = mRealImgShowHeight;
params.width = mRealImgShowWidth;
mImageView.setLayoutParams(params);
}
//0:宽 1:高
public static int[] getRealImgShowSize(ImageView imageview){
Rect rect=imageview.getDrawable().getBounds();
//可见image的宽高
int scaledHeight = rect.height();
int scaledWidth = rect.width();
//获得ImageView中Image的变换矩阵
Matrix matrix= imageview.getImageMatrix();
float[] values = new float[10];
matrix.getValues(values);
//Image在绘制过程中的变换矩阵,从中获得x和y方向的缩放系数
float sx = values[0];
float sy = values[4];
//计算Image在屏幕上实际绘制的宽高
int realImgShowWidth =(int) (scaledWidth * sx);
int realImgShowHeight =(int)( scaledHeight * sy);
int[] size=new int[]{realImgShowWidth,realImgShowHeight};
return
//屏幕坐标转图片坐标
private List<Point> getBitmapPoints(Bitmap original, Map<Integer, PointF> points) {
List<Point> srccorners = new ArrayList<>();
float xRatio = (float) original.getWidth() /mRealImgShowWidth;//mRealImgShowWidth=ImageView.getWidth()
float yRatio = (float) original.getHeight() / mRealImgShowHeight;
float x1 = (points.get(0).x) * xRatio;
float x2 = (points.get(1).x) * xRatio;
float x3 = (points.get(2).x) * xRatio;
float x4 = (points.get(3).x) * xRatio;
float y1 = (points.get(0).y) * yRatio;
float y2 = (points.get(1).y) * yRatio;
float y3 = (points.get(2).y) * yRatio;
float y4 = (points.get(3).y) * yRatio;
srccorners.add(new Point(x1, y1));
srccorners.add(new Point(x2, y2));
srccorners.add(new Point(x3, y3));
srccorners.add(new Point(x4, y4));
return srccorners;
}
//图片坐标转屏幕坐标
private Map<Integer,PointF> getScreenPoints(Bitmap original,Map<Integer, PointF> points){
float xRatio = (float) original.getWidth() / mRealImgShowWidth;
float yRatio = (float) original.getHeight() / mRealImgShowHeight;
Map<Integer,PointF> screenPoints=new HashMap<>();
float x1 = points.get(0).x/xRatio;
float x2 = points.get(1).x / xRatio;
float x3 = points.get(2).x / xRatio;
float x4 =points.get(3).x / xRatio;
float y1 = points.get(0).y / yRatio;
float y2 = points.get(1).y/ yRatio;
float y3 = points.get(2).y/ yRatio;
float y4 = points.get(3).y / yRatio;
screenPoints.put(0,new PointF(x1,y1));
screenPoints.put(1,new PointF(x2,y2));
screenPoints.put(2,new PointF(x3,y3));
screenPoints.put(3,new PointF(x4,y4));
return