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


3.受矩阵乘法影响,后面的执行的操作可能会影响到之前的操作 。
使用时需要注意构造顺序 。
特殊方法
1.
boolean setPolyToPoly (float[] src,// 原始数组 src [x,y],存储内容为一组点int srcIndex,// 原始数组开始位置float[] dst,// 目标数组 dst [x,y],存储内容为一组点int dstIndex,// 目标数组开始位置int pointCount) // 测控点的数量 取值范围是: 0到4
Poly全称是,多边形的意思,了解了意思大致就能知道这个方法是做什么用的了,应该与PS中自由变换中的扭曲有点类似 。
从参数我们可以了解到最多可以支持4个点,这四个点通常为图形的四个角,可以通过这四个角将视图从矩形变换成其他形状 。
简单示例:
public class MatrixSetPolyToPolyTest extends View {private Bitmap mBitmap;// 要绘制的图片private Matrix mPolyMatrix;// 测试setPolyToPoly用的Matrixpublic MatrixSetPolyToPolyTest(Context context) {super(context);initBitmapAndMatrix();}private void initBitmapAndMatrix() {mBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.poly_test);mPolyMatrix = new Matrix();float[] src = http://www.kingceram.com/post/{0, 0,// 左上mBitmap.getWidth(), 0,// 右上mBitmap.getWidth(), mBitmap.getHeight(),// 右下0, mBitmap.getHeight()};// 左下float[] dst = {0, 0,// 左上mBitmap.getWidth(), 400,// 右上mBitmap.getWidth(), mBitmap.getHeight() - 200,// 右下0, mBitmap.getHeight()};// 左下// 核心要点mPolyMatrix.setPolyToPoly(src, 0, dst, 0, src.length>> 1); // src.length >> 1 为位移运算 相当于处以2// 此处为了更好的显示对图片进行了等比缩放和平移(图片本身有点大)mPolyMatrix.postScale(0.26f, 0.26f);mPolyMatrix.postTranslate(0,200);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);// 根据Matrix绘制一个变换后的图片canvas.drawBitmap(mBitmap, mPolyMatrix, null);}}
我们知道支持点的个数为0到4个,四个一般指图形的四个角,属于最常用的一种情形,但前面几种是什么情况呢?
发布此文的时候之所以没有讲解0到3的情况,是因为前面的几种情况在实际开发中很少会出现
摘要
相当于reset
相当于
可以进行 缩放、旋转、平移 变换
可以进行 缩放、旋转、平移、错切 变换
可以进行 缩放、旋转、平移、错切以及任何形变
随着数值增大的可以操作性也越来越强
测控点选取位置?
测控点可以选择任何你认为方便的位置,只要src与dst一一对应即可 。不过为了方便,通常会选择一些特殊的点: 图形的四个角,边线的中心点以及图形的中心点等 。不过有一点需要注意,测控点选取都应当是不重复的(src与dst均是如此),如果选取了重复的点会直接导致测量失效,这也意味着,你不允许将一个方形(四个点)映射为三角形(四个点,但其中两个位置重叠),但可以接近于三角形 。。
作用范围?
作用范围当然是设置了的全部区域,如果你将这个赋值给了,它的作用范围就是整个画布,如果你赋值给了,它的作用范围就是整张图片 。
接下来用示例演示一下,所有示例的src均为图片大小,dst根据手势变化 。
为0
为0和reset是等价的,而不是保持不变,在最底层的实现中可以看到这样的代码:
if (0 == count) {this->reset();return true;}
为1
为0和是等价的,在最底层的实现中可以看到这样的代码:
if (1 == count) {this->setTranslate(dst[0].fX - src[0].fX, dst[0].fY - src[0].fY);return true;}
平移的距离是dst - src.
当测控点为1的时候,由于你只有一个点可以控制,所以你只能拖拽着它在2D平面上滑动 。
为2
当为2的时候,可以做缩放、平移和旋转 。