public class ProcessView extends SurfaceView implements SurfaceHolder.Callback{
MyActivity activity;
private TutorialThread thread;
Paint paint;
Bitmap processBitmap;//加载的进度条,资源是progress
Bitmap processBackground;//加载界面背景图片,资源是processbackground
int process = 0;
int type;//当前加载的view(1:MenuView 2:GameView)
    int k = 0;
    
//构造器
public ProcessView(MyActivity activity, int type) {
super(activity);
// TODO Auto-generated constructor stub
this.activity = activity;
getHolder().addCallback(this);//实例化并添加回调
this.thread = new TutorialThread(getHolder(),this);//初始化重绘线程
this.type = type;//当前加载的界面
initBitmap();//初始化图片资源
}
    
//初始化图片资源的method
private void initBitmap() {
// TODO Auto-generated method stub
paint = new Paint();
paint.setTextSize(20);
processBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.progress);
processBackground = BitmapFactory.decodeResource(getResources(), R.drawable.processbackground);
System.out.println("processview 初始化");
}

@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.WHITE);
canvas.drawBitmap(processBackground, 0, 0, paint);  -------------------------------------*
if(k==0){
    canvas.drawBitmap(processBitmap, 1040, 360, paint);
}
else if(k==1){
canvas.drawBitmap(processBitmap, 1040-k*140, 360-k*72, paint);
}
else if(k==2){
canvas.drawBitmap(processBitmap, 1040-k*140, 360-k*72, paint);
}
else if(k==3){
canvas.drawBitmap(processBitmap, 1040-k*140, 360-k*72, paint);
}
else if(k==4){
canvas.drawBitmap(processBitmap, 1040-k*140, 360-k*72, paint);
}
else if(k==5){
canvas.drawBitmap(processBitmap, 1040-k*140, 360-k*72, paint);
}
k = k+1;
} @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
this.thread.setFlag(true);
this.thread.start();
} @Override
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub
boolean retry = true;//循环标志位
thread.setFlag(false);//设置循环标志位
while(retry){
try{
thread.join();
retry = false;
}
catch(InterruptedException e){}
}
}
//刷帧线程
class TutorialThread extends Thread{
private int span = 100;//睡眠的毫秒数
private SurfaceHolder surfaceholder;
private ProcessView processview;
private boolean flag = false;//循环标志位
public TutorialThread(SurfaceHolder surfaceholder,ProcessView processview){
this.surfaceholder = surfaceholder;
this.processview = processview;//得到加载界面
}
public void setFlag(boolean flag){
this.flag = flag;
}
@Override
public void run() {
Canvas canvas;
while(this.flag){
canvas = null;
try{
canvas = this.surfaceholder.lockCanvas(null);
synchronized (this.surfaceholder) {
processview.onDraw(canvas);
}
}
finally{
if(canvas!=null){
this.surfaceholder.unlockCanvasAndPost(canvas);
}
}
if(processview.process>=100){
if(processview.type==1){
processview.activity.myHandler.sendEmptyMessage(7);
}
else if(processview.type==2){
processview.activity.myHandler.sendEmptyMessage(8);
}
}
try{
Thread.sleep(span);
}
catch(Exception e){
e.printStackTrace();
}
}
}

}

}
这是一个游戏的加载界面,但是运行的时候,在*号处那一行有错误,也不知道是什么错误,帮忙啊谢谢了

解决方案 »

  1.   

    SurfaceView在绘画之前要先锁定画布,里面有一个方法吧!具体的名字忘了,你查查看!好像是lockCanvas之类的!
      

  2.   

    还有一点,绘画完了之后还要解锁!unlockCanvas!
      

  3.   

    在线程里有锁定
    try{
                        canvas = this.surfaceholder.lockCanvas(null);----------here
                        synchronized (this.surfaceholder) {
                            processview.onDraw(canvas);
                        }
      

  4.   


    绘完之后解锁了
    finally{
                        if(canvas!=null){
                            this.surfaceholder.unlockCanvasAndPost(canvas);----------here
                        }
                    }