9.6 记录绘制的过程
在图形界面的绘制过程中,绘制是一个分阶段的复杂工作,如果可以将某一次绘制的过程纪录,就可以在其他的地方重现这个绘制。
参考示例程序:ApiDemo 的 Pictures(ApiDemo=>Graphics=>Pictures)
源代码:android/apis/graphics/ Pictures.java
Pictures 程序的运行结果如图所示:
本例子的核心部分如下所示:
代码语言:javascript复制 private static class SampleView extends View {
private Picture mPicture;
private Drawable mDrawable;
static void drawSomething(Canvas canvas) { // 绘制的过程
Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
p.setColor(0x88FF0000);
canvas.drawCircle(50, 50, 40, p);
p.setColor(Color.GREEN);
p.setTextSize(30);
canvas.drawText("Pictures", 60, 60, p);
}
public SampleView(Context context) {
super(context);
setFocusable(true);
setFocusableInTouchMode(true);
mPicture = new Picture();
drawSomething(mPicture.beginRecording(200, 100)); // 开始记录绘制的过程
mPicture.endRecording(); // 结束记录绘制的过程
mDrawable = new PictureDrawable(mPicture); // 创建一个可绘制物
}
@Override protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.WHITE);
canvas.drawPicture(mPicture); // 绘制第 1 次
canvas.drawPicture(mPicture, new RectF(0, 100, getWidth(), 200));
// 绘制第 2 次
mDrawable.setBounds(0, 200, getWidth(), 300);
mDrawable.draw(canvas); // 绘制第 3 次
ByteArrayOutputStream os = new ByteArrayOutputStream();
mPicture.writeToStream(os);
InputStream is = new ByteArrayInputStream(os.toByteArray());
canvas.translate(0, 300);
canvas.drawPicture(Picture.createFromStream(is)); // 绘制第 4 次
}
}
本例子进行的 4 次绘制情况为:先在一个 Picture 中进行绘制,第 1 次和第 2 次使用这个纪录的 Picture 进行绘制,第 3 次使用由 Picture 转换成的 PictureDrawable 进行绘制,第 4 次将 Picture 转成一个通用的流,然后在转回成 Picture 进行绘制。
Pictures 是一个可以记录绘制过程的类,通常情况下 Android 的绘制工作需要被绘制到画布(Cavans)上,但是能显示的画布只有一个。Pictures 的功能就在于可以让绘制的东西绘制到一个虚拟的画布上,这个虚拟的画布由 Pictures 的 beginRecording()函数返回,picture.draw(canvas)和 canvas.drawPicture()函数用于将一个记录好的绘制过程,重现到画布上。Pictures 绘制的内容也可以被记录到一个流当中,然后在重新构造一个 Pictures。