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()绘制了一个具有渐变颜色的圆,并附加了文字。