【Android游戏开发之三】剖析 Su易做图ceView ! Callback以及Su易做图ceHolder!!
各位童鞋请你们注意:su易做图ceview中确实有onDraw这个方法,但是你su易做图ceview不会自己去调用!!!
而我代码中的ondraw() 也好draw() 也好,都是我自己定义的一个方法。。。放在线程中不断调用的,一定要注意!!
之前我们对view和su易做图ceview 做了比较和取舍,最后我们发现su易做图ceview更加的适合运作与游戏开发中,那么下面就让我们来看看这个su易做图ceview的结构吧;
先上一段代码:
/**
*
*/
package com.himi;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.Su易做图ceHolder;
import android.view.Su易做图ceView;
import android.view.Su易做图ceHolder.Callback;
import android.view.animation.Animation;
/**
* @author Himi
*/
public class MySu易做图ceView extends Su易做图ceView implements Callback, Runnable {// 备注1
private Su易做图ceHolder sfh;
private Thread th;
private Canvas canvas;
private Paint paint;
private int ScreenW, ScreenH;
public MySu易做图ceView(Context context) {
super(context);
th = new Thread(this);
sfh = this.getHolder();
sfh.addCallback(this); // 备注1
paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.RED);
this.setKeepScreenOn(true);// 保持屏幕常亮
}
@Override
public void startAnimation(Animation animation) {
super.startAnimation(animation);
}
public void su易做图ceCreated(Su易做图ceHolder holder) {
ScreenW = this.getWidth();// 备注2
ScreenH = this.getHeight();
th.start();
}
private void draw() {
try {
canvas = sfh.lockCanvas(); // 得到一个canvas实例
canvas.drawColor(Color.WHITE);// 刷屏
canvas.drawText("Himi", 100, 100, paint);// 画文字文本
canvas.drawText("这就是简单的一个游戏框架", 100, 130, paint);
} catch (Exception ex) {
} finally { // 备注3
if (canvas != null)
sfh.unlockCanvasAndPost(canvas); // 将画好的画布提交
}
}
public void run() {
while (true) {
draw();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void su易做图ceChanged(Su易做图ceHolder holder, int format, int width,
int height) {
}
public void su易做图ceDestroyed(Su易做图ceHolder holder) {
// TODO Auto-generated method stub
}
}
代码很简单,我们继承继承su易做图ceview类,并且使用回调callback接口以及线程runnable接口。那么这里我简单的说下Callback接口和Su易做图ceHolder 类的作用;
//备注1
callback接口:
只要继承Su易做图ceView类并实现Su易做图ceHolder.Callback接口就可以实现一个自定义的Su易做图ceView了,Su易做图ceHolder.Callback在底层的Su易做图ce状态发生变化的时候通知View,Su易做图ceHolder.Callback具有如下的接口:
•su易做图ceCreated(Su易做图ceHolder holder):当Su易做图ce第一次创建后会立即调用该函数。程序可以在该函数中做些和绘制界面相关的初始化工作,一般情况下都是在另外的线程来绘制界面,所以不要在这个函数中绘制Su易做图ce。
•su易做图ceChanged(Su易做图ceHolder holder, int format, int width,int height):当Su易做图ce的状态(大小和格式)发生变化的时候会调用该函数,在su易做图ceCreated调用后该函数至少会被调用一次。
Su易做图ceHolder 类:
它是一个用于控制su易做图ce的接口,它提供了控制su易做图ce 的大小,格式,上面的像素,即监视其改变的。
Su易做图ceView的getHolder()函数可以获取Su易做图ceHolder对象,Su易做图ce 就在Su易做图ceHolder对象内。虽然Su易做图ce保存了当前窗口的像素数据,但是在使用过程中是不直接和Su易做图ce打交道的,由Su易做图ceHolder的Canvas lockCanvas()或则Canvas lockCanvas()函数来获取Canvas对象,通过在Canvas上绘制内容来修改Su易做图ce中的数据。如果Su易做图ce不可编辑或则尚未创建调用该函数会返回null,在unlockCanvas() 和lockCanvas()中Su易做图ce的内容是不缓存的,所以需要完全重绘Su易做图ce的内容,为了提高效率只重绘变化的部分则可以调用lockCanvas(Rect rect)函数来指定一个rect区域,这样该区域外的内容会缓存起来。在调用lockCanvas函数获取Canvas后,Su易做图ceView会获取Su易做图ce的一个同步锁直到调用unlockCanvasAnd
补充:移动开发 , Android ,