安卓复习之旅—Matrix类的方法

转自:http://www.cnblogs.com/ZSS-Android/p/3930830.html
概述
在Android中,对图片的处理需要使用到Matrix类,Matrix是一个3 x 3的矩阵,他对图片的处理分为四个基本类型:

1、Translate————平移变换

2、Scale ————缩放变换

3、Rotate ————旋转变换

4、Skew ————错切变换

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

1                 Matrix matrix=new Matrix();
2                 matrix.setRotate(15);
3                 canvas.drawBitmap(bmp, matrix, paint);

另外,也可以使用旋转的角度及围绕的旋转点作为参数调用setRotate方法。选择图像的中心点作为旋转点多产生的结果可能更符合我们的需要,

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

2.缩放
Matrix类的另一个有用的方法是setScale方法。它采用两个浮点数作为参数,分别表示在每个轴上所产生的缩放量。第一个参数是x轴的缩放比例,而第二个参数是y轴的缩放比例。

1   matrix.setScale(1.5f, 1);

3.平移
Matrix类中最有用的方法之一是setTranslate方法。平移意味着在x轴和y轴上简单移动图像。setTranslate方法采用两个浮点数作为参数,表示在每个轴上移动的数量。第一个参数是图像将在x轴上移动的数量,而第二个参数是图像将在y轴上移动的数量。在x轴上使用正数进行平移将向右移动图像,而使用负数将向左移动图像。在y轴上使用正数进行平移将向下移动图像,而使用负数将向上移动图像。

1    matrix.setTranslate(1.5f, -10);

4.之前和之后的版本

当然,以上这些方法只是冰山一角。还有几个方法可能证明是有用的。前面介绍的方法也都有之前和之后的版本。这使得我们能够每次按照顺序完成一个以上的转换。例如,可以先执行preScale,然后执行setRotate或setScale,最后执行postRotate。取决于执行的操作,更改他们发生的顺序会产生具有巨大差异的结果。

1     matrix.setScale(1.5f, 1);
2     matrix.postRotate(15, bmp.getWidth()/2, bmp.getHeight()/2);

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

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

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

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

7.绘制替代图像

在之前的小节中,所使用方法的缺点之一是图像会被截断,因为没有计算转换后的结果大小,仅仅以预先确定的大小绘制到一个位图对象中。

解决这个问题的方法之一是:当初次创建位图对象时,应用Matrix对象而不是绘制到一个空的位图对象中。

通过这种方式,将无需再获得Canvas和Paint对象。缺点是不能继续更改位图对象,因为如果想要对其进行任何的转换,那么都需要重新创建它。

在Bitmap类中存在一个静态方法createBitmap能够实现以上的功能。第一个参数是源位图对象,接下来的参数分别是来自源图像的初始的x,y,宽度和高度值,随后是所应用的Matrix对象,最后是一个布尔值,表示能否在图像上应用某种过滤器。由于没有应用包含过滤器的矩阵(将在本章后面讨论),将其设置为false。

1                 Matrix matrix=new Matrix();
2                 matrix.setRotate(15, bmp.getWidth()/2, bmp.getHeight()/2);
3                 alteredBitmap=Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(),matrix,false);
4                 alteredImageView.setImageBitmap(alteredBitmap);

我们以相同的方式处理矩阵,但是使用初始的位图对象(bmp)作为源图像,并将它传入Matrix对象,对第二个位图对象alteredBitmap进行实例化。这将以指定的平移从源图像创建一个位图对象,并对该位图对象的大小进行缩放。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值