RT,小弟不才,在做一个本地地图的项目,打算用一个surfaceview作为背景地图,另一个surfaceview作为GPS数据绘制一个箭头。  在实际绘图的时候发现,程序启动的时候没有问题,能够正常绘制前景和背景,可当在按下电源关闭屏幕后,再按下电源键后前景的箭头无法绘制了。  在按下电源后的处理打断点发现线程是可以重新resume的,并且canvas和bitmap都是可以使用的,可就是绘制不出来,因此在这里求教了。  以下是代码:
  main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/RLayout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >    <TextView
        android:id="@+id/lblComments"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:text="@string/hello" />    <FrameLayout 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/lblComments" 
        android:layout_below="@+id/lblComments"
        android:layout_centerHorizontal="true">
        
         <test.framelayout.TestFrameLayoutFrontView 
            android:id="@+id/testframelayoutfrontview"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:background="#00000000">
            
        </test.framelayout.TestFrameLayoutFrontView>
        
        <test.framelayout.TestFrameLayoutBackView 
            android:id="@+id/testframelayoutbackview"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
            
        </test.framelayout.TestFrameLayoutBackView>
        
    </FrameLayout>
</RelativeLayout>
activity.java
package test.framelayout;import android.app.Activity;
import android.os.Bundle;public class TestFrameLayoutActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
}
前景 surfaceview.java
package test.framelayout;import test.framelayout.TestFrameLayoutBackView.DrawThread;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.PorterDuff.Mode;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;public class TestFrameLayoutFrontView extends SurfaceView implements SurfaceHolder.Callback {
public SurfaceHolder surfaceHolder;
public Canvas canvas;
public Bitmap bitmap;
public Paint paint;
public DrawThread drawThread;
public int x;
public boolean bStop = false; public TestFrameLayoutFrontView(Context context, AttributeSet attrs) {
super(context, attrs);
x = 0;
getHolder().addCallback(this);//注册回调接口
}

protected void onDraw(Canvas canvas) {//绘制界面的方法
super.onDraw(canvas);
x += 10;

canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);


//canvas.drawLine(0, 0, x, x, paint);
if(bitmap != null)
canvas.drawBitmap(bitmap, x, x, paint);
}

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {//界面变化时调用的方法
//onDraw(canvas);
}

public void surfaceCreated(SurfaceHolder holder) {
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.testpic2);
paint = new Paint();
paint.setColor(Color.RED);
surfaceHolder = getHolder();

surfaceHolder.setFormat(PixelFormat.TRANSPARENT);

setZOrderOnTop(true);

drawThread = new DrawThread();
drawThread.start();
}

public void surfaceDestroyed(SurfaceHolder holder) {
//drawThread.stop();
bStop = true;
}

public class DrawThread extends Thread {
public DrawThread() {

}

public void run() {
while(bStop == false) {
//while (true){
try {
//锁定整个画布,在内存要求比较高的情况下,建议参数不要为null
canvas = surfaceHolder.lockCanvas();
synchronized (surfaceHolder) {
onDraw(canvas);//绘制

}
} finally {
if(canvas != null) {//并释放锁
surfaceHolder.unlockCanvasAndPost(canvas);
}
}
try {
Thread.sleep(500);//睡眠指定毫秒数
} catch(Exception e) {
e.printStackTrace();//打印堆栈信息
}
}
}
}


}
背景 surfaceview.java
package test.framelayout;import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.SurfaceHolder;
import android.view.SurfaceView;public class TestFrameLayoutBackView extends SurfaceView implements SurfaceHolder.Callback {

public SurfaceHolder surfaceHolder;
public Canvas canvas;
public Bitmap bitmap;
public Paint paint;
public DrawThread drawThread;
public boolean bStop = false; public TestFrameLayoutBackView(Context context, AttributeSet attrs) {
super(context, attrs);

getHolder().addCallback(this);//注册回调接口
}

protected void onDraw(Canvas canvas) {//绘制界面的方法
super.onDraw(canvas);


canvas.drawBitmap(bitmap, 0, 0, paint);

}

public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {//界面变化时调用的方法
//onDraw(canvas);
}

public void surfaceCreated(SurfaceHolder holder) {

bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.testpic1);
paint = new Paint();
paint.setColor(Color.WHITE);
surfaceHolder = getHolder();

/*canvas = surfaceHolder.lockCanvas();
onDraw(canvas);
if(canvas != null) {//并释放锁
surfaceHolder.unlockCanvasAndPost(canvas);
}*/

/*canvas = surfaceHolder.lockCanvas();
onDraw(canvas);
if(canvas != null) {//并释放锁
surfaceHolder.unlockCanvasAndPost(canvas);
}*/
drawThread = new DrawThread();
drawThread.start();
}

public void surfaceDestroyed(SurfaceHolder holder) {


bStop = true; }

public class DrawThread extends Thread {
public DrawThread() {

}

public void run() {
while(bStop == false) {
//while(true) {

try {
//锁定整个画布,在内存要求比较高的情况下,建议参数不要为null
canvas = surfaceHolder.lockCanvas();
synchronized (surfaceHolder) {
onDraw(canvas);//绘制

}
} finally {
if(canvas != null) {//并释放锁
surfaceHolder.unlockCanvasAndPost(canvas);
}
}
try {
Thread.sleep(100);//睡眠指定毫秒数
} catch(Exception e) {
e.printStackTrace();//打印堆栈信息
}
}
}
}
}

解决方案 »

  1.   

        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            bStop = false;
        }
      

  2.   

    先谢谢楼上的,我之前也有试过,在关闭屏幕和再打开时都没有surfaceChanged消息,因此走不到这里,是不是还还需要显示的发送什么消息呢?
      

  3.   

    谢谢三楼先。
    线程貌似没有被挂起,还在后面运行,是不是我要用Runnable接口来实现线程呢?
      

  4.   


    线程貌似没有被挂起,还在后面运行,是不是我要用Runnable接口来实现线程呢?
      

  5.   

    在线程中的循环部份加入代码:
    Log.i("test", "线程还在运行");然后关闭屏幕和再打开后通过LogCat查看线程是否有一直在运行。
      

  6.   


    嗯,是这样的,在后台一直运行。刚刚修改成Rannable的形式,也是这样。
      

  7.   

    问题解决了,是ZOrder的问题,不知道为什么,在按下电源关闭屏幕后,ZOrder发生了变化,这有可能和main.xml里的surfaceview先后有关。改好之后测试了一下home到主屏后再返回程序的流程,发现也有问题,主要是线程重新启动的问题,搜索了一下也找到了答案,分享给大家吧。http://www.apkbus.com/forum.php?mod=viewthread&tid=56582结帖!