View类是Android的一个超类,这个类几乎包含了所有的屏幕类型。在Android中,任何一个View类都只需要重写onDraw()方法来实现界面显示。自定义的视图可以是复杂的3D实现,也可以是非常简单的文本形式。Android中提供了invalidate方法来实现界面的刷新,注意,invalidate不能直接在线程中调用,因为他违背了单线呈模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中执行,因此Android中最长用的方法是利用Handler来实现UI线程的更新
1.写一个类继承View类,一般要重写ondraw方法。一般而言我们去自己绘制一个view,在另一个activity中setContentView(view)去引用它。
static int count = 0 ;
static int y = 0;
public GameView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
if (count<100) {
count++;
}
else {
count = 0 ;
}
Paint paint = new Paint();
switch (count%4) {
case 0:
paint.setColor(Color.BLUE);
break;
case 1:
paint.setColor(Color.RED);
break;
case 2:
paint.setColor(Color.GRAY);
break;
case 3:
paint.setColor(Color.GREEN);
break;
}
canvas.drawRect((320-80)/2, y, (320-80)/2+80, y+40, paint);
super.onDraw(canvas);
}
}
2
写一个activity。
public class ViewTestActivity extends Activity {
/** Called when the activity is first created. */
public static GameView gameView;
public static Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
if (msg.what ==11) {
}
super.handleMessage(msg);
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
gameView = new GameView(this);
setContentView(gameView);
new Thread(new GameThread()).start();
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
switch (keyCode) {
case KeyEvent.KEYCODE_DPAD_DOWN:
GameView.y+= 3;
break;
case KeyEvent.KEYCODE_DPAD_UP:
GameView.y-=3;
break;
}
return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
return true;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
return true;
}
}
class GameThread implements Runnable{
@Override
public void run() {
while (!Thread.currentThread().isInterrupted()) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
Thread.currentThread().interrupt();
}
ViewTestActivity.gameView.postInvalidate();//使用postnvalidate可以直接在线程中更新界面
}
}
}