自定义View之贪吃蛇

2014-11-24 01:37:08 · 作者: · 浏览: 0

本次的重点,如何让自定义View动起来。

效果如下图: 如图所见,我们自定义3个View

一个是单元Tileview,用来画方块

一个是贪吃蛇SnakeView继承至TileView

一个是背景BackgroundView


\

本次重点介绍SnakeView因为只有小蛇是动的。

前面讲过,让View刷新有两种方式,一个在UI线程中,一个在非UI线程(一般使用SurfaceView)。

简单的,不是非常频繁的刷新可以在UI线程中。SnakeView就是采用这种方式。< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+usvQxMq1z9ajujwvcD4KPHA+MS7KudPDSGFuZGxlcsC0y6LQwlZpZXejrMq508NIYW5kbGVy1tC1xCBzZW5kTWVzc2FnZURlbGF5ZWS1xLe9yr3AtL/Y1sbQocnftcTL2bbIoaNkZWxhedS9vsOjrNChyd/L2bbI1L3C/aGjPC9wPgo8cD4gPHByZSBjbGFzcz0="brush:java;">class RefreshHandler extends Handler { @Override public void handleMessage(Message msg) { //更新小蛇的状态 SnakeView.this.update(); //刷新小蛇的view SnakeView.this.invalidate(); } public void sleep(long delayMillis) { this.removeMessages(0); sendMessageDelayed(obtainMessage(0), delayMillis); } };

2.重写ondraw方法中,构造小蛇身体组成的方块即可。

@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);
                }
            }
        }
    }

将这个屏幕转化为一个矩阵,矩阵的行数就是mXTileCount,列数就是mYTileCount.对应的元素是方块,是否需要画方块由mTileGrid[][]二维数组保存的值决定的。

小蛇的行动其实就是对mTileGrid二维数组中的值进行修改。每次更新View都会将这个二维数组遍历一次,重新构造View。因此效率很差。

mXTileCount:当前屏幕X方向最都能画几个方块

mYTileCount:当前屏幕Y方向最都能画几个方块

总结:直接在线程UI中操作View刷新

优点:实现简单。

缺点:效率低,不流畅,view位置变化是很生硬,从这消失,到那出现。中间没有动画来连贯。