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();//打印堆栈信息
}
}
}
}
}
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();//打印堆栈信息
}
}
}
}
}
解决方案 »
- Eclipse启动模拟器的时候如何带上SD卡
- 一个Activity 两个SurfaceView 挂起给无法正常刷新绘图
- android 混淆 找不到 第三方类
- Andriod JNI调用C代码,原来C里的printf如何输出到串口?
- 学习经历
- 我想在用代码直接在桌面上添加widget,比如我点击了我activity里的一个按钮,程序就直接将widget加到桌面上了,求指导!
- 求大神求解脱 来看看我的代码
- 关于viewpager+fragment 滑动动画问题
- 求一只需增删改查小app, 高分来人,(对您来说一杯茶的功夫·······)
- 学习半年,独自开发了一个计步器软件,提供源码和apk,欢迎大神指教,相互学习
- android虚拟机无法运行
- Android 模拟器上不了网!
bStop = false;
}
线程貌似没有被挂起,还在后面运行,是不是我要用Runnable接口来实现线程呢?
线程貌似没有被挂起,还在后面运行,是不是我要用Runnable接口来实现线程呢?
Log.i("test", "线程还在运行");然后关闭屏幕和再打开后通过LogCat查看线程是否有一直在运行。
嗯,是这样的,在后台一直运行。刚刚修改成Rannable的形式,也是这样。