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


1.
求矩阵的逆矩阵,简而言之就是计算与之前相反的矩阵,如果之前是平移200px,则求的矩阵为反向平移200px,如果之前是缩小到0.5f,则结果是放大到2倍 。
boolean invert (Matrix inverse)
简单测试:
Matrix matrix = new Matrix();Matrix invert = new Matrix();matrix.setTranslate(200,500);Log.e(TAG, "before - matrix "+matrix.toShortString() );Boolean result = matrix.invert(invert);Log.e(TAG, "after- result "+result );Log.e(TAG, "after- matrix "+matrix.toShortString() );Log.e(TAG, "after- invert "+invert.toShortString() );
结果:
before - matrix [1.0, 0.0, 200.0][0.0, 1.0, 500.0][0.0, 0.0, 1.0]after- result trueafter- matrix [1.0, 0.0, 200.0][0.0, 1.0, 500.0][0.0, 0.0, 1.0]after- invert [1.0, 0.0, -200.0][0.0, 1.0, -500.0][0.0, 0.0, 1.0]
2.
判断矩阵是否是仿射矩阵,你无论如何操作结果始终都为true 。
这是为什么呢?因为迄今为止我们使用的所有变换都是仿射变换,那变换出来的矩阵自然是仿射矩阵喽 。
判断是否是仿射矩阵最重要的一点就是,直线是否仍为直线,简单想一下就知道,不论平移,旋转,错切,缩放,直线变换后最终仍为直线,要想让的结果变为false,除非你能把直线变成弯的
简单测试:
Matrix matrix = new Matrix();Log.i(TAG,"isAffine="+matrix.isAffine());matrix.postTranslate(200,0);matrix.postScale(0.5f, 1);matrix.postSkew(0,1);matrix.postRotate(56);Log.i(TAG,"isAffine="+matrix.isAffine());
结果:
isAffine=trueisAffine=true
3.
判断是否为单位矩阵
新创建的和重置后的都是单位矩阵,不过,只要随意操作一步,就不在是单位矩阵了 。
简单测试:
Matrix matrix = new Matrix();Log.i(TAG,"isIdentity="+matrix.isIdentity());matrix.postTranslate(200,0);Log.i(TAG,"isIdentity="+matrix.isIdentity());
结果:
isIdentity=trueisIdentity=false
实用技巧
网上有很多教程讲利用变换来制作镜像倒影等,这都属于的基本应用
1.获取View在屏幕上的绝对位置
最根本的作用就是坐标映射,将View的相对坐标映射为屏幕的绝对坐标,也提到过我们在函数的中获取到到并不是单位矩阵,结合这两点,聪明的你肯定想到了我们可以从的入手取得View在屏幕上的绝对位置 。
不过,这也仅仅是一个然并卵的小技巧而已,使用同样可以获取View在屏幕的位置
简单示例:
@Overrideprotected void onDraw(Canvas canvas) {float[] values = new float[9];int[] location1 = new int[2];Matrix matrix = canvas.getMatrix();matrix.getValues(values);location1[0] = (int) values[2];location1[1] = (int) values[5];Log.i(TAG, "location1 = " + Arrays.toString(location1));int[] location2 = new int[2];this.getLocationOnScreen(location2);Log.i(TAG, "location2 = " + Arrays.toString(location2));}
结果:
location1 = [0, 243]location2 = [0, 243]
【Android自定义系列——12.Matri详解】2.利用制造3D效果