SurfaceView实现了2个缓存,绘图的时候会先绘制到一个缓存,绘制下一张图的时候,则绘制到另一缓存,这样轮流切换。
缓存绘制完了就拿去显示,缓存中得图不会擦出。
这样会导致一个问题:
假设2个缓存分别叫A、B,有2副3X3的图像,内容分别是1和2;
首先我们做第一幅图向右移动,没有内容用0表示:
1 0 0 1 1 0 1 1 1
1 0 0 1 1 0 1 1 1
1 0 0 1 1 0 1 1 1
A B A
上面是向右移动完成,缓存中得图像,接着我们用第二幅图做向下移动,此时的缓存轮到了B:
2 2 2
1 1 0
1 1 0
B
这样问题就来了,向下 我们应该是没有1的。应该是:
2 2 2
0 0 0
0 0 0
B
解决问题的方法:建一个3X3,也就是跟图像一样大得Canvas,在上面先画好,再draw到SurfaceView。
按上面方法,先向右,假设Canvas叫C,则:
1 0 0 1 1 0 1 1 1
1 0 0 1 1 0 1 1 1
1 0 0 1 1 0 1 1 1
C C C
1 0 0 1 1 0 1 1 1
1 0 0 1 1 0 1 1 1
1 0 0 1 1 0 1 1 1
A B A
再向下:
2 2 2 2 2 2 2 2 2
0 0 0 2 2 2 2 2 2
0 0 0 0 0 0 2 2 2
C C C
2 2 2 2 2 2 2 2 2
0 0 0 2 2 2 2 2 2
0 0 0 0 0 0 2 2 2
B A B