视频播放器(四)——总结篇
2016-03-31 02:33
369 查看
在总结之前,先把上一篇遗留的两个问题讲完。
一. 顶部底部布局的显示和隐藏:
之前我们有讲,在进入PlayActivity后,我们调用visibleSurfaceTopAndBottom()方法默认隐藏顶部底部的布局,此时我们来看这个方法:
其实这里边就是使用一个boolean变量isTopBottomVisible来控制显示或隐藏。当然一开始默认值是false。
当我们触摸SurfaceView时,这个两个布局就会显示,再次触摸则会隐藏,并且在一定时间内没有触摸也会自动隐藏。所以,需要为SurfaceView设置onTouchListener:
在onTouch方法中,当ACTION_DOWN发生时,发送一个VISIBLE_TOP_BOTTOM消息给Handler。看在handlerMessage中的处理:
可以看到,在handlerMessage中也调用了visibleSurfaceTopAndBottom()这个方法,然后如果isTopBottomVisible==true, 5秒中没有触摸SurfaceView,则自动隐藏。
二. 横竖屏的切换:
横竖屏的切换一般分为重力感应自动切换或点击按钮手动切换,因为这两个之间有点冲突,所以项目只是实现了点击按钮手动切换。在竖屏时,点击切换到横屏,在横屏时,点击切换到竖屏。
在onClick中的代码:
判断屏幕当前处于横屏还是竖屏,然后通过setRequestOrientation方法设置屏幕方向,当调用完setRequestOrientation方法后,回会调onConfigurationChanged方法:
当屏幕方向改变到横屏时,首先需要隐藏状态栏,然后设置SurfaceView的父布局的LayoutParams为match_parent, 显示TopSeekBar和系统时间mTvSystemTime。当屏幕方向改变到竖屏时,首先清除隐藏状态栏的Flag,再将SurfaceView的父布局的LayoutParams恢复到竖屏大小,隐藏TopSeekBar和系统时间mTvSystemTime。
其实这里还有一个比较重要的一点,一般屏幕方向改变时,Activity都会被销毁并重新创建,这样一来,我们之前所以的变量都没有了,一般的做法只能先保存到本地然后重新创建时再读取。这样做比较麻烦,我们可以直接设置Activity在切换屏幕方向时不销毁就可以了。在AndroidMainifest.xml文件中给PlayActivity设置configChanges属性,如下:
到此,视频播放的所有功能都已经讲完了,功能虽然不多,但是实现起来还是费了很大的劲,还是实力不够啊!
三. 遗留问题:
(1) 在视频列表中,rmvb格式的视频获取总时长时为0
(2) 在横屏播放视频时,不能按照视频比例播放视频
(3) 在onPrepared方法中设置MediaPlayer.setDisplay(holder)方法,rmvb格式的视频会出现播放错误的情况,不知道什么情况?但是在surfaceCreate方法中调用,播放就没有问题
(4) AVI格式视频播放没有声音,包括一些其他的视频播放器也是如此
以上问题如果有大神知道,还望告知,感谢!
四. 总结:
通过这个项目的实战,虽然并没有做到一般播放器那样,但是基本功能都是有的,而且自己还是从中学到了很多东西。对于SurfaceView和MediaPlayer更加深入的了解。作为一个程序员,要想提高技术,还是要多实践,多练习!
源码下载
一. 顶部底部布局的显示和隐藏:
之前我们有讲,在进入PlayActivity后,我们调用visibleSurfaceTopAndBottom()方法默认隐藏顶部底部的布局,此时我们来看这个方法:
/** * 设置顶部,底部布局的显示和隐藏 */ private void visibleSurfaceTopAndBottom() { if (isTopBottomVisible) { mRlSurfaceTop.setVisibility(View.GONE); mRlSurfaceBottom.setVisibility(View.GONE); isTopBottomVisible = false; } else { mRlSurfaceTop.setVisibility(View.VISIBLE); mRlSurfaceBottom.setVisibility(View.VISIBLE); isTopBottomVisible = true; } }
其实这里边就是使用一个boolean变量isTopBottomVisible来控制显示或隐藏。当然一开始默认值是false。
当我们触摸SurfaceView时,这个两个布局就会显示,再次触摸则会隐藏,并且在一定时间内没有触摸也会自动隐藏。所以,需要为SurfaceView设置onTouchListener:
mSv.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: mHandler.sendEmptyMessage(VISIBLE_TOP_BOTTOM); break; } return false; } });
在onTouch方法中,当ACTION_DOWN发生时,发送一个VISIBLE_TOP_BOTTOM消息给Handler。看在handlerMessage中的处理:
case VISIBLE_TOP_BOTTOM: visibleSurfaceTopAndBottom(); if (isTopBottomVisible && !mHandler.hasMessages(VISIBLE_TOP_BOTTOM)) { mHandler.sendEmptyMessageDelayed(VISIBLE_TOP_BOTTOM, 5000); } break;
可以看到,在handlerMessage中也调用了visibleSurfaceTopAndBottom()这个方法,然后如果isTopBottomVisible==true, 5秒中没有触摸SurfaceView,则自动隐藏。
二. 横竖屏的切换:
横竖屏的切换一般分为重力感应自动切换或点击按钮手动切换,因为这两个之间有点冲突,所以项目只是实现了点击按钮手动切换。在竖屏时,点击切换到横屏,在横屏时,点击切换到竖屏。
在onClick中的代码:
case R.id.play_suspension: if (getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } else if (getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } break;
判断屏幕当前处于横屏还是竖屏,然后通过setRequestOrientation方法设置屏幕方向,当调用完setRequestOrientation方法后,回会调onConfigurationChanged方法:
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); onScreenOrientationChanged(newConfig); }
/** * 当屏幕方向发生改变时 * * @param config */ private void onScreenOrientationChanged(Configuration config) { if (config.orientation == Configuration.ORIENTATION_LANDSCAPE) {//横屏 //隐藏状态栏 WindowManager.LayoutParams attrs = getWindow().getAttributes(); attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN; getWindow().setAttributes(attrs); getWindow().addFlags( WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); ViewGroup.LayoutParams lp = mFlLayout.getLayoutParams(); lp.height = ViewGroup.LayoutParams.MATCH_PARENT; mFlLayout.setLayoutParams(lp); mIvSuspension.setImageResource(R.mipmap.video_play_icon_suspension); mRlTopSeerBar.setVisibility(View.VISIBLE); mTvSystemTime.setVisibility(View.VISIBLE); } else if (config.orientation == Configuration.ORIENTATION_PORTRAIT) {//竖屏 //显示状态栏 WindowManager.LayoutParams attrs = getWindow().getAttributes(); attrs.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN); getWindow().setAttributes(attrs); getWindow().clearFlags( WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); ViewGroup.LayoutParams lp = mFlLayout.getLayoutParams(); lp.height = DisplayUtils.dip2px(this, 220); mFlLayout.setLayoutParams(lp); mIvSuspension.setImageResource(R.mipmap.video_flotting_play_icon_suspension); mRlTopSeerBar.setVisibility(View.GONE); mTvSystemTime.setVisibility(View.GONE); } }
当屏幕方向改变到横屏时,首先需要隐藏状态栏,然后设置SurfaceView的父布局的LayoutParams为match_parent, 显示TopSeekBar和系统时间mTvSystemTime。当屏幕方向改变到竖屏时,首先清除隐藏状态栏的Flag,再将SurfaceView的父布局的LayoutParams恢复到竖屏大小,隐藏TopSeekBar和系统时间mTvSystemTime。
其实这里还有一个比较重要的一点,一般屏幕方向改变时,Activity都会被销毁并重新创建,这样一来,我们之前所以的变量都没有了,一般的做法只能先保存到本地然后重新创建时再读取。这样做比较麻烦,我们可以直接设置Activity在切换屏幕方向时不销毁就可以了。在AndroidMainifest.xml文件中给PlayActivity设置configChanges属性,如下:
<activity android:name=".activity.PlayActivity" android:configChanges="orientation|screenSize|keyboardHidden"></activity>
到此,视频播放的所有功能都已经讲完了,功能虽然不多,但是实现起来还是费了很大的劲,还是实力不够啊!
三. 遗留问题:
(1) 在视频列表中,rmvb格式的视频获取总时长时为0
(2) 在横屏播放视频时,不能按照视频比例播放视频
(3) 在onPrepared方法中设置MediaPlayer.setDisplay(holder)方法,rmvb格式的视频会出现播放错误的情况,不知道什么情况?但是在surfaceCreate方法中调用,播放就没有问题
(4) AVI格式视频播放没有声音,包括一些其他的视频播放器也是如此
以上问题如果有大神知道,还望告知,感谢!
四. 总结:
通过这个项目的实战,虽然并没有做到一般播放器那样,但是基本功能都是有的,而且自己还是从中学到了很多东西。对于SurfaceView和MediaPlayer更加深入的了解。作为一个程序员,要想提高技术,还是要多实践,多练习!
源码下载
相关文章推荐
- Thread详解12:InheritableThreadLocal的使用
- QT20 database values in QLineEdit or textbox if select combobox
- Java并发编程:如何创建线程?
- Java_chapter20_递归
- 利用 Behavior Driven Development 技术加强软件自动化测试
- QT19 How to link QComboBox with sqlite Database values
- java android中对list的时间进行排序
- 项目坑
- arcgis for android 无法加载本地jpg影像解决办法
- QT18 how to link QListView with sqlite Database values
- 面向对象编程的原则
- 设计模式之 抽象工厂模式的扩展(C++实现)
- Java并发编程:volatile关键字解析
- Qt17 load sqlite table data to qtableview
- 转:典型错误:locale.Error:unsupported locale setting
- android studio 使用技巧
- gcc,gdb,makefile
- Two Sum
- 导入内容错误
- linux环境变量