android.graphics.Matrix类用法分析

本文实例讲述了android.graphics.Matrix类用法。分享给大家供大家参考,具体如下:

Matrix类包含了一个3x3的矩阵用来改变坐标,它没有一个构造器来初始化它里边的内容,所以创建实例后需要调用reset()方法生成一个标准matrix,或者调用set..一类的函数,比如setTranslate, setRotate,,该函数将会决定matrix如何来改变坐标。SDK里边没有讲述Matrix的3x3矩阵是如何改变点的坐标值的,但是我在代码里边通过打印那9个点的值时,大致可以得到如下结论,9个值[a,b,c,d,e,f,g,h,i],坐标[x,y],当g=0,h=0,i=1,的时候,坐标是这样变换的,x'=a*x+b*y+c;y'=d*x+e*y+f;当调用setTranslate(10,20)之后,matrix的值就变成[1,0,10,0,1,20,0,0,1];这其实还是没有脱离矩阵乘法,只是不知道后三位是如何应用的。了解这个对后边的连接矩阵的理解有好处,连接矩阵其实就是两个矩阵相乘后得到的新矩阵。

public Matrix()
创建一个标准矩阵,应用后点的坐标不会有任何改变

public Matrix(Matrix src)
创建一个src的深度复制,改变规则与src一致

public boolean equals(Object obj)
如果obj为Matrix并且它的值与当前Matrix对象相等的会将会返回true

public void getValues(float[] values)
获取matrix的那9个值

public boolean invert(Matrix inverse)
将当前矩阵反转,并且反转后的值存入inverse中,如果当前矩阵不能反转,那么inverse不变,返回false,反转规则应该是满足 当前矩阵*inverse=标准矩阵,标准矩阵为[1,0,0,0,1,0,0,0,1];不过其实也不用想得那么复杂,比如当前matrix是setTranslate(10,20),那么反转后的matrix就是setTranslate(-10,-20);

public boolean isIdentity()
判断当前矩阵是否为标准矩阵,这个函数比if (getType() == 0)运行的可能更快一些

public void mapPoints(float[] dst, int dstIndex, float[] src, int srcIndex, int pointCount)
用当前矩阵改变src中的点的坐标,然后将改变后的值对应的存入dst数组中,其中pointCount表示点的数目,(x,y)=(src[2*k],src[2*k+1])表示一个点的坐标,k取整数值,安卓中用数组存储点的坐标值的时候都是按如此法则存储的。

public void mapPoints(float[] pts)
用当前矩阵改变pts中的值,然后存储在pts中,同上,pts也是存储点的坐标的数组

public void mapPoints(float[] dst, float[] src)
用当前矩阵改变src的值,并且存储到数组dst中

public float mapRadius(float radius)
将一个半径为radius的圆的所有点坐标用matrix进行变换后,计算出该圆的半径并且返回该值。注意:要得到正确的值该圆默认是有中心的,个人注:说实话不明白这个函数有什么用

public boolean mapRect(RectF dst,RectF src)
用matrix改变src的4个顶点的坐标,并将改变后的坐标调整后存储到dst中,(RectF只能存储改变后的左上角和右下角坐标,所以需要调整),返回的值跟rectStaysRect()一样,从字面意思可以认为src改变后仍然是RectF,那么就返回true

public boolean mapRect(RectF rect)
用matrix改变rect的4个顶点的坐标,并将改变后的坐标调整后存储到rect当中

public void mapVectors(float[] dst, float[] src)
用matrix改变dst中的向量值并且存储到src当中,注意:setTranslate(x,y)这样的matrix调用了这个函数后不会有任何反应,这样的matrix应该调用mapPoints

public void mapVectors(float[] vecs)
用matrix改变vecs中的值并且存储到vecs当中,同上,注意:setTranslate(x,y)这样的matrix调用了这个函数后不会有任何反应,这样的matrix应该调用mapPoints

public void mapVectors(float[] dst, int dstIndex, float[] src, int srcIndex, int vectorCount)
同上,只不过vectorCount表示向量的数目,dstIndex,srcIndex分别表示各自的起始位置

public boolean postConcat(Matrix other)
将当前的matrix连接到other之后,并且将连接后的值写入当前matrix。 M‘=other*M,连接后变换的效果,相当于先变换M,然后在other变换

public boolean postRotate(float degrees)
相当于这样:

Matrix other=newMatrix();
other.setRotate(degrees);
postConcat(other);

先创建设置一个以0,0为原点旋转degrees度的矩阵other,然后将当前的matrix连接到other之后,并且将连接后的值写入当前matrix。

