实例代码:
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Bundle;
import android.view.Menu;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new MyView(this));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
/**
* surfaceview的实例,用来处理贴图问题
*/
class MyView extends SurfaceView implements SurfaceHolder.Callback {
private SurfaceHolder holder;
private MyThread myThread; // 处理绘图的线程
public MyView(Context context) {
super(context);
// TODO Auto-generated constructor stub
holder = this.getHolder(); // 获得SurfaceHodler对象
holder.addCallback(this); // 添加回调方法
myThread = new MyThread(holder); // 创建处理绘图的线程
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
myThread.isRun = true;
myThread.start();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
myThread.isRun = false;
}
}
public class MyThread extends Thread {
public boolean isRun;
private SurfaceHolder holder;
public MyThread(SurfaceHolder holder) {
this.holder = holder;
isRun = true;
}
@Override
public void run() {
int count = 0;
while (isRun) {
Canvas c = null;
try {
synchronized (holder) {
c = holder.lockCanvas();
c.save(); // 保存当前绘图环境
c.drawColor(Color.BLACK); // 设置画布背景黑色
Paint p = new Paint(); // 创建画壁
p.setColor(Color.WHITE);
Rect r = new Rect(100, 50, 300, 250);
c.drawRect(r, p);
c.drawText("This is the " + (count++) + " seconds",
100, 310, p);
c.restore(); // 恢复先前绘图环境
Thread.sleep(1000); // sleep 1 second
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if(c!= null){
holder.unlockCanvasAndPost(c); // 结束锁定画布,并提交改变
}
}
}
}
}
}
上面的代码从整体的使用方面给出了实例,接下来进行逐步分解。
1. 首先是声明一个继承SurfaceView并且实现SurfaceHolder.CallBack的子类
class MyView extends SurfaceView implements SurfaceHolder.Callback {
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
}
2. 在子类中获得一个用于控制suerfce对象的surfaceHolder对象
holder = SurfaceView.getHodler();
holder.addCallback()
3. 在surfaceCreated方法中调用处理绘图线程,并将holder对象传递给绘图线程
4. 绘图线程中处理步骤:
//首先获得canvas对象
Canvas c = holder.lockCanvas();
c.store();
...
...
//解锁并提交改变
c.restore();
holder.unlockCanvasAndPost(c);