读书人

一个Activity 两个SurfaceView 挂起给

发布时间: 2012-09-09 09:27:54 作者: rapoo

一个Activity 两个SurfaceView 挂起给无法正常刷新绘图
RT,小弟不才,在做一个本地地图的项目,打算用一个surfaceview作为背景地图,另一个surfaceview作为GPS数据绘制一个箭头。

在实际绘图的时候发现,程序启动的时候没有问题,能够正常绘制前景和背景,可当在按下电源关闭屏幕后,再按下电源键后前景的箭头无法绘制了。

在按下电源后的处理打断点发现线程是可以重新resume的,并且canvas和bitmap都是可以使用的,可就是绘制不出来,因此在这里求教了。

以下是代码:
main.xml

XML code
<?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

Java code
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

Java code
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

Java code
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();//打印堆栈信息                }            }        }    }    }


[解决办法]
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
bStop = false;
}
[解决办法]
线程被挂起了?
[解决办法]
在线程中的循环部份加入代码:
Log.i("test", "线程还在运行");

然后关闭屏幕和再打开后通过LogCat查看线程是否有一直在运行。

读书人网 >Android

热点推荐