用Shape类定义了方块的数据结构之后,下面就要实现方块的定义和渲染了。首先,应该能够确定方块左上角的坐标,其中x坐标用left表示,y坐标用top表示。由于整个方块用4×4的数组表示,因此左上角实际上是4维数组的第一个位置的左上角。这里我们不定义砖块的宽度,而是根据屏幕的分辨率在运行时确定,以达到适配多种分辨率的需求。Brick类的成员变量和构造器如下所示。
public class Brick extends View {
public static final int PADDING = 1;
//左顶点(x,y)
public int left;
public int top;
//数据模型
private Shape shape;
//屏幕
private Screen parent;
private TextPaint paint = new TextPaint();
public Brick(Context context, AttributeSet attrs) {
super(context, attrs);
}
public Brick(Context context) {
super(context);
}
public Brick(Screen screen) {
this(screen.getContext());
parent = screen;
}
}
Brick类扩展了View类,是典型的自定义View。Brick的渲染工作是在onDraw()方法中实现的。绘制方块,需要遍历整个4×4的数组,忽略位置为0的方块,对于值为1的位置进行绘制。为了实现方块带边框的效果,这里使用了一个简单的方法,首先在外围用一种颜色绘制一个正方形,然后用另一种颜色绘制一个长度小于两个像素的正方形,两个正方形的重心一致,这样看上去就像是带边框的方块了。当然,也可以使用图片实现。onDraw()方法如下所示。
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int x = left;
int y = top;
int[] data = shape.getData();
for (int i = 0; i < data.length; i++) {
//如果data[i]不等于0,绘制方格
if (data[i] != 0) {
int r = i / 4;
int c = i % 4;
int l = x + c * parent.bWidth;
int t = y + r * parent.bWidth;
paint.setColor(Color.parseColor("#f7faf3"));
//绘制外面大的方格
canvas.drawRect(l, t, l + parent.bWidth, t + parent.bWidth, paint);
//绘制里面小的方格,看上去像是给小方格增加了一个边框
paint.setColor(Color.parseColor("#4c8e0b"));
canvas.drawRect(l + PADDING, t + PADDING, l + parent.bWidth - PADDING,t + parent.bWidth - PADDING, paint);
}
}
}
在Brick类中还定义了向左、向右、向下移动的方法,以及和背景的边框碰撞检测的方法。这些内容将在下面进行介绍