我的github

/*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);
        }
      }
  }
}

 

}

posted on 2016-04-07 22:12  XiaoNiuFeiTian  阅读(950)  评论(0编辑  收藏  举报