android canvas变形,移动,旋转

public class testView extends View {

    private Bitmap mBitmap = null;
    private Bitmap nBitmap = null;
    private float scaleX = 1.0f;
    private float scaleY = 1.0f;
    private float step = 0.0001f;
    
    public testView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_pet_spirit);
        nBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_pet_spirit_lighting);
    }
    
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        scaleCanvas(canvas);
        invalidate();
    }

    private void scaleCanvas(Canvas canvas) {
        scaleX += step;
        scaleY += step;
        Matrix matrix = new Matrix();
        Paint paint = new Paint();
        canvas.scale(scaleX, scaleY);
        canvas.drawBitmap(mBitmap, matrix, paint);
        canvas.drawBitmap(nBitmap, matrix, paint);
    }

}

先上代码,代码入门级!主要分享(1)canvas动画原理(2)应用场景(3)硬件加速兼容的bug

  • canvas动画原理:

画布初始大小一定,要通过scale,rotate,translate变化画布大小,角度,位移。在变化后的canvas上绘制想要的内容,内容也就跟着相应的变化。刚开始还以为是要先在canvas上绘制一边,在对canvas变形,这种误区刚开始会困惑很多人。其实canvas的draw方法是将绘制的内容画在变形后的画布上。原理是这样的:每次调用ondraw后都将获得一个新的canvas,这个canvas是一个满屏的区域,如果在刚获得这个canvas后就进行绘制,绘制的内容是立刻就显示出来了,但之后再进行变形后,canvas并不会自行进行绘制,如果在变形后在进行一次绘制,这时图像就重复了。

  • 应用场景:

为什么要用canvas进行变形呢,如果我们用一串图片实现相应的动画,这时就会有大量的内存为题需要考虑。而canvas的变形方式使用的都是native方法,所以自然快,方便。而调用ondraw进行动画效果绘制现在应用在各种view插件上面的是比较多的。各种点击动画效果。

  • 硬件加速兼容的bug:

clipPath()
clipRegion()
drawPicture()
drawTextOnPath()
drawVertices()

这几个方法在调用前一定要确定你已经在调用的activity中关闭了硬件加速,修改manifest

android:hardwareAccelerated="false"。否则你将会发现截取屏幕中的rgb时是有颜色的,可是屏幕一片惨白(幽灵绘制)