Android中使用Matrix控制图形变换和制作倒影效果的方法
最近在使用matrix进行绘图的操作。对matrix的一些方法有了一些更深的体会,记下来,以便日后复习。
matrix常用的方法:
一、变换方法:
matrix提供了translate(平移)、rotate(旋转)、scale(缩放)、skew(倾斜)四种操作,这四种操作的内部实现过程都是通过matrix.setvalues(…)来设置矩阵的值来达到变换图片的效果。
matrix的每种操作都有set、pre、post三种操作,set是清空队列再添加,pre是在队列最前面插入,post是在队列最后面插入。
pre方法表示矩阵前乘,例如:变换矩阵为a,原始矩阵为b,pre方法的含义即是a*b
post方法表示矩阵后乘,例如:变换矩阵为a,原始矩阵为b,post方法的含义即是b*a
1.matrix.prescale(0.5f, 1);
2.matrix.pretranslate(10, 0);
3.matrix.postscale(0.7f, 1);
4.matrix.posttranslate(15, 0);
等价于:
translate(10, 0) -> scale(0.5f, 1) -> scale(0.7f, 1) -> translate(15, 0)
注意:后调用的pre操作先执行,而后调用的post操作则后执行。
set方法一旦调用即会清空之前matrix中的所有变换,例如:
1.matrix.prescale(0.5f, 1);
2.matrix.setscale(1, 0.6f);
3.matrix.postscale(0.7f, 1);
4.matrix.pretranslate(15, 0);
等价于
translate(15, 0) -> scale(1, 0.6f) -> scale(0.7f, 1)
matrix.prescale (0.5f, 1)将不起作用。
二、映射方法
matrix提供了mapxxx的方法,用于获取经matrix映射之后的值。主要有:mappoints,maprects,mapvectors等方法。
这些方法你会使用到:在你需要记住matrix操作之后的数值的时候。比如:记住矩形旋转34°(rotate)之后四个点的坐标。(你可以尝试着自己计算,你会发现很复杂,还不精确)
需要注意的是,matrix的某些方法使用到中心点的时候,如果不设置,默认是以(0,0)为中心点的。
记下来,以免忘记。
三、制作倒影效果
利用matrix可以实现各种图片的特效,接下来就用marix加上渐变色实现图片倒影的效果,步骤如下:
1. 获取需要倒影效果的图片,这里取原图片的一半
2. 添加颜色渐变到倒影图片上
具体的实现如下面代码所述,我们以一种自定义view的形式给出效果图,代码如下:
package com.flection.view; import com.flection.main.r; import android.annotation.suppresslint; import android.content.context; import android.graphics.bitmap; import android.graphics.bitmap.config; import android.graphics.bitmapfactory; import android.graphics.canvas; import android.graphics.color; import android.graphics.lineargradient; import android.graphics.matrix; import android.graphics.paint; import android.graphics.porterduffxfermode; import android.graphics.shader.tilemode; import android.graphics.drawable.bitmapdrawable; import android.util.attributeset; import android.view.view; public class flectionview extends view { context mcontext=null; public flectionview(context context) { super(context); } public flectionview(context context, attributeset attrs) { super(context, attrs); this.mcontext=context; } @suppresslint("drawallocation") @override protected void ondraw(canvas canvas) { //设置背景色 this.setbackgroundcolor(color.parsecolor("#8b8378")); bitmap oldbitmap = bitmapfactory.decoderesource(mcontext.getresources(),r.drawable.dropbox); bitmap newbitmap = createflectionbitmap(oldbitmap); canvas.drawbitmap(newbitmap,newbitmap.getwidth() ,newbitmap.getheight(), new paint()); this.invalidate(); } //获取原图+倒影图的bitmap private bitmap createflectionbitmap(bitmap oldbitmap) { int mwidth = oldbitmap.getwidth(); int mheight = oldbitmap.getheight(); //原图和倒影图之间的缝隙 int gap = 2; matrix matrix = new matrix(); matrix.prescale(1, -1); bitmap flection = bitmap.createbitmap(oldbitmap, 0, mheight / 2, mwidth, mheight / 2, matrix, false); bitmap background = bitmap.createbitmap(mwidth, mheight+gap+mheight/2, config.argb_8888); canvas canvas = new canvas(background); paint p1 = new paint(); //画出原图 canvas.drawbitmap(oldbitmap, 0, 0, p1); //画出倒影图 canvas.drawbitmap(flection, 0, mheight+gap, p1); paint shaderpaint = new paint(); lineargradient shader = new lineargradient(0, mheight, 0, flection.getheight(), 0x70ffffff, 0x00ffffff, tilemode.mirror); shaderpaint.setshader(shader); shaderpaint.setxfermode(new porterduffxfermode(android.graphics.porterduff.mode.dst_in)); //画出渐变颜色 canvas.drawrect(0, mheight+gap, mwidth, background.getheight(), shaderpaint); return background; } }
实现的效果如下图:
上一篇: mysql使用过程中遇到的坑