速读原著-Android应用开发入门教程(记录绘制的过程)

2020-02-13 15:10:29 浏览数 (1)

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。

0 人点赞