public boolean postRotate(float degrees, float px, float py)
同上,不过改成这样

Matrix other=newMatrix();
other.setRotate(degrees,px,py);
postConcat(other);

public boolean postScale(float sx, float sy)
同上,无非是改成

other.setScale(sx,sy);

public boolean postScale(float sx, float sy, float px, float py)
同上
public boolean postSkew(float kx, float ky)
public boolean postSkew(float kx, float ky, float px, float py)
public boolean postTranslate(float dx, float dy)
都是一样的,不过是创建的other有所不一样而已

public boolean preConcat(Matrix other)
public boolean preRotate(float degrees)
public boolean preRotate(float degrees, float px, float py)
public boolean preScale(float sx, float sy)
public boolean preScale(float sx, float sy, float px, float py)
public boolean preSkew(float kx, float ky)
public boolean preSkew(float kx, float ky, float px, float py)
public boolean preTranslate(float dx, float dy)
同上边对应的函数功能类似,无非是other被连接在当前matrix之后,然后将连接后的值写入当前matrix当中

public boolean rectStaysRect()
如果该matrix可以将rectF变换成rectF,那么该函数返回true,在标准变换,伸缩变换,平移变换,和多个90度的旋转变换时,该函数是返回true的

public void reset()
将当前matrix设置为标准矩阵

public void set(Matrix src)
将src的内容深度复制给当前矩阵,如果src为null,那么当前矩阵变为标准矩阵

public boolean setConcat(Matrix a,Matrix b)
将当前matrix的值变为a和b的乘积

public boolean setPolyToPoly(float[] src, int srcIndex, float[] dst, int dstIndex, int pointCount)
将当前matrix的值设置为这样的值,对src变换后可以得到dst的数据,pointCount表示点的数目,只能是0-4。设置成功返回true

public boolean setRectToRect(RectF src,RectF dst, Matrix.ScaleToFit stf)
将当前matrix的值设置为这样的值,对src进行变换后可以得到dst,因两者都是RectF,所以该matrix的值只能是伸缩和平移的组合,设置成功了返回true,stf为伸缩参数,这个Matrix.ScaleToFit伸缩参数有什么名堂呢,它有四个常量,每个常量应用后会导致matrix有什么结果呢,根据那4个常量的文字说明可知,CENTER,END,START表示得到的伸缩矩阵m,m对src进行变换后得到dst1,dst1跟src有同样的宽高比例,dst1在dst的内部,不同的地方是CENTER的状态是这样的:dst1.left-dst.left=dst.right-dst1.right,dst1.top-dst.top=dst.bottom-dst1.bottomEND的状态是这样的:dst1.right=dst.right,dst1.bottom=dst.bottom.START的状态是这样的:dst1.left=dst.left,dst1.top=dst.top;至于FILL表示得到的伸缩矩阵m,通过它对src变换后得到的Rect就是dst,完全重合。结论通过RectF(0,0,10,10),  RectF(0,0,20,30)这两个矩阵得到了验证。

public void setRotate(float degrees)
设置当前matrix,使作用于点坐标时使点坐标以点(0,0)为原点旋转degrees度。

public void setRotate(float degrees, float px, float py)
设置当前matrix,使作用于点坐标时使点坐标以点(px,py)为原点旋转degrees度。在转换过程中,该原点不可改变

public void setScale(float sx, float sy, float px, float py)
设置当前matrix,使作用于点坐标时使点坐标以(px,py)为支点伸缩sx,sy倍。(px,py)在转换过程中不能改变。这个解释有点蒙,验证了下发现其实就是x'=(x+px)*sx,y'=(y+py)*sy

public void setScale(float sx, float sy)
这其实就是setScale(sx,sy,0,0);

public void setSinCos(float sinValue, float cosValue)
这其实就是setSinCos(sinValue,cosValue,0,0);

public void setSinCos(float sinValue, float cosValue, float px, float py)
设置当前matrix,以px,py为支点进行旋转变换,变换方式与sinValue,cosValue的值有关,经过验证,可以得到近似换算公式为:

x'=cosValue*x-sinValue*y+(1-cosValue)*px+sinValue*py;
y'=sinValue*x+cosValue*y-sinValue*px+(1-cosValue)*py;

public void setSkew(float kx, float ky, float px, float py)
设置当前matrix,以px,py为支点进行倾斜kx,ky.公式变换应该为

x'=x+kx*(y-py),y'=ky*(x-px)+y;

