浅谈canvas的matrix变换

来源:互联网 发布:九黎影视源码 编辑:程序博客网 时间:2024/06/03 15:32

canvas有许多方法可以平移,旋转,缩放其实都是基于matrix来进行变换的

由于matrix方法过于复杂于是便封装了以下方法:

 canvas.scale(0,1);        canvas.translate(1f,4f);        canvas.rotate(30);
注意以上三个方法都需要在画图之前调用,即:
 canvas.rotate(30);        canvas.drawLine(0,0,1f,1f,new Paint());

然后配合save和restore方法来使用

以下展示了如何使用matrix:

 canvas.scale(0.5f,0.5f);  
 Matrix matrix=canvas.getMatrix();        matrix.setScale(0.5f,0.5f);        canvas.setMatrix(matrix);


可是2个方法所展示出来的图形不同因为调用了硬件加速:

即使你直接这样调用:

 Matrix matrix=canvas.getMatrix();              canvas.setMatrix(matrix);
所展现出来的图形任然会不一样:

你需要:

 ;setLayerType(View.LAYER_TYPE_SOFTWARE, null);
取消硬件加速先就可以进行canvas的matrix变换了,matrix的变换的更详细的操作可以看图片的操作都是一样的(需要线性代数知识)

以下提供了三种层面的禁用硬件加速以备不时之需:

window级别

 getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,   WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED); 
activity级别:

<activity android:hardwareAccelerated="false" /> </application>
application全局禁用

 <application android:hardwareAccelerated="false">   
view级别

setLayerType(View.LAYER_TYPE_SOFTWARE, null); 
HardwareAccelerated的作用:

当硬件加速被启用时,Android框架会采用一个新的绘图模式,这种模式利用显示列表把应用程序呈现在屏幕上,这样的速度更快

canvas的操作一般有配合动画来操作:

操作一般又可以分为三种操作(自己总结的):

1.scroller配合srollerto实现动画的平移,实现scrollview的类似动画时使用比较方便

2.valueanimotion直接操作单个元素是速度较快

3.属性动画封装较好的动画可以同时操作多个元素进行动画

下一篇将会带来一个属性动画操作多个属性实现动画的实际操作与自定义属性的实现。


0 0
原创粉丝点击