SurfaceView播放视频控件的使用

SurfaceView播放视频控件的使用_第1张图片


SurfaceView播放视频控件的使用_第2张图片


SurfaceView播放视频控件的使用_第3张图片


初步了解 :

/**
 * 演示SurfaceView控件的使用
 * SurfaceView 单位时间内完成界面的大量多次更新
 * 双缓冲机制 :
 * A线程----更新ui -----后台计算---更新ui
 * B线程----后台计算----更新ui  ---后台计算
 * 可以在子线程更新ui
 */

public class MainActivity extends Activity {
    private SurfaceView sv;
    boolean flag;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //占用的内存和cpu的开销很大.  当界面完全可见的时候才被创建完毕,如果界面最小化就会被销毁.
        sv = (SurfaceView) findViewById(R.id.sv);
        //注册一个surfaceview控制器的回调
        sv.getHolder().addCallback(new Callback() {//参数是一个接口 直接new这个接口,重写里面的方法

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
                System.out.println("surface被销毁了");
                flag = false;
            }

            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                System.out.println("surface创建了");
                flag = true;
                new Thread(){
                    public void run() {
                        for(int i = 0;i<100;i++){
                            if(!flag){
                                return ;
                            }
                        //界面里面内容显示的控制器
                            SurfaceHolder holder = sv.getHolder();//可以理解为SurfaceHolder的一个容器
                            Canvas  canvas = holder.lockCanvas();//锁定画布 要解锁否则会报错
                            canvas.drawColor(Color.BLACK);//画板颜色    把画板设置为黑色
                            int radius = 5+i;   //设置半径
                            Paint paint = new Paint();//画笔
                            paint.setColor(Color.RED);//设置画笔颜色
                            //              宽       高   园半径 画笔
                            canvas.drawCircle(250, 250, radius, paint);//绘画圆  
                            holder.unlockCanvasAndPost(canvas);//解锁画布
                            SystemClock.sleep(100);
                        }
                    };
                }.start();
            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width,
                    int height) {
                System.out.println("surface大小发生了变化");
            }
        });

    }

    public void click(View view){

    }
}

采用surfaceview播放视频


public class MainActivity extends Activity {
    private SurfaceView sv;
    private MediaPlayer mediaPlayer;//定义多媒体播放器   可以播放音频也可以播放视频
    private SharedPreferences sp; //定义缓存容器
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sv = (SurfaceView) findViewById(R.id.sv);
        //获取容器缓冲区   的存储位置                           私有模式
        sp = getSharedPreferences("config", MODE_PRIVATE);
        //设置容器          注册回调
        sv.getHolder().addCallback(new Callback() {

            @Override
            public void surfaceDestroyed(SurfaceHolder holder) {
                System.out.println("surface被销毁");
                if(mediaPlayer!=null){
                    //记录当前播放到哪个位置
                    int position = mediaPlayer.getCurrentPosition();
                    //创建缓存容器
                    Editor editor  = sp.edit();
                    //将当前位置存储在缓冲容器中
                    editor.putInt("position", position);
                    editor.commit();
                    mediaPlayer.stop();//停止播放
                    mediaPlayer.release();//释放资源
                }
            }

            @Override
            public void surfaceCreated(SurfaceHolder holder) {
                System.out.println("surface被创建");
                try {
                    mediaPlayer = new MediaPlayer();
                    //设置多媒体的数据源 
                    mediaPlayer.setDataSource("/mnt/sdcard/oppo.3gp");
                    mediaPlayer.prepare();//播放准备
                } catch (Exception e) {
                    e.printStackTrace();
                }
                //指定多媒体的内容实在holder里面显示
                mediaPlayer.setDisplay(holder);//设置解析出来的画面在容器里播放
                mediaPlayer.start();//播放视频
                //把播放的位置定为上次播放的位置
                mediaPlayer.seekTo(sp.getInt("position", 0));//如果打开就从上一次停止的时候播放
            }

            @Override
            public void surfaceChanged(SurfaceHolder holder, int format, int width,
                    int height) {
            }
        });
    }
}

你可能感兴趣的:(安卓必备知识)