Android示例程序------->Snake解析(1)
2011-05-11 19:40:02
Android SDK中自带的有很多示例程序,这是我我们提高的很好的途径,多看这些文档对我们提高很有帮助。
此篇是对Snake的初步分析,后续还会更新较完整的解析。由于本人是初学Android 如果有错的地方或者更好的实现方法,
请不吝赐教,帮助处于新手阶段的我们。
分析Snake的程序,此程序的主体都是一个一个的小方块的东西实现的,android程序中叫TileView(切片),只是颜色不同而已。所以此篇我们从画一个TileView学起。
下面来看代码部分:
1.先自己定义一个类DrawSnakeNode继承View 用来画出一个方块;
package com.yin.snake;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;
public class DrawSnakeNode extends View {
//每个Node(节点)的大小
private final int mTileSize =12;
// private static String TAG = "SnakeDemo";
//新建一个画笔
private static Paint paint = new Paint();
private Bitmap mBitmap;
//Node的坐标(x,y)
private int x;
private int y;
public DrawView(Context context) {
super(context);
//获得一个Bitmap对象
mBitmap = loadTile();
}
//继承自View的类的构造函数,必须重载,否则会抛出异常
public DrawView(Context context, AttributeSet attrs) {
super(context, attrs);
}
//继承自View的类的构造函数,必须重载,否则会抛出异常
public DrawView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public Bitmap loadTile(){
Resources r = getResources();
//获取图片的资源,Snake程序自带的有此图片
Drawable tile = r.getDrawable(R.drawable.greenstar);
/**
* 创建一个Bitmap
*width : The width of the bitmap
*height :The height of the bitmap
*config :The bitmap config to create.
*
*/
Bitmap bitmap = Bitmap.createBitmap(mTileSize, mTileSize,Bitmap.Config.ARGB_8888 );
Canvas canvas = new Canvas(bitmap);
//设置图像的边界
tile.setBounds(0, 0, mTileSize, mTileSize);
tile.draw(canvas);
return bitmap;
}
//每次重画调用此方法
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawBitmap(mBitmap, x, y, paint);
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
2.创建一个控制类来控制Snake的移动 此篇是方块的移动
package com.yin.snake; import android.app.Activity; import android.os.Bundle; import android.view.KeyEvent; public class ContralSnake extends Activity { DrawSnakeNode dsn; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); dsn = new DrawView(getApplicationContext()); // setContentView(R.layout.main); setContentView(dsn); } public boolean onKeyDown(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_DPAD_UP){ dv.setY(dv.getY()-10); }else if(keyCode == KeyEvent.KEYCODE_DPAD_DOWN){ dv.setY(dv.getY()+10); }else if(keyCode == KeyEvent.KEYCODE_DPAD_LEFT){ dv.setX(dv.getX()-10); }else if(keyCode == KeyEvent.KEYCODE_DPAD_RIGHT){ dv.setX(dv.getX()+10); } //强制重画(跟新当前画面) dv.invalidate(); return super.onKeyDown(keyCode, event); } }
由于Bitmap等很多画图是来自JAVA中,不是很熟悉,可能写的有错误的地方,请积极指出,多多交流。