创建SurfaceView的最佳位置

我在网上看了许多大牛创建SurfaceView的位置都是在Activty的onCreate()中进行的,本人最近一直在做Android视频这一块,用的SurfaceView来显示视频数据。如果在Activty的

onCreate()中创建SurfaceView会遇到一些莫名奇妙的问题。

为了方便起见,我给大家写个测试,来说明问题的原因
在onCreate()中创建SurfaceView的效果图如下:

创建SurfaceView的最佳位置
代码:
package com.t1;

import android.app.Activity;
import android.os.Bundle;
import android.view.SurfaceView;

public class T1 extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SurfaceView mv = new T3(this);
        setContentView(mv);
    } 
 
}


package com.t1;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.Paint.Style;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.SurfaceHolder.Callback;
  
public class T3 extends SurfaceView implements Runnable, Callback {  
    private SurfaceHolder mHolder; // 用于控制SurfaceView   
    private Thread t; // 声明一条线程   
    private volatile boolean flag; // 线程运行的标识,用于控制线程   
    private Canvas mCanvas; // 声明一张画布   
    private Paint p; // 声明一支画笔   
    float m_circle_r = 10;  
  
    public T3(Context context) {  
        super(context);  
  
        mHolder = getHolder(); // 获得SurfaceHolder对象   
        mHolder.addCallback(this); // 为SurfaceView添加状态监听   
        p = new Paint(); // 创建一个画笔对象   
        p.setColor(Color.WHITE); // 设置画笔的颜色为白色   
        setFocusable(true); // 设置焦点   
    }  
  
    /** 
     * 当SurfaceView创建的时候,调用此函数 
     */  
    @Override  
    public void surfaceCreated(SurfaceHolder holder) {  
        //if(t == null) {
    	t = new Thread(this); // 创建一个线程对象   
        flag = true; // 把线程运行的标识设置成true   
        t.start(); // 启动线程   
        //}
       }  
  
    /** 
     * 当SurfaceView的视图发生改变的时候,调用此函数 
     */  
    @Override  
    public void surfaceChanged(SurfaceHolder holder, int format, int width,  
            int height) {  
    }  
  
    /** 
     * 当SurfaceView销毁的时候,调用此函数 
     */  
    @Override  
    public void surfaceDestroyed(SurfaceHolder holder) {  
        mHolder.removeCallback(this);  
        flag = false;
    }  
  
    @Override  
    public void run() {  
        while (flag) {  
            try {  
                synchronized (mHolder) {  
                    Thread.sleep(100); // 让线程休息100毫秒   
                    draw(); // 调用自定义画画方法   
                }  
            } catch (InterruptedException e) {  
                e.printStackTrace();  
            } finally {  
                if (mCanvas != null) {  
                    // mHolder.unlockCanvasAndPost(mCanvas);//结束锁定画图,并提交改变。   
  
                }  
            }  
        }  
    }  
  

    private void draw() {  
        mCanvas = mHolder.lockCanvas(); 
        if (mCanvas != null) {  
        	mCanvas.drawColor(Color.TRANSPARENT,PorterDuff.Mode.CLEAR);
        	Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);  
            paint.setColor(Color.RED);  
            paint.setStrokeWidth(10);  
            paint.setStyle(Style.FILL);  
            if (m_circle_r >= (getWidth() / 10)) {  
                m_circle_r = 0;  
            } else {  
                m_circle_r++;  
            }    
            for (int i = 0; i < 5; i++)  
                for (int j = 0; j < 8; j++)  
                    mCanvas.drawCircle(  
                            (getWidth() / 5) * i + (getWidth() / 10),  
                            (getHeight() / 8) * j + (getHeight() / 16),  
                            m_circle_r, paint);  
            mHolder.unlockCanvasAndPost(mCanvas);  
        }  
    }  
} 



原因是你在短按Home键时,程序后台运行,SurfaceView的surfaceDestroyed()方法执行了,此时销毁画图线程。所以你再次进入这个界面时,由于SurcefaceView未创建,画图线

程未启动,所以看不到任何图像。那怎样解决这个问题?

借助Activity生命周期,重写onResume()方法。
  
public class T1 extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
      } 
     @Override
    protected void onResume() {
    	super.onResume();
    	SurfaceView mv = new T3(this);
        setContentView(mv);
    }
}
运行效果图如下,完美解决。
创建SurfaceView的最佳位置

你可能感兴趣的:(android,SurfaceView)