SurfaceView是视图(View)的继承类,这个视图里内嵌了一个专门用于绘制的surface。我们可以控制这个surface的格式和尺寸。SurfaceView控制这个surface绘制的位置。surface类直接继承Object,对应了一块屏幕缓冲区,每个窗口window对应一个Surface,任何View都是画在Surface上的,传统的view共享一块屏幕缓冲区。
MediaPlayer包含了Audio和video的播放功能,在Android的界面上,Music和Video两个应用程序都是调用MediaPlayer实现的。
MediaPlayer在底层是基于OpenCore(PacketVideo)的库实现的,为了构建一个MediaPlayer程序,上层还包含了进程间通讯等内容,这种进程间通讯的基础是Android基本库中的Binder机制。
SharedPreferences是Android平台上一个轻量级的存储类,用来保存应用的一些常用配置
下面是布局代码:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout 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" tools:context="com.example.surfaceview_video.MainActivity"> <SurfaceView android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/surfaceView" android:layout_centerVertical="true" android:layout_centerHorizontal="true"/> </RelativeLayout>
MainActivity代码,其中多媒体数据源,为博主虚拟机sdcard中数据的路径,请自行设置数据源
package com.example.surfaceview_video; import android.content.SharedPreferences; import android.media.MediaPlayer; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.SurfaceHolder; import android.view.SurfaceView; import java.io.IOException; public class MainActivity extends AppCompatActivity { private SurfaceView mSurfaceView; private MediaPlayer mediaPlayer; private SharedPreferences sp; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //初始化控件 mSurfaceView = (SurfaceView) findViewById(R.id.surfaceView); //建立sharedPreferences对象 sp= getSharedPreferences("config", MODE_PRIVATE); //创建Mediaplayer的对象 mediaPlayer = new MediaPlayer(); try { //设置多媒体类的数据源(可以播放音乐或视频) mediaPlayer.setDataSource("/storage/emulated/0/Download/oppo.3gp"); //让多媒体对象做好播放的准备 mediaPlayer.prepare(); } catch (IOException e) { e.printStackTrace(); } //获取SurfaceView的控制器 final SurfaceHolder holder = mSurfaceView.getHolder(); //设置对SurfaceView对象的监听 holder.addCallback(new SurfaceHolder.Callback() { @Override//surfaceView创建时执行 public void surfaceCreated(SurfaceHolder surfaceHolder) { //指定多媒体对象用哪个控件播放视频资源 mediaPlayer.setDisplay(holder); //获取之前存放的位置,通过sp int config = sp.getInt("config",0); //让MediaPlayer根据这个进度进行播放 mediaPlayer.seekTo(config); //使用MediaPlayer播放音乐 mediaPlayer.start(); } @Override//surfaceView被改变的时候 public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) { } @Override//surfaceView被销毁时执行 public void surfaceDestroyed(SurfaceHolder surfaceHolder) { //当多媒体对象存在时,关闭MediaPlayer对象,释放资源的逻辑操作 if (mediaPlayer != null){ //把记录下来当前播放的位置 int currentPosition = mediaPlayer.getCurrentPosition(); //把记录下来的位置保存到sp下,先得到一个sp的编辑器,再根据数据存储的类型把数据存到文件里进行提交 sp.edit().putInt("config",currentPosition).commit(); //关闭MediaPlayer对象 mediaPlayer.stop(); //释放MediaPlayer资源 mediaPlayer.release(); } } }); } }