精华内容
下载资源
问答
  • surfaceview生命周期

    2013-06-02 19:00:00
    public class MainActivity extends Activity implements OnClickListener { private EditText et_path; private Button bt_play, bt_replay, bt_stop;...private SurfaceView sv_video; private See...

     

     

    public class MainActivity extends Activity implements OnClickListener {

     private EditText et_path;

     private Button bt_play, bt_replay, bt_stop;

     private SurfaceView sv_video;

     private SeekBar sb;

     private static MediaPlayer mediaPlayer;

     private int currentPosition;

     private boolean flag = false;

     

     public static MediaPlayer getMediaPlayer() {

      if (mediaPlayer == null) {

       synchronized (MainActivity.class) {

        if (mediaPlayer == null) {

         mediaPlayer = new MediaPlayer();

        }

       }

      }

      return mediaPlayer;

     }

     

     @Override

     protected void onCreate(Bundle savedInstanceState) {

      super.onCreate(savedInstanceState);

      setContentView(R.layout.activity_main);

      this.et_path = (EditText) this.findViewById(R.id.et_path);

      this.bt_play = (Button) this.findViewById(R.id.bt_play);

      this.bt_replay = (Button) this.findViewById(R.id.bt_replay);

      this.bt_stop = (Button) this.findViewById(R.id.bt_stop);

      this.sv_video = (SurfaceView) this.findViewById(R.id.sv_video);

      this.sb = (SeekBar) this.findViewById(R.id.sb);

     

      this.sb.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

     

       @Override

       public void onStopTrackingTouch(SeekBar arg0) {

        if (mediaPlayer != null) {

         int progress = arg0.getProgress();

         mediaPlayer.seekTo(progress);

        }

       }

     

       @Override

       public void onStartTrackingTouch(SeekBar arg0) {

        // TODO Auto-generated method stub

     

       }

     

       @Override

       public void onProgressChanged(SeekBar arg0, int arg1, boolean arg2) {

        // TODO Auto-generated method stub

     

       }

      });

     

      this.bt_play.setOnClickListener(this);

      this.bt_replay.setOnClickListener(this);

      this.bt_stop.setOnClickListener(this);

      /**

       * 4.0以下的版本需要设置一下一个参数<br>

       * 设置surface不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户界面

       */

      this.sv_video.getHolder().setType(

        SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

      this.sv_video.getHolder().addCallback(new Callback() {

       @Override

       public void surfaceDestroyed(SurfaceHolder arg0) {

        System.out.println("surfaceDestroyed........");

        if (mediaPlayer != null && mediaPlayer.isPlaying()) {

         currentPosition = mediaPlayer.getCurrentPosition();

        }

       }

     

       @Override

       public void surfaceCreated(SurfaceHolder arg0) {

        System.out.println("surfaceCreated........");

        if (currentPosition > 0) {

         play(currentPosition);

        }

       }

     

       @Override

       public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2,

         int arg3) {

        System.out.println("surfaceChanged........");

       }

      });

      if (mediaPlayer != null && mediaPlayer.isPlaying()) {

       this.bt_play.setText("暂停");

      } else if (mediaPlayer != null) {

       this.bt_play.setText("播放");

      }

     }

     

     @Override

     public void onClick(View v) {

      switch (v.getId()) {

      case R.id.bt_play:

       play(0);

       break;

      case R.id.bt_replay:

       replay();

       break;

      case R.id.bt_stop:

       stop();

       break;

      }

     }

     

     /**

      * 播放或暂停音乐

      */

     private void play(int currentPosition) {

      // 播放状态

      if (mediaPlayer != null && mediaPlayer.isPlaying()) {

       mediaPlayer.pause();

       this.bt_play.setText("播放");

      } else if (mediaPlayer != null) {

       mediaPlayer.start();

       this.bt_play.setText("暂停");

      } else {

       String path = this.et_path.getText().toString().trim();

       File file = new File(path);

       if (file.exists()) {

        try {

         mediaPlayer = getMediaPlayer();

         mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

         mediaPlayer.setDisplay(sv_video.getHolder());

         mediaPlayer.setDataSource(path);

         mediaPlayer.prepare();

         mediaPlayer.start();

         int duration = mediaPlayer.getDuration();

         sb.setMax(duration);

         flag = true;

         new Thread() {

          @Override

          public void run() {

           while (flag) {

            int position = mediaPlayer.getCurrentPosition();

            sb.setProgress(position);

            try {

             sleep(500);

            } catch (InterruptedException e) {

             // TODO Auto-generated catch block

             e.printStackTrace();

            }

           }

     

          }

         }.start();

         mediaPlayer.seekTo(currentPosition);

         mediaPlayer

           .setOnCompletionListener(new OnCompletionListener() {

            @Override

            public void onCompletion(MediaPlayer arg0) {

             Toast.makeText(getApplication(), "播放完成", 0)

               .show();

             stop();

            }

           });

         this.bt_play.setText("暂停");

        } catch (Exception e) {

         e.printStackTrace();

         Toast.makeText(this, "播放错误", 0).show();

        }

       } else {

        Toast.makeText(this, "音频文件不存在", 0).show();

       }

      }

     }

     

     private void replay() {

      if (mediaPlayer != null) {

       sb.setProgress(0);

       mediaPlayer.start();

       mediaPlayer.seekTo(0);

       this.bt_play.setText("暂停");

       return;

      }

      play(0);

     }

     

     private void stop() {

      if (mediaPlayer != null) {

       flag = false;

       sb.setProgress(0);

       mediaPlayer.stop();

       mediaPlayer.release();

       mediaPlayer = null;

       this.bt_play.setText("播放");

      }

     }

    }

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

        xmlns:tools="http://schemas.android.com/tools"

        android:layout_width="match_parent"

        android:layout_height="match_parent"

        android:orientation="vertical"

        tools:context=".MainActivity" >

     

        <!-- android:text="/storage/sdcard0/DCIM/Camera/VID_20130901_084921.mp4" -->

     

        <EditText

            android:id="@+id/et_path"

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:text="/storage/sdcard0/DCIM/Camera/VID_20130901_084921.mp4" />

     

        <LinearLayout

            android:layout_width="match_parent"

            android:layout_height="wrap_content"

            android:orientation="horizontal" >

     

            <Button

                android:id="@+id/bt_play"

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:layout_weight="1"

                android:text="播放" />

     

            <Button

                android:id="@+id/bt_replay"

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:layout_weight="1"

                android:text="重播" />

     

            <Button

                android:id="@+id/bt_stop"

                android:layout_width="wrap_content"

                android:layout_height="wrap_content"

                android:layout_weight="1"

                android:text="停止" />

        </LinearLayout>

     

        <SeekBar

            android:id="@+id/sb"

            android:layout_width="match_parent"

            android:layout_height="wrap_content" />

     

        <SurfaceView

            android:id="@+id/sv_video"

            android:layout_width="fill_parent"

            android:layout_height="fill_parent" />

     

    </LinearLayout>

     

     

    在线视频

    public class MainActivity extends Activity implements OnClickListener { 

     private EditText et_path;

     private Button bt_play, bt_replay, bt_stop;

     private SurfaceView sv_video;

     private static MediaPlayer mediaPlayer;

     private int currentPosition;

     

     public static MediaPlayer getMediaPlayer() {

      if (mediaPlayer == null) {

       synchronized (MainActivity.class) {

        if (mediaPlayer == null) {

         mediaPlayer = new MediaPlayer();

        }

       }

      }

      return mediaPlayer;

     }

     

     @Override

     protected void onCreate(Bundle savedInstanceState) {

      super.onCreate(savedInstanceState);

      setContentView(R.layout.activity_main);

     

      this.et_path = (EditText) this.findViewById(R.id.et_path);

      this.bt_play = (Button) this.findViewById(R.id.bt_play);

      this.bt_replay = (Button) this.findViewById(R.id.bt_replay);

      this.bt_stop = (Button) this.findViewById(R.id.bt_stop);

      this.sv_video = (SurfaceView) this.findViewById(R.id.sv_video);

      this.bt_play.setOnClickListener(this);

      this.bt_replay.setOnClickListener(this);

      this.bt_stop.setOnClickListener(this);

     

      /**

       * 4.0以下的版本需要设置一下一个参数<br>

       * 设置surface不维护自己的缓冲区,而是等待屏幕的渲染引擎将内容推送到用户界面

       */

      this.sv_video.getHolder().setType(

        SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

      this.sv_video.getHolder().addCallback(new Callback() {

     

       @Override

       public void surfaceDestroyed(SurfaceHolder arg0) {

        System.out.println("surfaceDestroyed........");

        if (mediaPlayer != null && mediaPlayer.isPlaying()) {

         currentPosition = mediaPlayer.getCurrentPosition();

        }

       }

     

       @Override

       public void surfaceCreated(SurfaceHolder arg0) {

        System.out.println("surfaceCreated........");

        if (currentPosition > 0) {

         play(currentPosition);

        }

     

       }

     

       @Override

       public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2,

         int arg3) {

        System.out.println("surfaceChanged........");

     

       }

      });

     

      if (mediaPlayer != null && mediaPlayer.isPlaying()) {

       this.bt_play.setText("暂停");

      } else if (mediaPlayer != null) {

       this.bt_play.setText("播放");

     

      }

     

     }

     

     @Override

     public void onClick(View v) {

      switch (v.getId()) {

      case R.id.bt_play:

       play(0);

       break;

      case R.id.bt_replay:

       replay();

       break;

      case R.id.bt_stop:

       stop();

       break;

     

      }

     }

     

     /**

      * 播放或暂停音乐

      */

     private void play(int currentPosition) {

     

      // 播放状态

      if (mediaPlayer != null && mediaPlayer.isPlaying()) {

       mediaPlayer.pause();

       this.bt_play.setText("播放");

      } else if (mediaPlayer != null) {

       mediaPlayer.start();

       this.bt_play.setText("暂停");

      } else {

        String path = et_path.getText().toString().trim();

        try {

         mediaPlayer = getMediaPlayer();

         mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

         mediaPlayer.setDisplay(sv_video.getHolder());

         mediaPlayer.setDataSource(path);

         mediaPlayer.prepare();

         mediaPlayer.start();

         mediaPlayer.seekTo(currentPosition);

         mediaPlayer

           .setOnCompletionListener(new OnCompletionListener() {

     

            @Override

            public void onCompletion(MediaPlayer arg0) {

             Toast.makeText(getApplication(), "播放完成", 0)

               .show();

             stop();

            }

           });

         this.bt_play.setText("暂停");

        } catch (Exception e) {

         e.printStackTrace();

         Toast.makeText(this, "播放错误", 0).show();

        }

      }

     }

     

     private void replay() {

      if (mediaPlayer != null) {

       mediaPlayer.seekTo(0);

       this.bt_play.setText("暂停");

       return;

      }

      play(0);

     

     }

     

     private void stop() {

      if (mediaPlayer != null) {

       mediaPlayer.stop();

       mediaPlayer.release();

       mediaPlayer = null;

       this.bt_play.setText("播放");

      }

     }

     

    }

     

    转载于:https://www.cnblogs.com/freenovo/archive/2013/06/02/4469813.html

    展开全文
  • 本文利用SurfaceView来实现视频的播放 本文地址:http://www.cnblogs.com/wuyudong/p/5851156.html,转载请注明源地址。 在main.xml布局文件添加用于视频画面绘制的SurfaceView 控件: <SurfaceView android...

    本文利用SurfaceView来实现视频的播放

    本文地址:http://www.cnblogs.com/wuyudong/p/5851156.html,转载请注明源地址。

    在main.xml布局文件添加用于视频画面绘制的SurfaceView 控件:

    <SurfaceView android:layout_width="fill_parent" android:layout_height="240dip" android:id="@+id/surfaceView" />

    项目布局设计:

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity" >
    
        <EditText
            android:id="@+id/et_path"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:hint="请输入视频文件的路径" />
    
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >
    
            <Button
                android:id="@+id/bt_play"
                android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="播放" />
    
            <Button
                android:id="@+id/bt_pause"
                android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="暂停" />
    
            <Button
                android:id="@+id/bt_replay"
                android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="重播" />
    
            <Button
                android:id="@+id/bt_stop"
                android:layout_width="0dip"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="停止" />
        </LinearLayout>
        
        <SurfaceView 
            android:id="@+id/sv"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            />
    
    </LinearLayout>

    大部分代码和《Android 多媒体播放API简介》中的完全一样,修改一点点代码即可:

    public class MainActivity extends Activity implements OnClickListener {
    
        private EditText et_path;
        private Button bt_play, bt_replay, bt_pause, bt_stop;
        private SurfaceView sv;
    
        private MediaPlayer mediaPlayer;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            sv = (SurfaceView)findViewById(R.id.sv);
            et_path = (EditText) findViewById(R.id.et_path);
            bt_play = (Button) findViewById(R.id.bt_play);
            bt_replay = (Button) findViewById(R.id.bt_replay);
            bt_pause = (Button) findViewById(R.id.bt_pause);
            bt_stop = (Button) findViewById(R.id.bt_stop);
    
            bt_pause.setOnClickListener(this);
            bt_play.setOnClickListener(this);
            bt_replay.setOnClickListener(this);
            bt_stop.setOnClickListener(this);
    
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
            case R.id.bt_play:
                play();
                break;
            case R.id.bt_replay:
                replay();
                break;
            case R.id.bt_stop:
                stop();
                break;
            case R.id.bt_pause:
                pause();
                break;
            default:
                break;
            }
        }
    
        /**
         * 暂停音乐
         */
        private void pause() {
            if ("继续".equals(bt_pause.getText().toString().trim())) {
                mediaPlayer.start();
                bt_pause.setText("暂停");
                return;
            }
            if (mediaPlayer != null && mediaPlayer.isPlaying()) {
                mediaPlayer.pause();
                bt_pause.setText("继续");
                return;
            }
        }
    
        /**
         * 重新播放
         */
        private void replay() {
            if (mediaPlayer != null && mediaPlayer.isPlaying()) {
                mediaPlayer.seekTo(0);
                return;
            }
            play();
        }
    
        /**
         * 停止播放音乐
         */
        private void stop() {
            if (mediaPlayer != null && mediaPlayer.isPlaying()) {
                mediaPlayer.stop();
                mediaPlayer.release(); // 记得释放资源
                mediaPlayer = null;
                bt_play.setEnabled(true);
            }
        }
    
        /**
         * 播放音乐
         */
        private void play() {
            String path = et_path.getText().toString().trim();
            File file = new File(path);
            if (file.exists() && file.length() > 0) {
                try {
                    mediaPlayer = new MediaPlayer();
                    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
                    
                    /* 设置Video影片以SurfaceHolder播放 */
                    mediaPlayer.setDisplay(sv.getHolder());
                    
                    mediaPlayer.setDataSource(path);
                    mediaPlayer.prepare(); // might take long! (for buffering, etc)
                    mediaPlayer.start();
                    mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
                        @Override
                        public void onCompletion(MediaPlayer mp) {
                            bt_play.setEnabled(true);
                        }
                    } );
                    
                    bt_play.setEnabled(false);
                } catch (Exception e) {
                    Toast.makeText(this, "播放失败", 0).show();
                    e.printStackTrace();
                }
            } else {
                Toast.makeText(this, "文件不存在", 0).show();
            }
    
        }
    
    }

    运行项目效果如下:

    但是上面的代码有点问题,那就是当点击home或返回屏幕主界面后,在回到播放页面,视频黑屏

    原因:

    SurfaceView内部维护双缓冲,消耗内存资源

    如果发现当前SurfaceView 用户可见的时候,创建SurfaceView的holder

    如果SurfaceView变成用户不可见的时候  销毁SurfaceView的holder

    为了观察SurfaceView的生命周期,可以添加下面的代码进行打印追踪:

        sv.getHolder().addCallback(new Callback() {
                
                @Override
                public void surfaceDestroyed(SurfaceHolder holder) {
                    System.out.println("holder被销毁了");
                }
                
                @Override
                public void surfaceCreated(SurfaceHolder holder) {
                    System.out.println("holder被创建了");
                    
                }
                
                @Override
                public void surfaceChanged(SurfaceHolder holder, int format, int width,
                        int height) {
                    System.out.println("holder的大小变化了");
                }
            });
    
        }

    logcat中打印下面的信息:

    09-07 11:36:34.613: I/System.out(28858): holder被创建了
    09-07 11:36:34.623: I/System.out(28858): holder的大小变化了

    返回主界面

    09-07 11:39:08.245: I/System.out(28858): holder被销毁了

    再次回到视频界面

    09-07 11:39:39.405: I/System.out(28858): holder被创建了
    09-07 11:39:39.405: I/System.out(28858): holder的大小变化了

    可以看到,每次回到视频界面,holder都会被重新创建

    修改后的代码如下:

    public class MainActivity extends Activity implements OnClickListener {
    
        private EditText et_path;
        private Button bt_play, bt_replay, bt_pause, bt_stop;
        private SurfaceView sv;
    
        private MediaPlayer mediaPlayer;
        private int currentPosition;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            sv = (SurfaceView) findViewById(R.id.sv);
            et_path = (EditText) findViewById(R.id.et_path);
            bt_play = (Button) findViewById(R.id.bt_play);
            bt_replay = (Button) findViewById(R.id.bt_replay);
            bt_pause = (Button) findViewById(R.id.bt_pause);
            bt_stop = (Button) findViewById(R.id.bt_stop);
    
            bt_pause.setOnClickListener(this);
            bt_play.setOnClickListener(this);
            bt_replay.setOnClickListener(this);
            bt_stop.setOnClickListener(this);
    
            sv.getHolder().addCallback(new Callback() {
    
                @Override
                public void surfaceDestroyed(SurfaceHolder holder) {
                    System.out.println("holder被销毁了");
    
                    if (mediaPlayer != null && mediaPlayer.isPlaying()) {
                        currentPosition = mediaPlayer.getCurrentPosition();
                        stop();
                    }
                }
    
                @Override
                public void surfaceCreated(SurfaceHolder holder) {
                    System.out.println("holder被创建了");
                    if (currentPosition > 0) {
                        play(currentPosition);
                    }
    
                }
    
                @Override
                public void surfaceChanged(SurfaceHolder holder, int format,
                        int width, int height) {
                    System.out.println("holder的大小变化了");
                }
            });
    
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
            case R.id.bt_play:
                play(0);
                break;
            case R.id.bt_replay:
                replay();
                break;
            case R.id.bt_stop:
                stop();
                break;
            case R.id.bt_pause:
                pause();
                break;
            default:
                break;
            }
        }
    
        /**
         * 暂停音乐
         */
        private void pause() {
            if ("继续".equals(bt_pause.getText().toString().trim())) {
                mediaPlayer.start();
                bt_pause.setText("暂停");
                return;
            }
            if (mediaPlayer != null && mediaPlayer.isPlaying()) {
                mediaPlayer.pause();
                bt_pause.setText("继续");
                return;
            }
        }
    
        /**
         * 重新播放
         */
        private void replay() {
            if (mediaPlayer != null && mediaPlayer.isPlaying()) {
                mediaPlayer.seekTo(0);
                return;
            }
            play(0);
        }
    
        /**
         * 停止播放音乐
         */
        private void stop() {
            if (mediaPlayer != null && mediaPlayer.isPlaying()) {
                mediaPlayer.stop();
                mediaPlayer.release(); // 记得释放资源
                mediaPlayer = null;
                bt_play.setEnabled(true);
            }
        }
    
        /**
         * 播放音乐
         */
        private void play(final int currentPosition) {
            String path = et_path.getText().toString().trim();
            File file = new File(path);
            if (file.exists() && file.length() > 0) {
                try {
                    mediaPlayer = new MediaPlayer();
                    mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
    
                    /* 设置Video影片以SurfaceHolder播放 */
                    mediaPlayer.setDisplay(sv.getHolder());
    
                    mediaPlayer.setDataSource(path);
                    mediaPlayer.prepare(); // might take long! (for buffering, etc)
                    mediaPlayer.start();
                    mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
                        
                        @Override
                        public void onPrepared(MediaPlayer mp) {
                            mediaPlayer.seekTo(currentPosition);
                            
                        }
                    });
                    mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
                        @Override
                        public void onCompletion(MediaPlayer mp) {
                            bt_play.setEnabled(true);
                        }
                    });
    
                    bt_play.setEnabled(false);
                } catch (Exception e) {
                    Toast.makeText(this, "播放失败", 0).show();
                    e.printStackTrace();
                }
            } else {
                Toast.makeText(this, "文件不存在", 0).show();
            }
    
        }
    
    }

     

    转载于:https://www.cnblogs.com/wuyudong/p/5851156.html

    展开全文
  • 程序启动,并且直接开启mediaPlayer播放视频: 跳转到第二个activity: 跳转回surfaceView的activity: back键退出activity:

    程序启动,并且直接开启mediaPlayer播放视频:

     跳转到第二个activity:

    跳转回surfaceView的activity:

    back键退出activity:

     

     

     

     

     

     

     

     

    展开全文
  • 界面布局和上一节的mp3基本一样,播放视频需要一个控件SurfaceView SurfaceView控件在内部维护了一个双缓冲的技术,使用两个线程进行解析帧和显示到界面上 在Activity的onCreate()方法里面,找到控件对象 其他...

     

    界面布局和上一节的mp3基本一样,播放视频需要一个控件SurfaceView

     

    SurfaceView控件在内部维护了一个双缓冲的技术,使用两个线程进行解析帧和显示到界面上

    ActivityonCreate()方法里面,找到控件对象

    其他代码和上一节的音频播放一致

    找到MediaPlayer对象调用setDataSource()方法,之前

    调用MediaPlayer对象的setDisplay()方法,设置影片以SurfaceHolder的方式播放,参数:SurfaceHolder对象,调用SurfaceView对象的getHolder()方法来得到

    调用MediaPlayer对象的prepareAsync()方法,进行异步准备

    调用MediaPlayer对象的setOnPreparedListener()方法,设置准备完成的监听器,在重写方法里,调用MediaPlayer对象的start()方法

     

    在低版本的手机上,加上下面的代码,指定自己不维护缓冲区,等待MediaPlayer将数据推送出来

    调用SurfaceView对象的getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS)

     

    当界面最小化不可见后,重新打开SurfaceHolder会被销毁,这是系统设计为了节省内存

    当界面不可见的时候,应该记录播放位置并且停止掉,当重新可见的时候,重新打开

     

    获取SurfaceHolder对象,调用SurfaceView对象的getHolder()方法

    调用SurfaceHolder对象的addCallback()方法,添加回调,参数:Callback的接口类型,使用匿名内部类来实现接口,重写以下方法

    surfaceDestroyed(),销毁的时候

    判断MediaPlayer不为空并且MediaPlayer.isPlaying()为真

    把进度保存在Activity的成员变量currentPosition里面,调用MediaPlayer对象的getPosition()

    停止掉播放

     

    surfaceCreated(),创建的时候

    调用播放代码,通过传参把currentPosition传递过去,在准备完成的回调中play后面,调用MediaPlayer对象的seekTo()把位置设置上次位置

     

    貌似是因为不支持很多格式,代码没测试成功,不贴了

    展开全文
  • SurfaceView surfaceView = (SurfaceView) findViewById(R.id.preview_view); SurfaceHolder surfaceHolder = surfaceView.getHolder(); Log.e(TAG, "hasSurface="+hasSurface); if (hasSurface) { ...
  • 转载自https://blog.csdn.net/RoseChan/article/details/51486513 1-Activity生命周期 2-Fragment生命周期 3-Service生命周期 4-View的绘制流程图 5-Looper-Message-Handler...7-SurfaceView生命周期 ...
  • Iwfu-安卓重要的生命周期图和流程图

    千次阅读 2016-05-24 01:18:29
    1-Activity生命周期2-Fragment生命周期3-Service生命周期4-View的绘制流程图5-Looper-Message-Handler流程图6-MediaPlayer生命周期7-SurfaceView生命周期8-Activity状态保存恢复流程图:9-IBinder在Android系统使用...
  • 本文目录SurfaceView与View区别使用缓冲的Canvas绘图SurfaceView生命周期实现天气APP背景自动左右循环移动效果 SurfaceView与View区别 前面我们所有的讲解基本都是自定义View来实现各种Android的自定义控件,但...
  • SurfaceView

    2017-03-14 18:39:24
    Android 游戏开发框架核心组件SurfaceView 介绍1、SurfaceView 就是带 Surface 的 view,它是一个 View,是 View 的子类,所以和其他 View 一样,可以在屏幕上展示东西接收用户输入,具有 View 的生命周期回调函数,...
  • surfaceview

    2016-07-14 18:46:01
    SurfaceView 就是带 Surface 的 view,它是一个 View,是 View 的子类,所以和其他 View 一样,可以在屏幕上展示东西接收用户输入,具有 View 的生命周期回调函数,如 onMeasure、onLayout、onDraw
  • 关于SurfaceView

    千次阅读 2013-06-02 15:06:08
    SurfaceView 是在子线程中更新画面的...使用SurfaceView 通常要实现 SurfaceHolder.Callback接口,SurfaceView 类的生命周期有3个回调函数,分别为: public abstract void surfaceCreated(SurfaceHolder holder) 在Surf
  • surfaceview的特点 主要是可以高频路的更新UI 双缓存 例子 [00:22.600]苍茫的天涯是我的爱 ...播放音乐 Medaplayer 也可以用于播放视频 在SurfaceView生命周期 surfaceCreated中绑定Medaplayer : Medapla...
  • 通过replace 添加 的 Fragment,当前已存在的Fragment被替换时走生命周期销毁流程,传递给replace方法的Fragment走生命周期创建流程。 根据以上结论,我们可以得到一个实例开发中添加Fragment时很重要的一个结论: ...
  • Surfaceview注意点

    千次阅读 2017-01-12 10:25:44
    surfaceview会根据activity的生命周期自动控制surface的生命周期,根据activity的onResume,onPause执行surfaceCreated,surfaceDestroyed。对surface的操作必须在这个生命周期内进行。 一个简单的camera结合...
  • android TextureView的生命周期

    千次阅读 2018-08-22 16:14:12
    不过对它的生命周期都没什么研究一直以为和SurfaceView差不多,可是最近在其他手机上测试的时候发现并不是这样的,用TextureView必须要使用SurfaceTextureListener textureView.setSurfaceTextureListener(new ...
  • 关于SurfaceView和绘制

    2018-02-26 19:17:34
    SurfaceView ...  SurfaceView生命周期方法并不直接提供出来,而是通过实现其成员变量SerfaceHolder的回调来监听,该接口要求我们重写三个方法,分别是: @Override public void surfaceC...
  • 前言因为朋友的一个问题引发了对这个问题的探索,当然一如既往的先去...2、关于Activity与SurfaceView生命周期 下面是复制的里面的具体内容: 锁屏分为两个步骤,先是锁定屏幕,再是黑屏 onCreate(在该方法里锁屏)
  • surfaceView 使用心得

    2014-11-04 18:49:42
    surfaceViewsurfacesurfaceHoldlr surface是一块内存提供一个canvas可以换图,surfaceView给surface提供了显示窗口,...surfaceView影响着surface的生命周期,当surfaceView隐藏时,系统会销毁surface。当sur...
  • SurfaceView的操作类

    2015-11-16 15:08:22
    写一个类,继承SurfaceView,在其构造方法中,获取surfaceHolder,并得到SurfaceView生命周期。在surfaceCreated方法里,开启绘制线程,在surfaceDestory方法里,关闭线程。在线程里,每隔50s绘制一次。绘制方法用...
  • 一、 surfaceview主要作用 ...surfaceCreated有特定的生命周期,注意在callback中进行操作。(具体请看例子) 三、清屏操作(绘制图像) public void clearDraw(SurfaceHolder holder,int color) { Log.w("tan","...
  • surfaceview的使用

    2013-04-23 16:38:09
    surfaceview使用时,调用方法addCallback(),是注册观察者,用来回调3个surface生命周期控制方法 removeCallback()是取消注册,应该在不需要sfh的时候调用
  • 今天在写到surfaceview的时候,在从home界面进入程序的时候,callback的surfaceCreated回调会被调用两次,突然想到之前我碰到横屏的时候activity生命周期混乱的问题,在mainfest里面再次添加android:configChanges=...
  • SurfaceView是在子线程中进行绘制的,SurfaceHolder提供Canvas并管理SurfaceView生命周期。二、模板编程思路 1、继承SurfaceView,声明一个绘制的线程,获取SurfaceHolder,控制线程的变量,Canvas。 2、构造方法...
  • 这个问题让我忙活两天,要命的是只在android sdk 2.2, 2.3 系统偶尔出现,刚开始还以为是内存不足,整了无数种方法,最后直觉百度地图也用的surfaceView,于是问题解决 解决办法: @Override ...
  • SurfaceView使用日记(一)

    2016-08-28 09:24:39
    SurfaceView简介SurfaceView是继承于View的一个子类,所系它本身也是一个View,和View有着同样的生命周期和回调函数.但是SurfaceView和View也有着很大的区别:1.SurfaceView开通了一个子的线程进行页面的刷新2....
  • surface就是原始像素数据的缓冲区surface有生命周期,当surfaceView显示在屏幕上的时候,会创建surfacesurfaceView从屏幕上消失时,surface随即销毁surface不存在的时候,必须保证没有任何内容在它上面绘制...

空空如也

空空如也

1 2 3 4 5 6
收藏数 109
精华内容 43
关键字:

surfaceview生命周期