`
aspnetwinform
  • 浏览: 89812 次
  • 性别: Icon_minigender_2
  • 来自: 武汉
社区版块
存档分类
最新评论

Matrix详解_Matrix怎么用

 
阅读更多

在刚才的ViewPager练习中,用到了matrix,在这里再整理一下它的具体用法:

在Android中,对图片的处理需要使用到Matrix类,Matrix是一个3 x 3的矩阵,他对图片的处理分为四个基本类型:

1、Translate————平移变换

2、Scale ————缩放变换

3、Rotate ————旋转变换

4、Skew ————错切变换

在Android的API里对于每一种变换都提供了三种操作方式:set(用于设置Matrix中的值)、post(后乘,根据矩阵的原理,相当于左乘)、pre(先乘,相当于矩阵中的右乘)。默认时,这四种变换都是围绕(0,0)点变换的,当然可以自定义围绕的中心点,通常围绕中心点。

首先说说平移,在对图片处理的过程中,最常用的就是对图片进行平移操作,该方法为setTranslate(),平移意味着在x轴和y轴上简单地移动图像。setTranslate方法采用两个浮点数作为参数,表示在每个轴上移动的数量。第一个参数是图像将在x轴上移动的数量,而第二个参数是图像将在y轴上移动的数量。在x轴上使用正数进行平移将向右移动图像,而使用负数将向左移动图像。在y轴上使用正数进行平移将向下移动图像,而使用负数将向上移动图像。

再看缩放Matrix类中另一个有用的方法是setScale方法。它采用两个浮点数作为参数,分别表示在每个轴上所产生的缩放量。第一个参数是x轴的缩放比例,而第二个参数是y轴的缩放比例。如:matrix.setScale(1.5f,1);


比较复杂的就是图片的旋转了,内置的方法之一是setRotate方法。它采用一个浮点数表示旋转的角度。围绕默认点(0,0),正数将顺时针旋转图像,而负数将逆时针旋转图像,其中默认点是图像的左上角,如:

Matrix matrix = new Matrix();
matrix.setRotate(15);

另外,也可以使用旋转的角度及围绕的旋转点作为参数调用setRotate方法。选择图像的中心点作为旋转点,如:

matrix.setRotate(15,bmp.getWidth()/2,bmp.getHeight()/2);

对于错切变换在数学上又称为Shear mapping(可译为“剪切变换”)或者Transvection(缩并),它是一种比较特殊的线性变换。错切变换的效果就是让所有点的x坐标(或者y坐标)保持不变,而对应的y坐标(或者x坐标)则按比例发生平移,且平移的大小和该点到x轴(或y轴)的垂直距离成正比。错切变换,属于等面积变换,即一个形状在错切变换的前后,其面积是相等的。

对于程序中,一个特别有用的方法对是setScale和postTranslate,它们允许跨单个轴(或者两个轴)翻转图像。如果以一个负数缩放,那么会将该图像绘制到坐标系统的负值空间。由于(0,0)点位于左上角,使用x轴上的负数会导致向左绘制图像。因此我们需要使用postTranslate方法,将图像向右移动,如:

matrix.setScale(-1, 1);
matrix.postTranslate(bmp.getWidth(),0);

可以在y轴上做同样的事情,翻转图像以使其倒置。通过将图像围绕两个轴上的中心点旋转180°,可以实现相同的效果,如

matrix.setScale(1, -1);
matrix.postTranslate(0, bmp.getHeight());

比如一个matrix调用了下列一系列的方法:

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

则坐标变换经过的4个变换过程依次是:

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

所以对matrix方法的调用顺序是很重要的,不同的顺序往往会产生不同的变换效果。pre方法的调用顺序和post方法的互不影响,即以下的方法调用和前者在真实坐标变换顺序里是一致的,

 matrix.postScale(0.7f, 1); 

 matrix.preScale(0.5f, 1);

 matrix.preTranslate(10, 0); 

 matrix.postTranslate(15, 0);

而matrix的set方法则会对先前的pre和post操作进行刷除,而后再设置它的值,比如下列的方法调用:

 matrix.preScale(0.5f, 1);

 matrix.postTranslate(10, 0); 

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

setScale重新设置了矩阵的值,之前的两个变换是无效的了,所以最终的显示效果只有三个变换效果。

Canvas里scale, translate, rotate, concat方法都是pre方法,如果要进行更多的变换可以先从canvas获得matrix, 变换后再设置回canvas.

分享到:
评论

相关推荐

    scrlgndsply.rar_5X7_5x7 led_5x7 matrix led_LED INTERFACING_Matri

    《5x7 LED矩阵滚动显示代码详解》 在电子工程领域,LED显示技术广泛应用,而5x7 LED矩阵因其小巧、灵活的特点,常被用于制作各种动态显示效果,如文字滚动、图形动画等。本篇文章将围绕“5x7 LED矩阵滚动显示”这一...

    MATLAB图像处理实例详解_MATLAB图像处理实例详解_matlab图像处理_

    如,使用svmtrain训练支持向量机模型,然后用svmclassify进行图像分类。 “MATLAB图像处理实例详解”这本书很可能包含了上述所有知识的详细实例,每个实例都配有清晰的步骤解释和代码示例,帮助读者从实践中学习和...

    Matrix67_ KMP算法详解1

    KMP算法,全称为Knuth-Morris-Pratt算法,是一种高效的字符串匹配算法,由三位同名研究人员提出。它的核心思想在于避免在匹配过程中不必要的字符比较,特别是在已知部分匹配失败的情况下,通过预处理得到一个“部分...

    mimasuo.rar_Circuit Matrix Led_密码锁 pcb_电子原理图PCB

    综上所述,"mimasuo.rar_Circuit Matrix Led_密码锁 pcb_电子原理图PCB"项目涵盖了单片机应用、硬件设计、软件开发等多个方面的知识,对于电子工程爱好者和学习者来说,是一个很好的实践案例,有助于提升综合技能。...

    matrix_driver.zip

    《C语言实现矩阵运算库详解》 在编程领域,矩阵运算是一种常见的数学操作,尤其在图形处理、物理学模拟以及机器学习等领域中应用广泛。本文将深入探讨如何使用C语言来创建一个矩阵运算库,以此为基础,我们将分析...

    ansys matrix27单元详解

    《ANSYS Matrix27单元详解——自定义单元深入解析》 在ANSYS这款强大的有限元分析软件中,Matrix27单元是一种特殊的自定义单元类型,主要用于处理非线性问题,尤其是那些涉及到大变形、接触非线性和材料非线性的...

    Matrix 详解

    Matrix详解中提到,Matrix的主要使用场景是在Android的自定义View中,对图形元素进行变换。Matrix是一个矩阵操作类,它在数学上属于线性代数中的二维矩阵,这个矩阵能够与图形元素的坐标点相乘,通过矩阵的行列式来...

    Python库 | matrix_synapse-1.40.0rc3-py3-none-any.whl

    《Python库matrix_synapse-1.40.0rc3-py3-none-any.whl详解》 在Python的生态系统中,库是构建复杂应用程序的重要基石。matrix_synapse是一款专为Matrix协议开发的服务端软件,其1.40.0rc3版本的Python封装库为...

    和矩阵相关的头文件matrix.h

    #### 核心知识点详解 ##### 1. 基本结构 `matrix.h` 头文件主要由以下部分组成: - **预处理指令**:防止头文件被重复包含。 - **类定义**:定义了一个名为 `matrix` 的模板类,支持任意数据类型 `_Ty`。 - **成员...

    rgb_matrix_1.0库文件

    使用RGB_matrix_1.0库时,开发者需要熟悉库的API(应用程序编程接口),理解每个函数的作用和参数,以便有效地编写程序。此外,库可能还附带了一些示例代码,这些示例可以帮助开发者快速上手并了解如何实现特定的...

    Matrix_CABLINE_E(同轴连接器).pdf

    【Matrix CABLINE_E 同轴连接器详解】 在当今的电子设备领域,随着技术的不断发展,设备趋向于高性能、低能耗以及小型化。这导致了高速信号传输需求的激增,而低压运行的电子元件数量也随之增加,元器件的安装密度...

    Android_Matrix基础+详解

    #### 二、Android中的Matrix类使用详解 在了解了矩阵的基本理论后,接下来我们来看一下Android中的`Matrix`类是如何实现这些变换的。 **创建Matrix对象**: ```java Matrix matrix = new Matrix(); ``` **平移**...

    AS3中Matrix类详解

    - Matrix类通常与DisplayObject的`transform.matrix`属性结合使用,来改变对象的变换矩阵。 - 可以通过`matrix.concat()`方法合并多个Matrix对象,实现更复杂的图形变换。 - `matrix.identity()`重置矩阵为单位...

    sparsekit_sparsematrix_sparse_between_

    《稀疏矩阵处理:SPARSEKIT详解与应用》 在计算机科学中,特别是在数值计算、数据分析和大型系统求解等领域,稀疏矩阵(Sparse Matrix)是处理大规模问题时的重要工具。由于实际问题中的数据往往存在大量的零元素,...

    Python库 | matrix_synapse-1.22.0rc2-py3-none-any.whl

    《Python库matrix_synapse-1.22.0rc2-py3-none-any.whl详解》 在Python的生态系统中,库是构建复杂应用程序的重要基石。matrix_synapse是一款专为Matrix协议提供服务的服务器实现,它是一个开源的、分散式通信协议...

    dualband_coupling_matrix_synthesis v 1_MatrixSynthesis_basketu4l

    《双频带耦合矩阵综合技术详解》 在电子滤波器设计领域,尤其是在射频和微波系统中,双频带带通滤波器(Dual-Band Bandpass Filter,DBBF)是一种重要的器件,它能够同时处理两个独立的频率范围内的信号。"dualband...

    dotmatrix_64x48_fw_5.0:dotmatrix_64x48(aka MazoClock5)HW 5.0系列的固件

    《dotmatrix_64x48_FW_5.0:MazoClock5硬件5.0系列固件详解》 在IT行业中,硬件与固件的更新迭代是推动技术进步的重要动力。dotmatrix_64x48_FW_5.0是针对dotmatrix_64x48(又名MazoClock5)硬件5.0系列的固件升级...

Global site tag (gtag.js) - Google Analytics