在View的学习中,借鉴以往JavaME的经验,这里首先把它们使用到的一些类、方法等简单做下类比:
Android-->JavaME
View-->Canvas
Canvas-->Graphics
onDraw(Canvas canvas)-->paint(Graphics g);
.
.
.
好,为直观起见,先呈出效果图
ViewMain类代码
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Paint.Style;
import android.view.KeyEvent;
import android.view.View;
public class ViewMain extends View {
private int x = 5;
private int y = 30;
private int width; //屏幕宽度
private int height; //屏幕高度
private Paint paint; //声明画笔
public ViewMain(Context context) {
super(context);
this.setFocusable(true); //设置焦点
}
//重写父类View的onDraw()方法
//类似于j2me中重写父类Canvas的paint()方法
protected void onDraw(Canvas canvas) {
//android应用开发中的Canvas类似于j2me中的Graphics
super.onDraw(canvas);
width = this.getWidth();
height = this.getHeight(); //获取屏幕高、宽度
//实例化“画笔”Paint,暂时把paint理解为画笔
paint = new Paint();
//清屏
this.clearScreen(canvas);
paint.setColor(Color.BLACK);
//比较奇怪一点,竟然没有锚点这个东西,难道drawText默认的就只左下角?继续探索
canvas.drawText("Hello!麦田守望者", 0, 20, paint);
// 绘图
// 从资源文件中生成位图
Bitmap bmMe= BitmapFactory.decodeResource(getResources(), R.drawable.me);
Bitmap bmTiger= BitmapFactory.decodeResource(getResources(), R.drawable.tiger);
//绘图
//依旧是锚点问题drawBitmap默认的锚点是左上角
canvas.drawBitmap(bmMe, x, y, paint);
canvas.drawBitmap(bmTiger, 10 + bmTiger.getWidth(), 30, paint);
}
private void clearScreen(Canvas canvas) {
//设置画笔颜色
paint.setColor(Color.WHITE);
//设置画笔paint样式:填充;
//多说一句,在j2me中,以下两行代码可以用fillRect()方法直接实现,但其各有利弊。
paint.setStyle(Style.FILL);
//用白色填充背景
canvas.drawRect(new Rect(0, 0, width, height), paint);
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) { //按键被按下
switch(keyCode) {
case KeyEvent.KEYCODE_DPAD_UP:
y -= 2;
System.out.println("UP");
break;
case KeyEvent.KEYCODE_DPAD_DOWN:
y += 2;
System.out.println("DOWN");
break;
case KeyEvent.KEYCODE_DPAD_LEFT:
x -= 2;
System.out.println("LEFT");
break;
case KeyEvent.KEYCODE_DPAD_RIGHT:
x += 2;
System.out.println("RIGHT");
break;
}
this.postInvalidate();
return super.onKeyDown(keyCode, event);
}
}
在绘制UI上,须重写onDraw方法,第一点比较奇怪,在屏幕高、宽的获取上getWidth(),getHeight()写在构造函数中竟然无法获取,也就是说取值为0。那看来必须将其写入到onDraw中。第二点比较奇怪的就是关于锚点的问题,发觉Android中在draw的方法中如drawText("Hello!麦田守望者", 0, 20, paint),没有锚点,“默认的”把"Hello!麦田守望者"的左下角绘制在坐标(0,20)上,这一点感觉做的不如JavaME。
关于按键响应,我起初疑惑,有onKeyUp()、onKeyDown()怎么偏偏没有onKeyLeft()、onKeyRight()?翻阅相关文档才发现onKeyUp()、onKeyDown()指的是按钮被抬起,按下时的响应,而不是指方向键的的四个方向。这里我只重写了onKeyDown方法,即按键被按下时的响应函数。这里,也就相当于JavaME中的keyPressed()和keyReleased()。android手机的一个重要特点是其屏幕很大,几乎都支持触摸屏,稍微遗憾一点,触摸屏的实现稍后的学习中再讲了。
关于按钮响应,千万不要忘记调用this.postInvalidate(),有过JavaME经验的人就会知道,这也就有点相当于repaint()、serviceRepaints()以及flushGraphics()等方法。最后重要的一点,并不是说重写了onKeyDown()就可以做出响应的,还需有个“绑定”,即setFocusable(true)。
暂时先讲到这,墨水有限,继续蘸墨!