Android中强大的Matrix操作
一: 简介
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操作的更多相关文章
- Android学习记录(2)—Android中数据库的常见操作
android中数据库操作是非常常见了,我们会经常用到,操作的方法也有很多种形式,这里我就把最常见的两种形式记录下来了,以备以后用到方便查看.我就不写注释和解释了,因为android数据库的操作和其它 ...
- Android中的文件权限操作
默认本工程创建的文件本工程对其有读写权限. 我们可以通过context.openFileOutput("文件名", 模式): 我们可以创建私有, 共有, 只读, 只写文件, 默认的 ...
- Android中实现延时执行操作的几种方法
1.使用线程的休眠实现延时操作 new Thread() { @Override public void run() { super.run(); Thread.sleep(3000);//休眠3秒 ...
- android中的数据库操作
如何在android中调用数据库资源 在android中主要有两种方法来实现对数据库的访问,一种是adb shell方式,另一种是通过相关的android 的java类来间接的对数据库来进行操作.其中 ...
- android中的数据库操作(转)
android中的数据库操作 android中的应用开发很难避免不去使用数据库,这次就和大家聊聊android中的数据库操作. 一.android内的数据库的基础知识介绍 1.用了什么数据库 an ...
- android中的数据库操作(SQLite)
android中的数据库操作 android中的应用开发很难避免不去使用数据库,这次就和大家聊聊android中的数据库操作. 一.android内的数据库的基础知识介绍 1.用了什么数据库 an ...
- 我的Android六章:Android中SQLite数据库操作
今天学习的内容是Android中的SQLite数据库操作,在讲解这个内容之前小编在前面有一篇博客也是讲解了SQLite数据库的操作,而那篇博客的讲解是讲述了 如何在Window中通过DOM来操作数据库 ...
- Android中Parcelable序列化总结
在使用Parcelable对android中数据的序列化操作还是比较有用的,有人做过通过对比Serializable和Parcelable在android中序列化操作对象的速度比对,大概Parcela ...
- Android进阶(六)文件读操作
Android中文件的读写操作与Java中文件的读写操作是有区别的.在Java中,读文件操作如以下代码所示: public class FileRead { private static final ...
随机推荐
- yii框架基本操作
<?php namespace app\controllers; use yii\web\Controller; use app\models\DemoForm; use app\models\ ...
- iOS 的 XMPPFramework 简介一
XMPPFramework是一个OS X/iOS平台的开源项目,使用Objective-C实现了XMPP协议(RFC-3920),同时还提供了用于读写XML的工具,大大简化了基于XMPP的通信应用的开 ...
- windows server 2012安装.net framework3.5失败解决方法
1.点击开始运行,输入 gpedit.msc,打开“组策略”2.“计算机配置”---“管理模板”---“windows 组件”---“windows 更新”,然后双击“指定 Intranet Micr ...
- 最新iOS 6 in Xcode4.5新特性——Storyboard和属性自动绑定
最新iOS 6 in Xcode4.5新特性编程之二(上)——Storyboard和属性自动绑定 从Xcode 4.3开始,Storyboard 就是iOS 5和iOS 6中令人兴奋的一个新特性,他将 ...
- text-decoration属性
一.在CSS1中,text-decoration有六个值: text-decoration:none //默认,定义标准的文本,没有任何样式,正常显示 text-decoration:underli ...
- 从linux内核中学到的编程技巧 【转】
从linux内核中学到的编程技巧 分类: LINUX 1构建泛型宏 (./linux/include/linux/kernel.h) #define min(x, y) ({ \ typeof(x ...
- h.264直接预测
直接预测是B帧上一种独有的预测方式,其中直接预测又分为两种模式: 时域直接模式(temporal direct).空域直接模式(spatial direct). 在分析这两种模式之前,有一个前提概念需 ...
- Delphi 的运算符列表,运算符及优先级表格 good
Delphi 的运算符列表 分类 运算符 操作 操作数 结果类型 范例 算术运算符 + 加 整数,实数 整数,实数 X + Y - 减 整数,实数 整数,实数 Result - 1 * 乘 整数,实数 ...
- Eclipse调试的一些小技巧
不要使用System.out.println作为调试工具 启用所有组件的详细的日志记录级别 使用一个日志分析器来阅读日志 1.条件断点 想象一下我们平时如何添加断点,通常的做法是双击行号的左边.在de ...
- 分页SQL取下一页
20条记录一页,扫描第2页就需要访问40条记录. SQL> select * from ( select * from ( select /*+ index_desc(a idx_page_3) ...



