绘制控件
onDraw方法是一个发挥想象的地方。如果你正在白手起家式地创建一个widget,正是由于你想创建一个全新的视觉界面。onDraw方法中传入的Canvas参数就是一个表面,你用它来给你的想象赋予生命。
通过一些Paint对象,Android提供了一系列工具来帮助你在Canvas上绘制你的设计。Canvas类包含一些辅助方法来绘制基本的2D对象,包括圆、线、矩形、文本和图片等。当你在其上绘制时,它也支持旋转、平移和放缩变换。
通过Drawable和Paint类(提供一系列定制的填充和画笔)结合,你的控件能渲染的复杂程度和细节只受屏幕大小和处理器的渲染能力所限。
在Android中书写高效率的代码的一个很重要的技巧是避免重复创建和析构对象。任何你在onDraw方法中创建的对象会在每次屏幕刷新时重新创建和销毁。
改善效率的办法是:让这些对象(特别是Paint和Drawable实例)拥有类的作用域,并把它们挪到构造函数中创建。
接下来的代码片段显示了怎样重写onDraw方法,在控件的中心位置显示一个简单的字符串。
@Override
protected void onDraw(Canvas canvas) {
// Get the size of the control based on the last call to onMeasure.
int height = getMeasuredHeight();
int width = getMeasuredWidth();
// Find the center
int px = width/2;
int py = height/2;
// Create the new paint brushes.
// NOTE: For efficiency this should be done in
// the widget’s constructor
Paint mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mTextPaint.setColor(Color.WHITE);
// Define the string.
String displayText = “Hello World!”;
// Measure the width of the text string.
float textWidth = mTextPaint.measureText(displayText);
// Draw the text string in the center of the control.
canvas.drawText(displayText, px-textWidth/2, py, mTextPaint);
}
Android为Canvas提供了丰富的绘制库。由于与本节的主题相距较远,所以,更详细地了解绘制复杂的视觉界面的技巧请看11章。
Android目前不支持矢量图形。结果,改变任何元素,都需要重新绘制整个画布;修改画刷的颜色不会更改View的显示,除非它无效或重绘了。此外,你还可以使用OpenGL来渲染图形;更多的细节,请看11章中SurfaceView的讨论。