彻底弄懂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);
相关文章推荐
- 开始一个React项目(二) 彻底弄懂webpack-dev-server的热更新
- 彻底弄懂CSS盒子模式系列教程目录
- Android Paint、Canvas、Matrix使用讲解(一、Paint)
- 彻底弄懂Qt的编码(汉字乱码问题及相关函数作用)
- 彻底弄懂JS的事件冒泡和事件捕获
- Android基础入门教程——8.3.18 Canvas API详解(Part 3)Matrix和drawBitmapMash
- js模块化编程之彻底弄懂CommonJS和AMD/CMD!
- 彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法
- 彻底弄懂css中单位px和em,rem的区别
- 彻底弄懂css中单位px和em,rem的区别
- 彻底弄懂css中单位px和em,rem的区别
- 彻底弄懂响应式设计中的em和rem
- 彻底弄懂css中单位px和em,rem的区别
- 彻底弄懂JS的事件冒泡和事件捕获
- 彻底弄懂css中单位px和em,rem的区别
- 彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法
- 推荐彻底弄懂CSS盒子模式(DIV布局快速入门)第1/3页
- 彻底弄懂CSS盒子模式
- 彻底弄懂CSS盒子模式之一
- canvas和Matrix之间的关系。