/*TileView:tile有瓦片的意思,用一个个tile拼接起来的就是地图。TileView就是用来呈现地图的类*/
public class TileView extends View {
/*控制View中切片的尺寸和它们的范围参数。Width/Height是以像素为单位的,Drawables要被按比例缩放以适应方位。X/T瓦片数量是要被画出的切片的数量*/
protected static int mTileSize; //地图tile的大小。其实就是点的宽和高(是一样的值)
protected static int mXTileCount; //地图上x轴能容纳的tile的数量。下面类似
protected static int mYTileCount;
private static int mXOffset; //地图的起始坐标
private static int mYOffset;
/*一个hash键值对对象,由子类指定用来参考的drawable*/
private Bitmap[] mTileArray;
//地图上tile对应的图片数组。每一种tile都对应一个bitmap。比如mTileArray[1]就是草地的bitmap。可以类推。
/*一个二维整数数组,其中的数字代表tile的索引,将画在对应的位置*/
private int[][] mTileGrid;
//地图上的tile数组。比如int[1][1]=0说明这个点是草地。int[1][2]=1说明这个点是苹果
//其实思想就是这么简单。方式可以有各种各样
//画笔,canvas的图形绘制,需要画笔Paint实现
private final Paint mPaint = new Paint();
public TileView(Context context, AttributeSet attrs, int defStyle){
super(context, attrs, defStyle);
//这里用到的TypeArray。不懂的童鞋要去google下。是google弄出来的一种样式数组,其实就像定义一个控件的属性的集合。
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.recyle();
}
/*重置Bitmap的内部数列,用来画切片,并设置插入的切片的最大索引*/
public void resetTiles(int tilecount){
mTileArray = new Bitmap[tilecount];
}
//个人认为。这个函数是比较有意思的。这个是view的一个回调函数。最开始初始化的时候view的大小都是0。当进行layout之后。每个view都确定了大小。这样就开始回调这个函数
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh){
mXTileCount = (int)Math.floor(w/mTileSize);
mXTileCount = (int)Math.floor(h/mTileSize);
mXOffset = ((w - (mTileSize * mXTileCount))/2);
mYOffset = ((h - (mTileSize * mYTileCount))/2);
mTileGrid = new int[mXTileCount][mYTileCount];
clearTiles();
}
/*设置指定的Drawable作为特定的整数键的切片*/
public void loadTile(int key, Drawable tile){
Bitmap bitmap = Bitmap.createBitmap(mTileSize, mTileSize, Bitmap.Config.ARGB_8888); //创建一个bitmap
Canvas canvas = new Canvas(bitmap); //创建画布
tile.setBounds(0,0,mTileSize, mTileSize);
tile.draw(canvas);
mTileArray[key] = bitmap;
}
/*重置所有的切片为0(空)*/
public void clearTiles(){
for(int x=0; x<mXTileCount; x++){
for(int y=0; y<mYTileCount; y++){
setTile(0, x, y);
}
}
}
/*用来指定一个特定的切片(loadTile和整数值参考设置)在给定的x/y坐标在下一次invalidate/draw循环时*/
public void setTile(int tileindex, int x, int y){
mTileGrid[x][y] = tileindex;
}
//这个函数就是画出地图了。遍历地图的点,然后把每个tile的坐标都计算出来,然后一个个的tile都draw到canvas上
@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);
}
}
}
}
}