wordpress影视采集网站,楚雄州住房和城乡建设局网站,网站设计包括什么软件,平面设计制作Matrix结构
在Android开发中#xff0c;矩阵是一个非常强大且有趣的工具。位于图形库中#xff0c;android.graphics.Matrix 是一个 33 的 float 矩阵#xff0c;其主要作用是坐标变换。
它的结构大概是这样的#xff1a; 其中每个位置的数值作用和其名称所代表的的含义是…Matrix结构
在Android开发中矩阵是一个非常强大且有趣的工具。位于图形库中android.graphics.Matrix 是一个 3×3 的 float 矩阵其主要作用是坐标变换。
它的结构大概是这样的 其中每个位置的数值作用和其名称所代表的的含义是一一对应的
MSCALE_X、MSCALE_Y控制缩放MTRANS_X、MTRANS_Y控制平移MSKEW_X、MSKEW_X控制错切MSCALE_X、MSCALE_Y、MSKEW_X、MSKEW_X控制旋转MPERSP_0、MPERSP_1、MPERSP_2控制透视 原理应用
在Android的很多地方其实都使用到了Matrix的方法比如图片、Canvas、动画等我们这里以图片为例假设自定义view在onDraw函数中我们先绘制一个坐标系然后来绘制一张图片。
// 平移画布
canvas.translate(mWidth/2,mHeight/2);
mPaint.setStrokeWidth(1);// 恢复画笔默认宽度// 创建矩阵
mMatrix new Matrix();
/*** 测试的Matrix操作*/
// 接下来要加入的代码
// 绘制图片
canvas.drawBitmap(mBitmap,mMatrix,null);1、缩放变换
将点的X轴和y轴方向分别缩放k0和k1倍。x、y的计算结果为 : 用矩阵表示 为什么要写成三维的矩阵呢因为android视图实际上就是三维的只是目前我们才讨论到二维后面会知道。 效果如图所示 现在我们使用Matrix自带的setScale方法:
/*** 测试的Matrix操作*/
mMatrix.setScale(0.5f,0.5f);Log.d(TAG,mMatrix.toString());// Log
D/TAG: Matrix{[0.5, 0.0, 0.0][0.0, 0.5, 0.0][0.0, 0.0, 1.0]}2、错切变换
错切变换的效果就是让所有点的x坐标(或者y坐标)保持不变而对于的y坐标(或者x坐标)则按照比例发生平移。
水平错切
保持y不变但其x坐标则按比例发生平移。x、y的计算结果为 : 用矩阵表示 : 效果如图所示 : 垂直错切
保持x不变但其y坐标则按比例发生平移。x、y的计算结果为 : 用矩阵表示 : 效果如图所示 : 当然你也可以同时进行水平错切和垂直错切的变换。
使用示例
现在我们使用Matrix自带的setSkew方法 :
/*** 测试的Matrix操作*/
mMatrix.setSkew(0f,0.5f);
Log.d(TAG,mMatrix.toString());// Log
D/TAG: Matrix{[1.0, 0.0, 0.0][0.5, 1.0, 0.0][0.0, 0.0, 1.0]}3、平移变换
假设有坐标为x0,y0将其点进行平移移动到点x,y其x、y计算结果为 : 用矩阵表示 : 效果如图所示 : 使用示例
现在我们使用Matrix自带的setTranslate方法 :
/*** 测试的Matrix操作*/
mMatrix.setTranslate(-200,-200);
Log.d(TAG,mMatrix.toString());// Log
D/TAG: Matrix{[1.0, 0.0, -200.0][0.0, 1.0, -200.0][0.0, 0.0, 1.0]}4、旋转变换
假设有一点坐标为x0, y0距离原点为r与x轴方向的夹角为α绕原点旋转θ后变换为点x, y其变换前后各点计算结果为 : 用矩阵表示为 : 效果如图所示 : 使用示例
现在我们使用Matrix自带的setRotate方法 :
/*** 测试的Matrix操作*/
mMatrix.setRotate(180);
Log.d(TAG,mMatrix.toString());// Log
D/TAG: Matrix{[-1.0, -0.0, 0.0][0.0, -1.0, 0.0][0.0, 0.0, 1.0]}5、透视变换
我们在之前的变换中一直没有说到最后一行的三个参数MPERSP_0、MPERSP_1、MPERSP_2这里我们来稍微聊聊这三个参数所表示的透视。我们一般在图像中的一个点将使用如下方式进行表示(x, y, w)而Android中的二维矩阵计算是基于齐次坐标的齐次坐标要求w的值为1所以这个点的表示方法就变化为(x/w, y/w, 1)。 透视变换的效果其实类似于投影机的方式我们看下w3时坐标(15,21,3)的效果 : 现在看下(15,21,3)计算出的齐次坐标系坐标(5,7,1)的效果 : 根据这个规则也就解释了我们在使用过程中修改MPERSP_2参数时图像会发生的类似缩放的效果其实就是透视变换的效果。
使用示例
现在我们使用Matrix自带的setValues方法 :
/*** 测试的Matrix操作*/
mMatrix.setValues(new float[]{1, 0, 0, 0, 1, 0, 0, 0, 1.5f});
Log.d(TAG,mMatrix.toString());// Log
D/TAG: Matrix{[1.0, 0.0, 0.0][0.0, 1.0, 0.0][0.0, 0.0, 1.5]}Matrix前乘与后乘
Matrix前乘与后乘的情况就类似于线性代数上的情况。
前乘
前乘相当于原始矩阵乘以变化矩阵。
示例如下:
mMatrix.reset();
mMatrix.preScale(sx,sy);
mMatrix.preTranslate(tx,ty);用矩阵表示为 : 后乘
后乘相当于变化矩阵乘以原始矩阵
mMatrix.reset();
mMatrix.postScale(sx,sy);
mMatrix.postTranslate(tx,ty);那么矩阵的复合操作就是前乘后乘的组合了具体的使用的时候注意一下。这里也只是基础的介绍至少简单知道API参数对应矩阵的位置变化情况了。