一个Activity 两个SurfaceView 挂起给没法正常刷新绘图
一个Activity 两个SurfaceView 挂起给无法正常刷新绘图
RT,小弟不才,在做一个本地地图的项目,打算用一个surfaceview作为背景地图,另一个surfaceview作为GPS数据绘制一个箭头。
在实际绘图的时候发现,程序启动的时候没有问题,能够正常绘制前景和背景,可当在按下电源关闭屏幕后,再按下电源键后前景的箭头无法绘制了。
在按下电源后的处理打断点发现线程是可以重新resume的,并且canvas和bitmap都是可以使用的,可就是绘制不出来,因此在这里求教了。
以下是代码:
main.xml
activity.java
前景 surfaceview.java
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();//打印堆栈信息 } } } } }