public void setSkew(float kx, float ky)
相当于setSkew(kx,ky,0,0);

public void setTranslate(float dx, float dy)
设置matrix,应用时使点坐标(x,y)各自平移为(x+dx,y+dy);

public void setValues(float[] values)
复制9个数据给matrix,由于matrix的变形,或许这些数据会变成16位的数据,所以用getValues()可能不能得到与初始化相同的数据。不出意外的话,values的后三位要是0,0,1,否则可能该matrix变化后得不到你想要的点坐标

public String toShortString ()
public String toString ()
返回一个字符串用来描述该目标和数据,该类的子类是鼓励重写该函数的,详细描述该对象的类型和数据。默认的描述方式如下

getClass().getName() + '@' + Integer.toHexString(hashCode())

补充源码如下

package com.hahajlu;
import Android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.RectF;
import android.os.Bundle;
import android.view.View;
public class MatrixActivity extends Activity {
  /** Called when the activity is first created. */
  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(new SampleView(this));
  }
}
class SampleView extends View
{
 Matrix mt1=new Matrix();
 Matrix mt2=new Matrix();
 public SampleView(Context context)
 {
  super(context);
 }
@Override
protected void onDraw(Canvas canvas) {
 // TODO Auto-generated method stub
 float p[]=new float[]{100.f,100.f};
// mt1.setRotate(90);
  mt1.setValues(new float[]{1,0,1,0,1,3,1,2,1});
//  mt1.mapPoints(p);
// mt1.setScale(0.5f, 0.5f);
// mt1.mapPoints(p);
// mt1.setTranslate(10.f, 10.f);
 //mt1.invert(mt2);
// mt1.setRectToRect(new RectF(0,0,10,10), new RectF(0,0,20,30), Matrix.ScaleToFit.FILL);
// mt1.setScale(0.5f, 0.5f, 20f, 30f);
// mt1.setSinCos(0.5f, 0.6f,30.f,20.f);
// mt1.setSkew(10f, 15f, 20f, 32f);
 float values[]=new float[9];
 mt1.getValues(values);
 mt1.mapPoints(p);
 Paint paint=new Paint();
 paint.setColor(Color.BLACK);
 canvas.drawColor(Color.WHITE);
 canvas.drawText("为了", p[0], p[1], paint);
 System.out.println("x="+p[0]+"y="+p[1]);
 for(int i=0;i<9;i++)
  System.out.println("values="+values[i]);
// float radiu=mt1.mapRadius(10.f);
// System.out.println("radiu="+radiu);
 super.onDraw(canvas);
}
}

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android图形与图像处理技巧总结》、《Android开发入门与进阶教程》、《Android调试技巧与常见问题解决方法汇总》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》

希望本文所述对大家Android程序设计有所帮助。

(0)

