从主到从的介绍吧!
蛇是怎么动的?
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
//mXTileCount,mYTileCount屏幕的长宽(长宽可容纳苹果的个数)
for (int x = 0; x < mXTileCount; x += 1) {
for (int y = 0; y < mYTileCount; y += 1) {
if (mTileGrid[x][y] > 0) { //mTileGrid[][]储存要绘制Bitmap的位置
//mTileArray[]储存不同颜色的苹果位图
canvas.drawBitmap(mTileArray[mTileGrid[x][y]], mXOffset + x
* mTileSize, mYOffset + y * mTileSize, mPaint);
}
}
}
}
说明:遍历mTitleGrid[ ][ ]中的所有数据,在制定的x,y上进行绘制相应的位图。但这只是绘制了一遍,如何进行重复绘制呢?
class RefreshHandler extends Handler {
@Override
public void handleMessage(Message msg) {
SnakeView.this.update();
SnakeView.this.invalidate();
}
public void sleep(long delayMillis) {
//移除what = 0 的 message
this.removeMessages(0);
//使用obtainMessage(0)重新创建一个message,延迟delayMills发送消息进行更新操作
sendMessageDelayed(obtainMessage(0), delayMillis);
}
};
public void update() {
if (mMode == RUNNING) {
long now = System.currentTimeMillis();
//只有当蛇移动之后的时间大于蛇的移动延迟才可以更新操作
if (now - mLastMove > mMoveDelay) {
clearTiles();//清空所有位置的绘图
updateWalls();//更新外墙
updateSnake();//更新蛇
updateApples();//更新随机产生的苹果
mLastMove = now;
}
//延时mMoveDelay
mRedrawHandler.sleep(mMoveDelay);
}
}
说明:上面两段代码是互相重复调用的,所以可以利用Hanld机制不断调用invalidate()进行重新绘制(也就是回调了onDraw())。
源代码:不知道怎么上传,需要的留下邮箱哈!
贪吃蛇中的android知识点:
View.setVisibility(View.GONE);//设置按钮不可见,在ViewGroup中不留位置,空间
可以从savedInstanceState判断是否为空判断程序是否是第一次启动
当游戏的activity被销毁前保存当前activity的数据到 savedInstanceState
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putBundle(ICICLE_KEY, mSnakeView.saveState());
}
public Bundle saveState() {
Bundle map = new Bundle();
map.putIntArray("mAppleList", coordArrayListToArray(mAppleList));
map.putInt("mDirection", Integer.valueOf(mDirection));
map.putInt("mNextDirection", Integer.valueOf(mNextDirection));
map.putLong("mMoveDelay", Long.valueOf(mMoveDelay));
map.putLong("mScore", Long.valueOf(mScore));
map.putIntArray("mSnakeTrail", coordArrayListToArray(mSnakeTrail));
return map;
}
根据drawable绘制bitmap,并且存进mTileArray[]中
public void loadTile(int key, Drawable tile) {
Bitmap bitmap = Bitmap.createBitmap(mTileSize, mTileSize,
Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
tile.setBounds(0, 0, mTileSize, mTileSize);
//像画布中汇入图片
tile.draw(canvas);
mTileArray[key] = bitmap;
}
自定义组件的自定义属性
//自定义属性数组
TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable.TileView);
//获取对应的属性值,使用R.styleble.TileView加下划线的方式访问数组里面的属性
mTileSize = a.getInt(R.styleable.TileView_tileSize, 12);
声明自定义属性
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="TileView">
<attr name="tileSize" format="integer" />
</declare-styleable>
</resources>
将我们自定义的组件加入布局main.xml 文件中,平且使用自定义属性,自定义属性必须加上:
xmlns test="http://schemas.android.com/apk/res/com.android.tutor "蓝色 是自定义属性的前缀,红色 是我们包名.