canvas concat和setMatrix的区别

Posted by alonealice on 2016-10-09

在自定义View的时候,我们经常会用到Canvas进行绘制,其中也会用到Matrix对图像进行移动、旋转等操作,这个时候就会涉及到concatsetMatrix这两个方法,将Matrix的变化效果设置到Canvas上,那么这两个方法有什么区别呢?
闲话不多说,先使用代码看看最终的效果:

使用setMatrix
1
2
3
4
5
6
7
8
9
10
11
12
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
matrix.setScale(2f,2f);
paint.setColor(Color.BLUE);
canvas.drawRect(0,0,100,100,paint);
canvas.save();
canvas.setMatrix(matrix);
paint.setColor(Color.RED);
canvas.drawCircle(200,200,100,paint);
canvas.restore();
}

实际效果图:
使用setMatrix

使用concat
1
2
3
4
5
6
7
paint.setColor(Color.BLUE);
canvas.drawRect(0,0,100,100,paint);
canvas.save();
canvas.concat(matrix);
paint.setColor(Color.BLACK);
canvas.drawCircle(200,200,100,paint);
canvas.restore();

实际效果图:
使用setMatrix

从最终的效果图我们可以看出,两者的差距还是很大,那么为什么会有这么大的区别呢?
实际上,setMatrix作用的是当前的画布,而concat作用的是画布上的组件。具体讲的详细一点的话,在这里我对matrix放大两倍,使用setMatrix的话,相当于整个坐标轴放大了两倍,而绘制的参数并没有改变。因为canvas的原点并没有在左上角,导致实际上会有偏差。而concat改变的是绘制的参数,200变400,100变200,而坐标轴不变,所以整体上就当好是两倍的效果。