您的位置:首页 > 移动开发 > Android开发

彻底弄懂matrix和canvas

2016-08-27 21:01 302 查看

Canvas

接下来的部分参考android官方文档

新建Canvas

我们的图,几乎所有的draw….方法,最终都是和Canvas联系在一起。

如果需要创建Canvas,必须传入一个bitmap,作为画图的地方。

Bitmap b = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);


绑定之后,我们就可以使用draw… 的方法来将要画的东西画到bitmap上面。

Canvas位置变换

android提供了Canvas位置变换的方法,可以变换Canvas的位置,还可以获得canvas的转换矩阵对象(getMatrix方法),这样的效果就相当于笔没有动,但是画纸进行了移动。

Canvas也提供了保存和回滚属性操作(save和restore),他们就像是你画了一些东西后,暂时保存(save)画了的东西。然后变换一下canvas对象,比如旋转90度,然后再画一些东西,画完后调用restore方法返回之前的位置,这里返回的是我们在save时候的位置。

点9图

注意,这里的上左定义的是可以横向拉伸的区域,下右定义的是可以纵向拉伸的区域。所以相对两边的线可以不一样,这点要特别注意。

以前的误区。

Matrix

原理

matrix是3*3的一个矩阵。它里面的九个参数

cosX -sinX translateX

sinX cosX translateY

0 0 scale

其中,sinX和cosX,代表的是旋转角度的sin和cos值。注意旋转的正方向是顺时针方向。translateX和translateY代表的是平移的X和Y。scale代表的是缩放的大小。

使用示例

float cosValue = (float) Math.cos(-Math.PI/6);
float sinValue = (float) Math.sin(-Math.PI/6);
mMatrix.setValues(
new float[]{
cosValue, -sinValue, 100,
sinValue, cosValue, 100,
0, 0, 2});


这样的效果就是逆时针旋转30度,向下向右平移50,扩大两倍,之所以是50而不是100是因为扩大了两倍。

android实现

android中matrix的实现主要是rotate ,translate ,scale ,skew(倾斜)四种。并且对这些属性提供了三种设置方法。

- set:直接设置matrix的值,这样会直接修改掉当前的matrix值

- pre:前乘,操作给出的矩阵乘以当前的矩阵。

- post:后乘,当前矩阵乘以操作给出的矩阵。

下面对于 将一个图片旋转30度,然后平移到(100,100)的地方 这个需求

后乘:

Matrix m = new Matrix();
m.postRotate(30);
m.postTranslate(100, 100);


前乘

Matrix m = new Matrix();
m.setTranslate(100, 100);
m.preRotate(30);


应用实例

Bitmap bmp = ((BitmapDrawable)getResources().getDrawable(R.drawable.show)).getBitmap();
mBitmap = bmp;
/*首先,将缩放为100*100。这里scale的参数是比例。有一点要注意,如果直接用100/
bmp.getWidth()的话,会得到0,因为是整型相除,所以必须其中有一个是float型的,直接用100f就好。*/
mMatrix.setScale(100f/bmp.getWidth(), 100f/bmp.getHeight());
//平移到(100,100)处
mMatrix.postTranslate(100, 100);
//倾斜x和y轴,以(100,100)为中心。
mMatrix.postSkew(0.2f, 0.2f, 100, 100);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android matrix canvas 位图