一: 简介

Matrix翻译字面意思时矩阵,在Android的API中提供了两种Matrix,分别是android.graphics.Matrix 和 android.opengl.Matrix .

后者是OpenGL中的 , 是 一个四行四列的 矩阵. 主要是3D 效果,导包的时候,注意

前者是我们比较常用的, 是一个三行三列的矩阵 , 主要是2D方面的.主要主要用于图像的处理,主要功能有 缩放[Scale] ,平移[Translate] ,旋转[Rotate],倾斜[Skew]等操作.

其中 rotate 操作涉及到的参数是:MSCALE_X,MSKEW_X,MSKEW_Y,MSCALE_Y

translate操作涉及到的参数是:MTRANS_X,MTRANS_Y

scale操作涉及到的参数是:MSCALE_X,MSCALE_Y

skew操作涉及到的参数是:MSKEW_X,MSKEW_Y

更多的相关操作详见 http://blog.csdn.net/forlong401/article/details/8174452

二:注意事项

图像的处理, Translate用到了矩阵的加法,其他操作则用到的是矩阵的乘法 :

sinX 和 cosX :表示旋转角度的 cos 值和 sin 值(逆时针为正) ;

translateX 和 translateY: 表示 x 和 y 的平移量 ;

scale 是缩放的比例, 1 是不变, 2 是表示缩放 1/2。

除平移变换(Translate)外,旋转变换(Rotate)、缩放变换(Scale)和错切变换(Skew)都可以围绕一个中心点来进行,如果不指定,在默认情况下是围绕(0, 0)来进行相应的变换的。

三: 简单使用

自定义View:

package com.example.matrixdemo;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.drawable.BitmapDrawable;
import android.util.AttributeSet;
import android.view.View; public class MyView extends View { private Bitmap mBitmap; private Matrix mMatrix = new Matrix(); public MyView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initialize();
} public MyView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
} public MyView(Context context) { this(context, null);
} private void initialize() { mBitmap = ((BitmapDrawable) getResources().getDrawable(R.drawable.mm))
.getBitmap(); float cosValue = (float) Math.cos(-Math.PI / 6); float sinValue = (float) Math.sin(-Math.PI / 6); mMatrix.setValues(
//缩放1/2 ,平移(100,100),旋转30°
new float[] { cosValue, -sinValue, 100, sinValue, cosValue, 100, 0, 0, 2 }); } @Override
protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawBitmap(mBitmap, mMatrix, null); } }

XML:

<?xml version="1.0" encoding="utf-8"?>
<com.example.matrixdemo.MyView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" > </com.example.matrixdemo.MyView>

Activity:

package com.example.matrixdemo;

import android.app.Activity;
import android.os.Bundle; public class MatrixRotate extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_view);
}
}

运行效果:

注意: 因为缩小了一半,所以平移了50

四:相关API

如果只是这样设置值的话.还要计算好半天,很麻烦,google为我们提供了响应的API.针对每种变换,Android提供了pre、set和post三种操作方式

set用于设置Matrix中的值。

pre方法表示矩阵前乘,例如:变换矩阵为A,原始矩阵为B,pre方法的含义即是A*B

post方法表示矩阵后乘,例如:变换矩阵为A,原始矩阵为B,post方法的含义即是B*A

简单理解:

matrix.preScale(0.5f, 1);
matrix.preTranslate(10, 0);
matrix.postScale(0.7f, 1);
matrix.postTranslate(15, 0);

等价于:

translate(10, 0) -> scale(0.5f, 1) -> scale(0.7f, 1) -> translate(15, 0)

调用的pre的操作先执行,调用的post的操作则后执行。

set方法是调用即

覆盖之前matrix中的所有变换,

matrix.preScale(0.5f, 1);
matrix.setScale(1, 0.6f);
matrix.postScale(0.7f, 1);
matrix.preTranslate(15, 0);

等价于

translate(15, 0) -> scale(1, 0.6f) ->  scale(0.7f, 1)

matrix.preScale (0.5f, 1)将不起作用。

同样满足pre后调用先执行原则,只是set之前的值无效.

 五: API使用实例

  比如我们要将一个图片旋转60°,之后平移(100,100)

//
Matrix m = new Matrix(); m.postRotate(60); m.postTranslate(100, 100); //或者:
Matrix m = new Matrix(); m.setTranslate(100 , 100 ); m.preRotate(60);

自定义View

