wordpress 网站提速,wordpress 调用关键词,wordpress 手机页面停,产品管理系统软件在Android、前端或者别的平台的软件开发中#xff0c;有时会遇到类似如下需求#xff1a;
将某个图片显示到指定的区域#xff1b;要求不改变图片本身的宽高比#xff0c;进行缩放#xff1b;要求最大限度的居中填充到显示区域。
以下示意图可以简单描绘该需求 以Androi…在Android、前端或者别的平台的软件开发中有时会遇到类似如下需求
将某个图片显示到指定的区域要求不改变图片本身的宽高比进行缩放要求最大限度的居中填充到显示区域。
以下示意图可以简单描绘该需求 以Android平台为例如果我们的目标显示对象为Imageview那么很简单只要如下设置即可 ImageView xmlns:androidhttp://schemas.android.com/apk/res/androidandroid:layout_widthwrap_contentandroid:layout_heightwrap_contentandroid:layout_gravitycenterandroid:scaleTypefitCenterandroid:srcdrawable/image /其中实现以上需求最关键的代码为 android:scaleType“fitCenter”。感兴趣的同学可以去查看源码探究scaleType属性设置为fitCenter之后底层代码是如何实现的。
但是如果我们的显示区域只是一个自定义view中特定坐标的区域如x1, y1, x2, y2的矩形区域。不了解Matrix的同学可能第一反应就是根据图片本身的宽高以及目标显示区域的宽高去计算一个缩放比如下代码
public void drawBitmapFillRegion(Canvas canvas, Bitmap bitmap, Rect targetRect) {// 目标区域的宽高int targetWidth targetRect.width();int targetHeight targetRect.height();// Bitmap 的宽高int bitmapWidth bitmap.getWidth();int bitmapHeight bitmap.getHeight();// 计算宽高比float scale Math.max((float) targetWidth / bitmapWidth, (float) targetHeight / bitmapHeight);// 计算缩放后的宽高float scaledWidth scale * bitmapWidth;float scaledHeight scale * bitmapHeight;// 计算偏移float offsetX targetRect.left (targetWidth - scaledWidth) / 2;float offsetY targetRect.top (targetHeight - scaledHeight) / 2;// 设置 Matrix 进行缩放和平移Matrix matrix new Matrix();matrix.setScale(scale, scale);matrix.postTranslate(offsetX, offsetY);// 绘制 Bitmapcanvas.drawBitmap(bitmap, matrix, null);
}
但是当你深入研究Matrix中的方法你就会发现根本不需要这么麻烦以下几句即可简单完美实现
public void drawBitmapFillRegion(Canvas canvas, Bitmap bitmap) {// 定义源矩形即 Bitmap 的边界RectF srcRect new RectF(0, 0, bitmap.getWidth(), bitmap.getHeight());RectF srcRect new RectF(x1, y1, x2, y2);// 设置 Matrix 进行缩放和平移Matrix matrix new Matrix();matrix.setRectToRect(srcRect, targetRect, Matrix.ScaleToFit.CENTER);// 绘制 Bitmapcanvas.drawBitmap(bitmap, matrix, null);
}
其中最关键的方法便是 setRectToRect它可以计算出将某个矩形映射到另外一个矩形所需的矩阵并将这个矩阵赋值给调用方。其实Matrix还有很多使用强大的接口感兴趣的同学可以系统深入探索下。尤其是工作学习当中涉及到图片缩放、裁剪、旋转、平移等操作的同学更应该学习下。