SurfaceView是View的一个特殊子类,它的目的是另外提供一个线程进行绘制操作。
要使用SurfaceView进行绘制,步骤如下:
1.用SurfaceView进行绘制,首先要创建一个对象。
2.对Surface对象的操作是通过SurfaceHolder来进行的。所以,在你的SurfaceView类初始化的时候,你需要调用 getHolder()
来获得SurfaceHolder对象,然后用addCallback()加上回调接口(因为你的类实现了相应的接口,所以此处传入this即可)。这个接口中实现的三个回调函数(surfaceChanged(SurfaceHolder holder, int format, int width, int height),surfaceCreated(SurfaceHolder holder),surfaceDestroyed(SurfaceHolder holder))分别对应Surface何时更改、创建和销毁。
3.在你的SurfaceView类中应该建立一个线程类,处理绘制操作。为此,要向这个线程类传递上面获得的SurfaceHolder对象。
4.绘制:在线程类的run()方法中进行绘制操作,通过lockCanvas()
方法获得Canvas对象,然后就可以用这个对象进行绘制,绘制完成后调用unlockCanvasAndPost(),传入Canvas对象,这时Surface将会按Canvas进行绘制。
关键代码:
布局:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<SurfaceView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/sv"/>
</LinearLayout>
Activity中:
//要知道SurfaceView什么时候是完全绘制完成的
surfaceView.getHolder().addCallback(new Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
System.out.println("created");
new Thread(){
public void run() {
for(int i=0;i<=360;i++){
SurfaceHolder surfaceHolder=surfaceView.getHolder();
//锁住画布
Canvas canvas=surfaceHolder.lockCanvas();
Paint paint=new Paint();
paint.setColor(Color.RED);
canvas.drawArc(new RectF(50, 50, 400,400), 0, i, true, paint);
//通知界面更新
surfaceHolder
.unlockCanvasAndPost(canvas);
}
};
}.start();
}