Matrix 是 Android SDK 提供的一个矩阵类,它代表一个 3 X 3 的矩阵

那么这 9 个浮点数的作用和意义是什么呢,从 Android 官方文档上看,它为这个数组中的每一个元素都定义了一个下标常量

如果我们将这个 float 排成直观的矩阵格式,那它将是下面这样子的

际上我们平常利用 Matrix 来进行 Translate(平移)、Scale(缩放)、Rotate(旋转)的操作,就是在操作着这个矩阵中元素的数值来达到我们想要的效果

从这我们可以看出这个 Matrix 结构中的每个参数发挥着如下作用:

  • MTRANS_X、MTRANS_Y 同时控制着 Translate
  • MSCALE_X、MSCALE_Y 同时控制着 Scale
  • MSCALE_X、MSKEW_X、MSCALE_Y、MSKEW_Y 同时控制着 Rotate
  • 从名称上看,我们可以顺带看出 MSKEW_X、MSKEW_Y 同时控制着 Skew

Scale缩放的控制

scale就是缩放,我们调用Matrix的setScale、preScale、postScale,实际在内部,就是通过修改MSCALE_X和MSCALE_Y来实现的。

Matrix提供了3中不同的方式来设置, setScale、preScale、postScale。

2.setScale、preScale、postScale的区别

(1)、setScale(sx,sy),首先会将该Matrix设置为对角矩阵,即相当于调用reset()方法,然后在设置该Matrix的MSCALE_X和MSCALE_Y直接设置为sx,sy的值 
(2)、preScale(sx,sy),不会重置Matrix,而是直接与Matrix之前的MSCALE_X和MSCALE_Y值结合起来(相乘),M' = M * S(sx, sy)。
(3)、postScale(sx,sy),不会重置Matrix,而是直接与Matrix之前的MSCALE_X和MSCALE_Y值结合起来(相乘),M' = S(sx, sy) * M。
preScale和post都是与之前的Matrix结合起来,那它们之间又有什么区别呢?

(1)、preScale的执行顺序

        ImageView imageView=(ImageView)findViewById(R.id.img);
Matrix matrix=new Matrix();
matrix.preScale(2, 2);//1
matrix.preTranslate(100,100);//2
imageView.setImageMatrix(matrix); float[] points=new float[]{0f,0f};
matrix.mapPoints(points);
Log.i(TAG, "matrix=("+matrix.toString());
Log.i(TAG, "(x,y) =("+points[0]+","+points[1]+")");

结果如下

matrix=(Matrix{[2.0, 0.0, 200.0][0.0, 2.0, 200.0][0.0, 0.0, 1.0]}
(x,y) =(200.0,200.0)

进行变换的顺序是先执行2,1

       ImageView imageView=(ImageView)findViewById(R.id.img);
Matrix matrix=new Matrix();
matrix.preTranslate(100,0);//1
matrix.preScale(2, 2);//2
matrix.preTranslate(100,100);//3
imageView.setImageMatrix(matrix); float[] points=new float[]{0f,0f};
matrix.mapPoints(points);
Log.i(TAG, "matrix=("+matrix.toString());
Log.i(TAG, "(x,y) =("+points[0]+","+points[1]+")");

matrix=(Matrix{[2.0, 0.0, 300.0][0.0, 2.0, 200.0][0.0, 0.0, 1.0]}
(x,y) =(300.0,200.0)

进行变换的顺序是先执行3,2,1

即对于一个Matrix的设置中,所有pre是倒着向后执行的

(2)、postScale的执行顺序

       ImageView imageView=(ImageView)findViewById(R.id.img);
Matrix matrix=new Matrix();
matrix.postScale(2, 2);//
matrix.postTranslate(100,100);//
imageView.setImageMatrix(matrix); float[] points=new float[]{0f,0f};
matrix.mapPoints(points);
Log.i(TAG, "matrix=("+matrix.toString());
Log.i(TAG, "(x,y) =("+points[0]+","+points[1]+")");

matrix=(Matrix{[2.0, 0.0, 100.0][0.0, 2.0, 100.0][0.0, 0.0, 1.0]}
(x,y) =(100.0,100.0)

进行变换的顺序是先执行1,2

        ImageView imageView=(ImageView)findViewById(R.id.img);
Matrix matrix=new Matrix();
matrix.postTranslate(100,0);//
matrix.postScale(2, 2);//
matrix.postTranslate(100,100);//
imageView.setImageMatrix(matrix); float[] points=new float[]{0f,0f};
matrix.mapPoints(points);
Log.i(TAG, "matrix=("+matrix.toString());
Log.i(TAG, "(x,y) =("+points[0]+","+points[1]+")");

matrix=(Matrix{[2.0, 0.0, 300.0][0.0, 2.0, 100.0][0.0, 0.0, 1.0]}
(x,y) =(300.0,100.0)

进行变换的顺序是先执行1,2,3

即对于一个Matrix的设置中,所有post是顺着执行的

(3)、当pre和post交替出现的执行顺序

即对于一个Matrix的设置中,先执行所有的Per(从后往前),之后执行post(顺序)

 最后可以得出结论,在对matrix该次变换之前的所有设置中,先检测有没有setScale,如果有,直接跳到setScale那一步开始执行变换,然后在倒着执行下面所有的pre...变换,在顺着执行所有post....的变换。所以在对Matrix变换设置的时候,一定要注意顺序,不同的顺序,会有不同的结果。

关于imageview matrix的更多相关文章

  1. Android 移动缩放的ImageView

    今天介绍一下Android中怎么实现ImageView的缩放和移动,自定义TouchImageView. public class TouchImageView extends ImageView { ...

  2. 自定义ImageView

    package com.example.myimageview; import android.content.Context;import android.graphics.Bitmap;impor ...

  3. Android 自定义ImageView支持缩放,拖拽,方便复用

    今天刚发了一篇关于ImageView的缩放和拖拽的博客,然后我想了下,将他自定义下,方便我们来复用这个imageView,效果我就不多说了,http://blog.csdn.net/xiaanming ...

  4. Graphics简单汇总

    1.主页面布局文件 activity_main.xml(仅仅有2个button按钮) <?xml version="1.0" encoding="utf-8&quo ...

  5. Android图片旋转,缩放,位移,倾斜,对称完整示例(一)——imageView.setImageMatrix(matrix)和Matrix

    MainActivity如下: import android.os.Bundle; import android.view.MotionEvent; import android.view.View; ...

  6. Bitmap与Matrix旋转ImageView

    Bitmap与Matrix旋转ImageView 标签: matrixfloatbutton测试importlayout 2010-08-23 22:18 8569人阅读 评论(0) 收藏 举报  分 ...

  7. Android图片旋转,缩放,位移,倾斜,对称完整演示样例(一)——imageView.setImageMatrix(matrix)和Matrix

    MainActivity例如以下: import android.os.Bundle; import android.view.MotionEvent; import android.view.Vie ...

  8. Matrix: 利用Matrix来设置ImageView的宽高,使图片能正常显示

    在Android中加载ImageView一般都不会给ImageView的宽高设置一个确切的值,一般都是直接写成: <ImageView android:id="@+id/iv_test ...

  9. ImageView缩放选项

    ImageView.ScaleType 将图片边界缩放到所在view边界时的缩放选项. Options for scaling the bounds of an image to the bounds ...

随机推荐

  1. Luogu 3586 [POI2015]LOG

    考虑离散化后开权值线段树. 设序列中不小于$s$的数有$cnt$个,小于$s$的数的和为$sum$. 那么操作Z能成功的充要条件是$sum \geq (c - cnt) * s$. 如果序列中不小于$ ...

  2. SDUT 3402 数据结构实验之排序五:归并求逆序数

    数据结构实验之排序五:归并求逆序数 Time Limit: 40MS Memory Limit: 65536KB Submit Statistic Problem Description 对于数列a1 ...

  3. netty源码阅读之UnpooledByteBufAllocator

    使用IDEA阅读源码Navigate下面的工具是个好东西 .可以帮助分析类的结构等 ByteBufAllocator主要用来生成三种ByteBuf :HeadBuffer,DirectBuffer,C ...

  4. C#中virtual和abstract区别,举例子

    virtual和abstract都是用来修饰父类的,通过覆盖父类的定义,让子类重新定义. 它们有一个共同点:如果用来修饰方法,前面必须添加public,要不然就会出现编译错误:虚拟方法或抽象方法是不能 ...

  5. C#使用SendMessage实现进程间通信的方法

    本文实例讲述了C#使用SendMessage实现进程间通信的方法.分享给大家供大家参考.具体分析如下: 为了深入理解消息机制,先来做一个测试项目 在新建项目的Form1的代码中,加入方法: ? 1 2 ...

  6. docker,mysql,Navicat

    Navicat破解网址  https://www.jianshu.com/p/5f693b4c9468 docker pull mysql docker run -d -p 3306:3306 --n ...

  7. Locust压力测试使用总结

    https://blog.csdn.net/jojoy_tester/article/details/77926470  参考网址 上次做接口压力测试前一直研究使用jmeter,本以为可以拿来使用了, ...

  8. jQuery回车触发事件

    举例: 需求:要求回车触发下一步 Html部分 <div style="margin-top: 25px;"> <a href="#" cla ...

  9. Vue知识分享一

    最近想着把之前学的Vue的知识整理一下,方便在公司和同事一起分享.我想要按照下面几个方面去说一下,我对vue的学习理解. 一.什么是VUE vue.js是一个用来开发Web界面的前端库,是很轻量级的工 ...

  10. sql_trace基本用法

    sql_trace是oracle提供的一个非常好的跟踪工具,主要用来检查数据库的异常情况,通过跟踪数据库的活动,找到有问题的语句. 一.概述:    SQL_TRACE是Oracle的一个非常强大的工 ...