您的位置:首页 > 移动开发 > Android开发

Android图形图画学习(9)——探索SurfaceView的框架结构

2013-10-29 16:16 295 查看


上图是实现SurfaceView绘图的框架。我们需要实现的是长横线以下的部分。

对这个框架作一个说明:

回调的典型作用是实现控制反转,即事先预定好框架,在SurfaceView.java的updateWindow()函数中,根据实际情况,系统会调用SurfaceHolder.Callback.surfaceCreated(mSurfaceHolder)等。这只是一个框架,在没有实现的SurfaceHolder.Callback接口中,surfaceCreated()等函数没有作任何操作。等我们实现了这个接口之后,系统对这个接口函数的调用才有了实际的意义。

这也是回调的意义所在,框架师事先定好框架,但不定义任何内容,这样系统调用没有任何意义,程序员根据不同的情况给框架中填充不同的内容后,系统调用就有了实际意义,也产生了不同的实现。

通过上图,我们也可以了解,真正画图的操作是在SurfaceHolder.callback中实现的(callback运行小线程,真正的画图在小线程中实现)。SurfaceHolder控制着"实现"。SurfaceView内置SurfaceHolder为成员变量,通过操作这个成员变量从而把画图贴到这个view上来。

通过如上框架,可以作一个简单的实例:

public class Test extends Activity {
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new MyView(this));
}

//内部类
class MyView extends SurfaceView implements SurfaceHolder.Callback{

SurfaceHolder holder;
public MyView(Context context) {
super(context);
holder = this.getHolder();//获取holder
holder.addCallback(this);  //SurfaceHolder作为view的成员变量控制着画图实现
//setFocusable(true);

}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {

}

@Override
public void surfaceCreated(SurfaceHolder holder) {
new Thread(new MyThread()).start();  //这个是Callback这里放在了和view同一个地方,我们也可以移到外面去另作实现,效果等同
}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {

}

//内部类的内部类
class MyThread implements Runnable{

@Override
public void run() {
Canvas canvas = holder.lockCanvas(null);//获取画布
Paint mPaint = new Paint();
mPaint.setColor(Color.BLUE);

canvas.drawRect(new RectF(40,60,80,80), mPaint);
holder.unlockCanvasAndPost(canvas);//解锁画布,提交画好的图像

}

}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: