Android自定义系列——12.Matri详解( 四 )


为3
当为3的时候,可以做缩放、平移、旋转和错切 。
为4
当为4的时候,你可以将图像拉伸为任意四边形 。
上面已经用图例比较详细的展示了不同操控点个数的情况,如果你依旧存在疑问,可以获取代码自己试一下 。
2.
boolean setRectToRect (RectF src,// 源区域RectF dst,// 目标区域Matrix.ScaleToFit stf)// 缩放适配模式
简单来说就是将源矩形的内容填充到目标矩形中,然而在大多数的情况下,源矩形和目标矩形的长宽比是不一致的,到底该如何填充呢,这个填充的模式就由第三个参数 stf 来确定 。
是一个枚举类型,共包含了四种模式:
模式摘要
居中,对src等比例缩放,将其居中放置在dst中 。
START
顶部,对src等比例缩放,将其放置在dst的左上角 。
END
底部,对src等比例缩放,将其放置在dst的右下角 。
FILL
充满,拉伸src的宽和高,使其完全填充满dst 。
下面我们看一下不同宽高比的src与dst在不同模式下是怎样的 。
假设灰色部分是dst,橙色部分是src,由于是测试不同宽高比,示例中让dst保持不变,看两种宽高比的src在不同模式下填充的位置 。
下面用代码演示一下居中的示例:
public class MatrixSetRectToRectTest extends View {private static final String TAG = "MatrixSetRectToRectTest";private int mViewWidth, mViewHeight;private Bitmap mBitmap;// 要绘制的图片private Matrix mRectMatrix;// 测试etRectToRect用的Matrixpublic MatrixSetRectToRectTest(Context context) {super(context);mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.rect_test);mRectMatrix = new Matrix();}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);mViewWidth = w;mViewHeight = h;}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);RectF src= http://www.kingceram.com/post/new RectF(0, 0, mBitmap.getWidth(), mBitmap.getHeight() );RectF dst = new RectF(0, 0, mViewWidth, mViewHeight );// 核心要点mRectMatrix.setRectToRect(src,dst, Matrix.ScaleToFit.CENTER);// 根据Matrix绘制一个变换后的图片canvas.drawBitmap(mBitmap, mRectMatrix, new Paint());}}
3.
判断矩形经过变换后是否仍为矩形,假如进行了平移、缩放则画布仅仅是位置和大小改变,矩形变换后仍然为矩形,但进行了非90度倍数的旋转或者错切,则矩形变换后就不再是矩形了,这个很好理解,不过多赘述,顺便说一下,前面的方法的返回值就是根据来判断的 。
4.
设置值,这个是控制旋转的,由于已经封装好了方法,所以这个并不常用,在此仅作概述 。
// 方法一void setSinCos (float sinValue,// 旋转角度的sin值float cosValue)// 旋转角度的cos值// 方法二void setSinCos (float sinValue,// 旋转角度的sin值float cosValue,// 旋转角度的cos值float px,// 中心位置x坐标float py)// 中心位置y坐标
简单测试:
Matrix matrix = new Matrix();// 旋转90度// sin90=1// cos90=0matrix.setSinCos(1f, 0f);Log.i(TAG, "setSinCos:"+matrix.toShortString());// 重置matrix.reset();// 旋转90度matrix.setRotate(90);Log.i(TAG, "setRotate:"+matrix.toShortString());
结果:
setSinCos:[0.0, -1.0, 0.0][1.0, 0.0, 0.0][0.0, 0.0, 1.0]setRotate:[0.0, -1.0, 0.0][1.0, 0.0, 0.0][0.0, 0.0, 1.0]
矩阵相关
矩阵相关的函数就属于哪一种非常靠近底层的东西了,大部分开发者很少直接接触这些东西,想要弄明白这个可以回去请教你们的线性代数老师,这里也仅作概述 。
方法摘要
求矩阵的逆矩阵
判断当前矩阵是否为仿射矩阵,API21(5.0)才添加的方法 。
判断当前矩阵是否为单位矩阵 。