package com.example.matrixdemo;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.drawable.BitmapDrawable;
import android.util.AttributeSet;
import android.view.View; public class MyView extends View { private Bitmap mBitmap;
private Matrix mMatrix = new Matrix(); public MyView(Context context) {
this(context, null);
} public MyView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initialize();
} public MyView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
} private void initialize() { Bitmap bmp = ((BitmapDrawable) getResources()
.getDrawable(R.drawable.mm)).getBitmap();
mBitmap = bmp;
/*
* 缩放到100*100;这里需要注意前面是float值
*/
mMatrix.setScale(100f / bmp.getWidth(), 100f / bmp.getHeight());
// 平移到(100,100)
mMatrix.postTranslate(100, 100);
// 以(100,100)为中心,倾斜x和y轴
mMatrix.postSkew(0.2f, 0.2f, 100, 100);
} @Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas); canvas.drawBitmap(mBitmap, mMatrix, null);
}
}

运行效果:

Android中强大的Matrix操作的更多相关文章

  1. Android学习记录(2)—Android中数据库的常见操作

    android中数据库操作是非常常见了,我们会经常用到,操作的方法也有很多种形式,这里我就把最常见的两种形式记录下来了,以备以后用到方便查看.我就不写注释和解释了,因为android数据库的操作和其它 ...

  2. Android中的文件权限操作

    默认本工程创建的文件本工程对其有读写权限. 我们可以通过context.openFileOutput("文件名", 模式): 我们可以创建私有, 共有, 只读, 只写文件, 默认的 ...

  3. Android中实现延时执行操作的几种方法

    1.使用线程的休眠实现延时操作 new Thread() { @Override public void run() { super.run(); Thread.sleep(3000);//休眠3秒 ...

  4. android中的数据库操作

    如何在android中调用数据库资源 在android中主要有两种方法来实现对数据库的访问,一种是adb shell方式,另一种是通过相关的android 的java类来间接的对数据库来进行操作.其中 ...

  5. android中的数据库操作(转)

    android中的数据库操作 android中的应用开发很难避免不去使用数据库,这次就和大家聊聊android中的数据库操作. 一.android内的数据库的基础知识介绍 1.用了什么数据库   an ...

  6. android中的数据库操作(SQLite)

    android中的数据库操作 android中的应用开发很难避免不去使用数据库,这次就和大家聊聊android中的数据库操作. 一.android内的数据库的基础知识介绍 1.用了什么数据库   an ...

  7. 我的Android六章:Android中SQLite数据库操作

    今天学习的内容是Android中的SQLite数据库操作,在讲解这个内容之前小编在前面有一篇博客也是讲解了SQLite数据库的操作,而那篇博客的讲解是讲述了 如何在Window中通过DOM来操作数据库 ...

  8. Android中Parcelable序列化总结

    在使用Parcelable对android中数据的序列化操作还是比较有用的,有人做过通过对比Serializable和Parcelable在android中序列化操作对象的速度比对,大概Parcela ...

  9. Android进阶(六)文件读操作

    Android中文件的读写操作与Java中文件的读写操作是有区别的.在Java中,读文件操作如以下代码所示: public class FileRead { private static final  ...

随机推荐

  1. 防止mysql注入

    function check($sql_str) { $checks=eregi('select|insert|update|delete|\'|\/|\\\|\*|\.|union|into|loa ...

  2. tableview 编辑状态设置

    #pragma mark - tableview 编辑状态设置 -(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSI ...

  3. uboot的jumptable_init函数分析

    一.函数说明 函数功能:安装系统函数指针 函数位置:common/exports.c 二.函数分析 void jumptable_init (void) { int i; gd->jt = (v ...

  4. 关于ueditor1.4.3版复制section标签丢失class和style样式问题

    在复制微信的文章格式到ueditor时发现section标签中的style和class属性丢失,严重影响美观. 原文格式,排版清晰段落分明赏心悦目: 复制到ueditor后的格式...这跟原文是没法比 ...

  5. 【Winform 控件浅谈 】 之 WebBrowser

    前言 鄙人才疏学浅,如果说错了,还请各位不吝赐教 1.什么是 WebBrowser 下面是已有的轮子,我想说它们是专业的 http://baike.baidu.com/view/2981935.htm ...

  6. SetTimer and CreateWaitableTimer的例子(静态函数设置为回调函数,瑞士的网页,有点意思)

    Timers (SetTimer and CreateWaitableTimer) in Windows   SetTimer The following example creates a time ...

  7. Cent OS 命令行和窗口界面默认登录切换方法

    在 CentOS 中的修改方法如下: 1. root登陆,免得老是sudo 2. 打开/etc/inittab 文件     #vim /etc/inittab 3. 在默认的 run level 设 ...

  8. Unique Binary Search Trees——LeetCode

    Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...

  9. cf602A Two Bases

    A. Two Bases time limit per test 1 second memory limit per test 256 megabytes input standard input o ...

  10. 使用国内镜像通过pip安装python的一些包 Cannot fetch index base URL http://pypi.python.org/simple/

    原文地址:http://www.xuebuyuan.com/1157602.html 学习flask,安装virtualenv环境,这些带都ok,但是一安装包总是出错无法安装, 比如这样超时的问题: ...