贪吃蛇中使用了三个文件,snake.java,snakeView.java和tileView.java,网上资料显示,在做贪吃蛇的时候,我们使用了一个framelayout绝对定位,在里面放两个和父元素一样大的子元素,一个是我们自定义的view:snake,这个元素是游戏的界面,我们不停的操作和重绘该view来完成游戏的交互。另一个是在中间有蓝色文本框的相对定位的布局框架,她用来显示游戏状态。网上资料显示这个tileview是一个游戏贴片类,是我们自定义的view,他事先游戏画面的贴片计算,贴片的类定义,贴片的绘制和tile相关方法。我大概可以看懂snake.java和snakeview.java,但是不怎么看懂tileview.java,还望高人指点,希望不吝赐教,越详细越好。源代码:package com.example.android.snake;
import android.content.Context;
import android.content.res.TypedArray;
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 TileView extends View {
protected static int mTileSize;
protected static int mXTileCount;
protected static int mYTileCount;
private static int mXOffset;
private static int mYOffset;
private Bitmap[] mTileArray;
private int[][] mTileGrid;
private final Paint mPaint = new Paint();
public TileView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TileView);
mTileSize = a.getInt(R.styleable.TileView_tileSize, 12);
a.recycle();
}
public TileView(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TileView);
mTileSize = a.getInt(R.styleable.TileView_tileSize, 12);
a.recycle();
}
public void resetTiles(int tilecount) {
mTileArray = new Bitmap[tilecount];
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
mXTileCount = (int) Math.floor(w / mTileSize);
mYTileCount = (int) Math.floor(h / mTileSize);
mXOffset = ((w - (mTileSize * mXTileCount)) / 2);
mYOffset = ((h - (mTileSize * mYTileCount)) / 2);
mTileGrid = new int[mXTileCount][mYTileCount];
clearTiles();
}
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;
}
public void clearTiles() {
for (int x = 0; x < mXTileCount; x++) {
for (int y = 0; y < mYTileCount; y++) {
setTile(0, x, y);
}
}
}
public void setTile(int tileindex, int x, int y) {
mTileGrid[x][y] = tileindex;
}
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
for (int x = 0; x < mXTileCount; x += 1) {
for (int y = 0; y < mYTileCount; y += 1) {
if (mTileGrid[x][y] > 0) {
canvas.drawBitmap(mTileArray[mTileGrid[x][y]],
mXOffset + x * mTileSize,
mYOffset + y * mTileSize,
mPaint);
}
}
}
}
}
import android.content.Context;
import android.content.res.TypedArray;
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 TileView extends View {
protected static int mTileSize;
protected static int mXTileCount;
protected static int mYTileCount;
private static int mXOffset;
private static int mYOffset;
private Bitmap[] mTileArray;
private int[][] mTileGrid;
private final Paint mPaint = new Paint();
public TileView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TileView);
mTileSize = a.getInt(R.styleable.TileView_tileSize, 12);
a.recycle();
}
public TileView(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.TileView);
mTileSize = a.getInt(R.styleable.TileView_tileSize, 12);
a.recycle();
}
public void resetTiles(int tilecount) {
mTileArray = new Bitmap[tilecount];
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
mXTileCount = (int) Math.floor(w / mTileSize);
mYTileCount = (int) Math.floor(h / mTileSize);
mXOffset = ((w - (mTileSize * mXTileCount)) / 2);
mYOffset = ((h - (mTileSize * mYTileCount)) / 2);
mTileGrid = new int[mXTileCount][mYTileCount];
clearTiles();
}
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;
}
public void clearTiles() {
for (int x = 0; x < mXTileCount; x++) {
for (int y = 0; y < mYTileCount; y++) {
setTile(0, x, y);
}
}
}
public void setTile(int tileindex, int x, int y) {
mTileGrid[x][y] = tileindex;
}
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
for (int x = 0; x < mXTileCount; x += 1) {
for (int y = 0; y < mYTileCount; y += 1) {
if (mTileGrid[x][y] > 0) {
canvas.drawBitmap(mTileArray[mTileGrid[x][y]],
mXOffset + x * mTileSize,
mYOffset + y * mTileSize,
mPaint);
}
}
}
}
}
解决方案 »
- 为Button设置监听(OnClickListener)事件,能传入参数吗?
- 自学Android,帮忙看下关于环境的问题,谢谢了!!
- 地铁查询如何实现
- NDK c源文件找不到 AttachCurrentThread 是怎么回事
- android做音乐播放器mediastore查询的问题。
- ndk 是否可以实现串口通信?
- 紧急:为什么触发屏幕单击事件没有效果?
- 有没有办法动态设置应用图标?
- 初学者提问 -- 如下代码向构造函数传参数的地方哪里写错了?
- 怎样更换APP右上角的三个点的图标?我想换成一个加号,类似于微信的那种UI
- ✿✿✿一个关于直接回复短信的问题
- android视频录制实现方法(转自安卓航班网)
import android.content.res.TypedArray;
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 TileView extends View { protected static int mTileSize; // 节大小 protected static int mXTileCount; // X坐标
protected static int mYTileCount; // Y坐标 private static int mXOffset; // X轴偏移量
private static int mYOffset; // Y轴偏移量 private Bitmap[] mTileArray; // 存放图片的数组 private int[][] mTileGrid; // 瓦片网格数组 private final Paint mPaint = new Paint(); // 画笔 public TileView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
//获得风格属性组
TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable.TileView);
//获得R.styleable.TileView_tileSize,缺省值为12
mTileSize = a.getInt(R.styleable.TileView_tileSize, 12);
//返回先前使用过的风格属性集,使用TypedArray后一定要使用这个。
a.recycle();
} public TileView(Context context, AttributeSet attrs) {
super(context, attrs); TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable.TileView); mTileSize = a.getInt(R.styleable.TileView_tileSize, 12); a.recycle();
} public void resetTiles(int tilecount) {
mTileArray = new Bitmap[tilecount];//创建图片数组
} @Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
mXTileCount = (int) Math.floor(w / mTileSize);//获得X轴能放多少个节
mYTileCount = (int) Math.floor(h / mTileSize);//获得Y轴能放多少个节 mXOffset = ((w - (mTileSize * mXTileCount)) / 2);//获得X偏移量
mYOffset = ((h - (mTileSize * mYTileCount)) / 2);//获得Y偏移量 mTileGrid = new int[mXTileCount][mYTileCount];//创建整个网格数组
clearTiles();//清屏
}
//加载图片
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;
}
//清屏方法
public void clearTiles() {
for (int x = 0; x < mXTileCount; x++) {
for (int y = 0; y < mYTileCount; y++) {
setTile(0, x, y);
}
}
}
//设置一个方格方法
public void setTile(int tileindex, int x, int y) {
mTileGrid[x][y] = tileindex;
}
//画图方法
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
for (int x = 0; x < mXTileCount; x += 1) {
for (int y = 0; y < mYTileCount; y += 1) {
if (mTileGrid[x][y] > 0) {
canvas.drawBitmap(mTileArray[mTileGrid[x][y]], mXOffset + x
* mTileSize, mYOffset + y * mTileSize, mPaint);
}
}
} }}