相关推荐

  • Android中Matrix用法实例分析

    本文实例讲述了Android中Matrix用法.分享给大家供大家参考,具体如下: Matrix ,中文里叫矩阵,高等数学里有介绍,在图像处理方面,主要是用于平面的缩放.平移.旋转等操作. 首先介绍一下矩阵运算.加法和减法就不用说了,对应位相加就好.图像处理,主要用到的是乘法 .下面是一个乘法的公式: 在 Android 里面, Matrix 由 9 个 float 值构成,是一个 3*3 的矩阵.如下图: 解释一下,上面的sinX 和cosX ,表示旋转角度的cos 值和sin值,注意,旋转角度

  • Android Matrix源码详解

    Matrix的数学原理 在Android中,如果你用Matrix进行过图像处理,那么一定知道Matrix这个类.Android中的Matrix是一个3 x 3的矩阵,其内容如下: Matrix的对图像的处理可分为四类基本变换: Translate           平移变换 Rotate                旋转变换 Scale                  缩放变换 Skew                  错切变换 从字面上理解,矩阵中的MSCALE用于处理缩放变换,MSK

  • Android中利用matrix 控制图片的旋转、缩放、移动

    本文主要讲解利用android中Matrix控制图形的旋转缩放移动,具体参见一下代码: 复制代码 代码如下: /**  * 使用矩阵控制图片移动.缩放.旋转  */  public class CommonImgEffectView extends View { private Context context ;      private Bitmap mainBmp , controlBmp ;      private int mainBmpWidth , mainBmpHeight , c

  • Android变形(Transform)之Matrix用法

    引言 最近在研究Android的变形,Android的2D变形(包括缩放,扭曲,平移,旋转等)可以通过Matrix来实现,3D变形可以通过Camera来实现.接下来就将我这俩天研究的东西和大家分享下,先来看看Matrix的用法. 效果图 变形以后 Matrix矩阵 坐标变换矩阵,即一个3*3的矩阵,用来对图形进行坐标变换. 图1.1  A为坐标矩阵,C为原始矩阵,R是A和C矩阵相乘记过,那么可以知道:(矩阵知识,大学没学好的伤不起啊) x' = a*x + b*y + c y' = d*x +

  • android Matrix实现图片随意放大缩小或拖动

    本文实例为大家分享了android Matrix图片随意放大缩小和拖动的具体代码,供大家参考,具体内容如下 step1:新建一个项目DragAndZoom,并准备一张照片放在res/drawable-hdpi目录下,如下图所示: step2: 设置应用的UI界面,在main.xml中设置: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://

  • Android中使用Matrix控制图形变换和制作倒影效果的方法

    最近在使用Matrix进行绘图的操作.对Matrix的一些方法有了一些更深的体会,记下来,以便日后复习. Matrix常用的方法: 一.变换方法: Matrix提供了translate(平移).rotate(旋转).scale(缩放).skew(倾斜)四种操作,这四种操作的内部实现过程都是通过matrix.setValues(-)来设置矩阵的值来达到变换图片的效果. Matrix的每种操作都有set.pre.post三种操作,set是清空队列再添加,pre是在队列最前面插入,post是在队列最后

  • 深入理解Android Matrix理论与使用的详解

    以前在线性代数中学习了矩阵,对矩阵的基本运算有一些了解,前段时间在使用GDI+的时候再次学习如何使用矩阵来变化图像,看了之后在这里总结说明.首先大家看看下面这个3 x 3的矩阵,这个矩阵被分割成4部分.为什么分割成4部分,在后面详细说明. 首先给大家举个简单的例子:现设点P0(x0, y0)进行平移后,移到P(x,y),其中x方向的平移量为△x,y方向的平移量为△y,那么,点P(x,y)的坐标为:x = x0  + △x y = y0  + △y采用矩阵表达上述如下:  上述也类似与图像的平移,

  • 详谈Android中Matrix的set、pre、post的区别

    说set.pre.post的区别之前,先说说Matrix. Matrix包含一个3 X 3的矩阵,专门用于图像变换匹配. Matrix提供了四种操作: •translate(平移) •rotate(旋转) •scale(缩放) •skew(倾斜) 也就是说这4种操作都是对这个3 X 3的矩阵设值来达到变换的效果. Matrix没有结构体,它必须被初始化,通过reset或set方法. OK,Matrix介绍完了,我们来看看set.pre.post的区别. pre是在队列最前面插入,post是在队列

  • android高仿小米时钟(使用Camera和Matrix实现3D效果)

    继续练习自定义View..毕竟熟才能生巧.一直觉得小米的时钟很精美,那这次就搞它~这次除了练习自定义View,还涉及到使用Camera和Matrix实现3D效果. 一个这样的效果,在绘制的时候最好选择一个方向一步一步的绘制,这里我选择由外到内.由深到浅的方向来绘制,代码步骤如下: 1.首先老一套~新建attrs.xml文件,编写自定义属性如时钟背景色.亮色(用于分针.秒针.渐变终止色).暗色(圆弧.刻度线.时针.渐变起始色),新建MiClockView继承View,重写构造方法,获取自定义属性值

  • Android使用Matrix旋转图片模拟碟片加载过程

    今天实现了一个模拟碟片加载过程的小demo,在此展示一下.由于在公司,不好截取动态图片,因此就在这截取两张静态图片看看效果先. 下面简单的将代码列出来. setp1.准备两张用于旋转的图片,如下:loading_disc.png是第一张图片,loading_light.png是第二张图片.      step2.自定义一个View,用来控制这两个图片的旋转.com.oyp.loadingdisk.LoadingDiscView.java package com.oyp.loadingdisk;

  • Android 矩阵ColorMatrix

    中文名:坐标矩阵 高等数学里有介绍,在图像处理方面,主要是用于平面的缩放.平移.旋转等操作. 在Android里面,Matrix由9个float值构成,是一个3*3的矩阵.最好记住.如下图 各个字段的含义: 上面的sinX和cosX,表示旋转角度的cos值和sin值,注意,旋转角度是按顺时针方向计算的. translateX和translateY表示x和y的平移量.scale是缩放的比例,1是不变,2是表示缩放1/2,这样子. 如何使用 set,pre,post方法 Matrix调用一系列set

随机推荐