速读原著-Android应用开发入门教程(图像、图形、文本的基本绘制)

9.2 图像、图形、文本的基本绘制

Android 中基本的绘制包括了图像、图形和文本的绘制。

参考示例程序:ApiDemo 的AlphaBitmap(ApiDemo=>Graphics=>AlphaBitmap)
源代码:android/apis/graphics/AlphaBitmap.java
AlphaBitmap 程序的运行结果如图所示:
在这里插入图片描述
本程序在界面上自上而下一共绘制了 3 个内容,第一个是一个原始位图,第二个是经过变化的位图,第三个是几何图形。

在这个示例程序中,主要通过将一个自定义的 SampleView 设置成活动的 View 作为其中的 ContentView。onCreate()函数如下所示:

public class AlphaBitmap extends GraphicsActivity { // GraphicsActivity 相当于 Activity 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new SampleView(this)); // 设置实现中的 SampleView 
    }
}

SampleView 是其中扩展了 View 的实现,主要的内容在类的构造函数和 OnDraw()函数中,内容如下所示:

    private static class SampleView extends View {
        private Bitmap mBitmap;
        private Bitmap mBitmap2;
        private Bitmap mBitmap3;
        private Shader mShader;
        public SampleView(Context context) {
            super(context);
            setFocusable(true);
            InputStream is = context.getResources().
                    openRawResource(R.drawable.app_sample_code);
            mBitmap = BitmapFactory.decodeStream(is); // 解码位图文件到 Bitmap
            mBitmap2 = mBitmap.extractAlpha(); // 提取位图的透明通道
            // 创建一个位图
            mBitmap3 = Bitmap.createBitmap(200, 200, Bitmap.Config.ALPHA_8);
            drawIntoBitmap(mBitmap3); // 调用自己实现的 drawIntoBitmap()
            mShader = new LinearGradient(0, 0, 100, 70, new int[] {
                    Color.RED, Color.GREEN, Color.BLUE },
                    null, Shader.TileMode.MIRROR);
        }
        private static void drawIntoBitmap(Bitmap bm) {
            float x = bm.getWidth();
            float y = bm.getHeight();
            Canvas c = new Canvas(bm);
            Paint p = new Paint();
            p.setAntiAlias(true);

            p.setAlpha(0x80);
            c.drawCircle(x/2, y/2, x/2, p);

            p.setAlpha(0x30);
            p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
            p.setTextSize(60);
            p.setTextAlign(Paint.Align.CENTER);
            Paint.FontMetrics fm = p.getFontMetrics();
            c.drawText("Alpha", x/2, (y-fm.ascent)/2, p);
        }
        @Override 
        protected void onDraw(Canvas canvas) {
            canvas.drawColor(Color.WHITE);
            Paint p = new Paint();
            float y = 10; // 设置纵坐标
            p.setColor(Color.RED); // 设置画笔为红色
            canvas.drawBitmap(mBitmap, 10, y, p); // 绘制第 1 个位图(原始图像)
            y += mBitmap.getHeight() + 10; // 纵坐标增加
            canvas.drawBitmap(mBitmap2, 10, y, p); // 绘制第 2 个位图(根据红色的画笔)
            y += mBitmap2.getHeight() + 10; // 纵坐标增加
            p.setShader(mShader); // 设置阴影
            canvas.drawBitmap(mBitmap3, 10, y, p); // 绘制第 3 个位图
        }
    }

第 1 个图是直接对原始的图像进行了绘制;第 2 个图是在原始图像的基础上抽取了透明通道,所以绘制时画笔(Paint)的颜色起到了作用;第 3 个图是调用 drawIntoBitmap()绘制了一个具有渐变颜色的圆,并附加了文字。

发布了1044 篇原创文章 · 获赞 868 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_42528266/article/details/103970292