早上起来有时间,发一篇博文,最近在开发电视机顶盒的视频播放,涉及到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() 这个方法。

好了,今天的博文就到这里,也算是大功一件。

源码地址下载

更多相关文章

  1. Android(安卓)UI控件之CheckBox实现墨迹天气设置布局界面(漂亮)
  2. 【转】Android自适应不同分辨率或不同屏幕大小的layout布局(横屏
  3. Android开发之旅:深入分析布局文件
  4. Android(安卓)4.0 Launcher源码分析系列(一)
  5. Android(安卓)Material Design:CoordinatorLayout与NestedScrollV
  6. Android(安卓)多媒体 -- 四种播放视频的方法
  7. android布局相关
  8. Android界面——控件和布局
  9. Android实现环形进度条的实例

随机推荐

  1. Android中visibility的3个属性说明
  2. Android 中文api (81)——InputMethod [
  3. Android MimeType和MimeTypeMap的介绍
  4. android之Progress
  5. Textview基本属性及功能
  6. Android数据存储
  7. android 上调试动态库方法
  8. Android关于LinearLayout的设置问题
  9. Android音频架构解析
  10. android TabHost选项卡示例