Android中Matrix用法实例分析

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

Matrix ,中文里叫矩阵,高等数学里有介绍,在图像处理方面,主要是用于平面的缩放、平移、旋转等操作。

首先介绍一下矩阵运算。加法和减法就不用说了,对应位相加就好。图像处理,主要用到的是乘法 。下面是一个乘法的公式:

在 Android 里面, Matrix 由 9 个 float 值构成,是一个 3*3 的矩阵。如下图:

解释一下,上面的sinX 和cosX ,表示旋转角度的cos 值和sin值,注意,旋转角度是按顺时针方向计算的。 translateX 和 translateY 表示 x 和 y 的平移量。 scale 是缩放的比例, 1 是不变, 2 是表示缩放 1/2 。

Matrix的操作,总共分为translate(平移),rotate(旋转),scale(缩放)和skew(倾斜)四种,每一种变换在Android的API里都提供了set, post和pre三种操作方式,除了translate,其他三种操作都可以指定中心点。

set是直接设置Matrix的值,每次set一次,整个Matrix的数组都会变掉。

post是后乘,当前的矩阵乘以参数给出的矩阵。可以连续多次使用post,来完成所需的整个变换。例如,要将一个图片旋转30度,然后平移到(100,100)的地方,那么可以这样做:Matrix m =  new  Matrix();  m.postRotate(30 );  m.postTranslate(100 ,  100 ); 这样就达到了想要的效果。

pre是前乘,参数给出的矩阵乘以当前的矩阵。所以操作是在当前矩阵的最前面发生的。例如上面的例子,如果用pre的话,就要这样:Matrix m =  new  Matrix(); m.setTranslate(100 ,  100 );  m.preRotate(30 );

旋转、缩放和倾斜都可以围绕一个中心点来进行,如果不指定,默认情况下,是围绕(0,0)点来进行。

特别注意:

Matrix的操作,总共分为translate(平移),rotate(旋转),scale(缩放)和skew(倾斜)四种,每一种变换在Android的API里都提供了set, post和pre三种操作方式,除了translate,其他三种操作都可以指定中心点。

set是直接设置Matrix的值,每次set一次,整个Matrix的数组都会变掉。

post是后乘,当前的矩阵乘以参数给出的矩阵。可以连续多次使用post,来完成所需的整个变换。

镜面效果:

倒影效果:

图片的合成(水印):

不多说了,直接上代码了。

MainActivity.java里的主要代码如下:

package net.loonggg.testmatrix;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.os.Bundle;
import android.view.Window;
import android.widget.ImageView;
public class MainActivity extends Activity {
  private ImageView iv1, iv2;
  private Canvas canvas;
  private Paint paint;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_main);
    iv1 = (ImageView) findViewById(R.id.iv1);
    iv2 = (ImageView) findViewById(R.id.iv2);
    Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(),
        R.drawable.weibo);
    Bitmap updateBitmap = Bitmap.createBitmap(bitmap1.getWidth() * 2,
        bitmap1.getHeight() * 2, bitmap1.getConfig());
    canvas = new Canvas(updateBitmap);
    paint = new Paint();
    paint.setColor(Color.BLACK);
    Matrix matrix = new Matrix();
    // setMirrorOne(bitmap1, matrix);
    // setInvertedImage(bitmap1, matrix);
    // setBaseChange(matrix);
    canvas.drawBitmap(bitmap1, matrix, paint);
    setImageSynthesis(matrix);
    iv1.setImageBitmap(bitmap1);
    iv2.setImageBitmap(updateBitmap);
  }
  /**
   * 还有一些基本变化
   */
  private void setBaseChange(Matrix matrix) {
    // matrix.setRotate(60);// 这是旋转多少度
    // matrix.setRotate(degrees, px, py);//这个方法是以哪个点为中心进行旋转多少度
    // matrix.setSkew(kx, ky);//设置倾斜,以x轴倾斜,还是y轴
    // 倾斜x和y轴,以(100,100)为中心。
    // matrix.postSkew(0 .2f, 0 .2f, 100 , 100 );
    // matrix.setScale(0.5f, 1);//缩放宽度变为原来的一半,高度不变
  }
  /**
   * 设置倒影效果
   *
   * @param bitmap1
   * @param matrix
   */
  private void setInvertedImage(Bitmap bitmap1, Matrix matrix) {
    matrix.setScale(1, -1);
    matrix.postTranslate(0, bitmap1.getHeight());
  }
  /**
   * 设置镜面效果方法一
   *
   * @param bitmap1
   * @param matrix
   */
  private void setMirrorOne(Bitmap bitmap1, Matrix matrix) {
    matrix.setTranslate(bitmap1.getWidth(), 0);// 这个是移动
    matrix.preScale(-1, 1);
  }
  // ---------------------------------------------------------
  /**
   * 解释:镜面效果方法一和二的区别:
   * 不知道大家看没看出来,其实这两种方法的效果是一样的,只不过是设置步骤不一样,post是后乘,当前的矩阵乘以参数给出的矩阵
   * 。可以连续多次使用post,来完成所需的整个变换。 pre是前乘,参数给出的矩阵乘以当前的矩阵。所以操作是在当前矩阵的最前面发生的。
   * 可以连续多次使用post
   * ,来完成所需的整个变换,但是不可以连续使用set来完成矩阵的整个变换,为什么呢?set是直接设置Matrix的值,每次set一次
   * ,整个Matrix的数组都会变掉,第一次可以使用set,之后的变换必须换成post或者pre,也可以一直用post也行
   */
  // ---------------------------------------------------------
  /**
   * 设置镜面效果方法二
   *
   * @param bitmap1
   * @param matrix
   */
  private void setMirrorTwo(Bitmap bitmap1, Matrix matrix) {
    matrix.setScale(-1, 1);
    matrix.postTranslate(bitmap1.getWidth(), 0);
  }
  /**
   * 设置图片的合成
   *
   * @param matrix
   */
  private void setImageSynthesis(Matrix matrix) {
    Bitmap bitmap2 = BitmapFactory.decodeResource(getResources(),
        R.drawable.ic_launcher);
    // 设置图片合成时的各种模式
    paint.setXfermode(new PorterDuffXfermode(Mode.DARKEN));
    // 图片的合成很简单,就是再以bitmap2为基图往目标图片上画一次
    canvas.drawBitmap(bitmap2, matrix, paint);
  }
}

布局文件的代码如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical"
  tools:context=".MainActivity" >
  <ImageView
    android:id="@+id/iv1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
  <ImageView
    android:id="@+id/iv2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />
</LinearLayout>

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

(0)

相关推荐

  • 详谈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 矩阵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

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

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

  • 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旋转图片模拟碟片加载过程

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

  • 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.graphics.Matrix类用法分析

    本文实例讲述了android.graphics.Matrix类用法.分享给大家供大家参考,具体如下: Matrix类包含了一个3x3的矩阵用来改变坐标,它没有一个构造器来初始化它里边的内容,所以创建实例后需要调用reset()方法生成一个标准matrix,或者调用set..一类的函数,比如setTranslate, setRotate,,该函数将会决定matrix如何来改变坐标.SDK里边没有讲述Matrix的3x3矩阵是如何改变点的坐标值的,但是我在代码里边通过打印那9个点的值时,大致可以得到

  • 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

随机推荐