3.3.2 Matrix类的方法

   然而,现在要做的是探索Matrix类的其他的方法,因为他们帮助我们完成了大部分想要完成的工作,而无需重新学习高中和大学的数学课程。

   与自己创建的Matrix对象中的数字不同,针对想要使用的转换,可以简单的调用相应的方法。

   下述的每个代码片段都可以替换“在位图上绘制位图”示例中的canvas.drawBitmap代码行。

   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进行实例化。这将以指定的平移从源图像创建一个位图对象,并对该位图对象的大小进行缩放。

posted on 2014-08-23 11:23  宁静致远,一览众山小  阅读(698)  评论(0编辑  收藏  举报

导航