早上起来有时间,发一篇博文,最近在开发电视机顶盒的视频播放,涉及到Android当中比较常见的视频播放器控件的使用,以此为例,记录下来。
源码地址下载。
首先,上效果图:
通过VideoView播放视频的步骤:
实现方式:使用XML布局和java代码控件绑定的形式。
1、在界面布局文件中定义VideoView组件。
2、调用VideoView的如下两个方法来加载指定的视频
setVidePath(String path):加载path文件代表的视频
setVideoURI(Uri uri):加载uri所对应的视频
3、调用VideoView的start()、stop()、psuse()方法来控制视频的播放
4、VideoView通过setMediaController()方法与MediaController类结合使用,来控制播放、暂停和快进快退。
setMediaController(MediaController mediaController);
下面上代码,主界面MainActivity.java :
public class MainActivity extends Activity {
VideoView mVideoView1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 播放网络视频
// Uri uri = Uri
// .parse("http://vfx.mtime.cn/Video/2016/03/16/mp4/160316113358220143.mp4 ");
// 播放本地视频
Uri uri = Uri.parse(Environment.getExternalStorageDirectory().getPath()
+ "/Launcher/09.mp4");
mVideoView1 = (VideoView) this.findViewById(R.id.mVedioView1);
MediaController mediaController = new MediaController(this);
mVideoView1.setMediaController(mediaController);
mVideoView1.setVideoURI(uri);
// mVideoView1.requestFocus();
mVideoView1.start();
}
}
对应的界面布局 activity_main.xml :
"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="com.example.test_mediaplayer.MainActivity" >
<com.example.test_mediaplayer.WrapVideoView
android:id="@+id/mVedioView1"
android:layout_width="match_parent"
android:layout_height="match_parent" >
com.example.test_mediaplayer.WrapVideoView>
会发现,布局中使用个并不是VideoView,而是自定义的WrapVideoView,那么为什么要自定义呢?
原因很简单,Android 的VideoView控件在 onMeasure(int widthMeasureSpec, int heightMeasureSpec)
方法中对控件的宽高进行了操作,使得视频的宽高根据实际宽高进行了缩放,如果直接使用VideoView,则会导致如下效果:
可以看到视频的高正常,但是宽并没有占满全屏,所以,我们可以自己定义一个类来继承VideoView,重写onMeasure()
方法。
WrapVideoView.java:
public class WrapVideoView extends VideoView {
public WrapVideoView(Context context) {
super(context);
requestFocus();
}
public WrapVideoView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public WrapVideoView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = getDefaultSize(getWidth(), widthMeasureSpec);
int height = getDefaultSize(getHeight(), heightMeasureSpec);
setMeasuredDimension(width, height);
}
}
这样一来,呈现的界面就和第一张效果图一样了,是不是感觉有点成就感,哈哈。
如果有时间有兴趣的话,读者可以自己去VideoView的源码看一下 onMeasure()
这个方法。
好了,今天的博文就到这里,也算是大功一件。
源码地址下载。