android中matrix的单位,Android中强大的Matrix操作

一: 简介

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

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

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

bf40315785b175e97b972b0e152f488b.png

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

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

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

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

二:注意事项

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

520fa7055a295da2e74344bc4aa1a627.png

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:

android:layout_width="match_parent"

android:layout_height="match_parent" >

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);

}

}

运行效果:

c34b9718391bc47337dbef9086509616.png

注意: 因为缩小了一半,所以平移了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);

}

}

运行效果:

e79963599446a2324f7e38ce5fe6a50e.png

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  ...

随机推荐

VR原理讲解及开发入门

本文是作者obuil根据多年心得专门为想要入门的VR开发者所写,由52VR网站提供支持.   1. VR沉浸感和交互作用产生的原理:   在之前,我们观看一个虚拟的创造内容是通过平面显示器的,52VR ...

javascript--Object

概述 (1)定义 对象(object)是JavaScript的核心概念,也是最重要的数据类型.JavaScript的所有数据都可以被视为对象. 简单说,所谓对象,就是一种无序的数据集合,由若干个&qu ...

spring-websocket的搭建

Apach Tomcat 8.0.3+MyEclipse+maven+JDK1.7 spring4.0以后加入了对websocket技术的支持,撸主目前的项目用的是SSM(springMVC+spri ...

pthread_attr_t 线程属性(一)

1.    线程属性:             使用pthread_attr_t类型表示,我们需要对此结构体进行初始化,                 初始化后使用,使用后还要进行去除初始化!    ...

使用Yeoman搭建 AngularJS 应用 (9) —— 让我们搭建一个网页应用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值