Vitamio库打造万能播放器(四)

来源:互联网 发布:系统 数据库备份策略 编辑:程序博客网 时间:2024/04/29 07:20

转自http://blog.csdn.net/mchenys/article/details/50571833


终于到了介绍vitamio的使用了,这个库使用起来非常简单,很容易上手,只需要将前面我们创建好的VideoPlayerActivity的VideoView相关的api的包名换一下即可,无需改动其他代码如下所示:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package mchenys.net.csdn.blog.myplayer.module.video;  
  2.   
  3. import android.content.BroadcastReceiver;  
  4. import android.content.Context;  
  5. import android.content.Intent;  
  6. import android.content.IntentFilter;  
  7. import android.media.AudioManager;  
  8. import android.net.Uri;  
  9. import android.os.Bundle;  
  10. import android.os.Handler;  
  11. import android.text.format.DateFormat;  
  12. import android.view.GestureDetector;  
  13. import android.view.MotionEvent;  
  14. import android.view.View;  
  15. import android.widget.ImageButton;  
  16. import android.widget.ImageView;  
  17. import android.widget.LinearLayout;  
  18. import android.widget.SeekBar;  
  19. import android.widget.TextView;  
  20.   
  21. import java.util.List;  
  22.   
  23. import io.vov.vitamio.LibsChecker;  
  24. import io.vov.vitamio.MediaPlayer;  
  25. import io.vov.vitamio.widget.VideoView;  
  26. import mchenys.net.csdn.blog.myplayer.R;  
  27. import mchenys.net.csdn.blog.myplayer.common.base.BaseActivity;  
  28. import mchenys.net.csdn.blog.myplayer.common.config.Constant;  
  29. import mchenys.net.csdn.blog.myplayer.common.model.Video;  
  30. import mchenys.net.csdn.blog.myplayer.common.utils.LogUtils;  
  31. import mchenys.net.csdn.blog.myplayer.common.utils.TimeUtils;  
  32. import mchenys.net.csdn.blog.myplayer.common.utils.UIUtils;  
  33. import mchenys.net.csdn.blog.myplayer.common.widget.TitleBar;  
  34. import mchenys.net.csdn.blog.myplayer.common.widget.nineoldandroids.view.ViewHelper;  
  35. import mchenys.net.csdn.blog.myplayer.common.widget.nineoldandroids.view.ViewPropertyAnimator;  
  36.   
  37. /** 
  38.  * Vitamio 万能视频播放器 
  39.  * 直接从VideoPlayerActivity修改Copy过来,关于VideoView的api完全一样,只是导包不一样. 
  40.  * 1.多了这一句 if (!LibsChecker.checkVitamioLibs(this)) return; 以及内部的VideoView对全屏和按比例缩放的代码处理方式不一样 
  41.  * 2.布局文件换成了activity_video_player_vitamio 
  42.  * Created by mChenys on 2016/1/17. 
  43.  */  
  44. public class VitamioVideoPlayerActivity extends BaseActivity {  
  45.   
  46.     private VideoView mVideoView;  
  47.     private int mPosition;  
  48.     private List<Video> mVideoList;  
  49.     private ImageButton mBackIb, mPreIb, mNextIb, mPlayIb, mFullScreenIb, mVolumeIb;  
  50.     private TextView mTitleTv, mSysTimeTv, mCurrVideoPositionTv, mVideoDurationTv;  
  51.     private ImageView mBatteryIv;  
  52.     private View mBrightnessView;  
  53.     private LinearLayout mTopControlLl, mBottomControlLl;  
  54.     private Handler mHandler;  
  55.     private AudioManager mAudioManager;  
  56.     private int mMaxVolume, mCurrVolume;  
  57.     private SeekBar mVolumeSb, mVideoSb;  
  58.     private GestureDetector mGestureDetector;  
  59.     private float mVolumeScreenHeightScale;  
  60.     private float mCurrBrightness;  
  61.     private boolean mIsLeftDown;  
  62.     private float mBrightnessScreenHeightScale;  
  63.     private Video mVideo;  
  64.   
  65.     @Override  
  66.     protected void setTitleBar(TitleBar titleBar) {  
  67.         titleBar.setVisibility(View.GONE);  
  68.     }  
  69.   
  70.     @Override  
  71.     protected boolean isHomePage() {  
  72.         return false;  
  73.     }  
  74.   
  75.     @Override  
  76.     public Integer getLayoutResId() {  
  77.         return R.layout.activity_video_player_vitamio;  
  78.     }  
  79.   
  80.     @Override  
  81.     public void initView() {  
  82.         mVideoView = findView(R.id.videoView);  
  83.         mTitleTv = findView(R.id.tv_title);//标题  
  84.         mSysTimeTv = findView(R.id.tv_system_time);//系统时间  
  85.         mCurrVideoPositionTv = findView(R.id.tv_current_position);//当前播放位置  
  86.         mVideoDurationTv = findView(R.id.tv_duration);//视频时长  
  87.         mVolumeIb = findView(R.id.ib_voice);//静音  
  88.         mBackIb = findView(R.id.ib_back);//返回  
  89.         mPreIb = findView(R.id.ib_pre);//上一首  
  90.         mPlayIb = findView(R.id.ib_play);//播放  
  91.         mNextIb = findView(R.id.ib_next);//下一首  
  92.         mFullScreenIb = findView(R.id.ib_fullScreen);//全屏  
  93.         mBatteryIv = findView(R.id.iv_battery);//电量  
  94.         mVolumeSb = findView(R.id.sb_voice);//音量进度seekBar  
  95.         mVideoSb = findView(R.id.sb_video);//视频进度seekBar  
  96.         mBrightnessView = findView(R.id.view_brightness);//通过透明度改变屏幕亮度的view  
  97.         //默认隐藏控制面板  
  98.         mTopControlLl = findView(R.id.ll_top_ctrl);//顶部控制面板  
  99.         mBottomControlLl = findView(R.id.ll_bottom_ctrl);//底部控制面板  
  100.     }  
  101.   
  102.     @Override  
  103.     public void initListener() {  
  104.         //设置视频准备监听器  
  105.         mVideoView.setOnPreparedListener(mOnPreparedListener);  
  106.         //设置视频播放完毕的监听器  
  107.         mVideoView.setOnCompletionListener(mOnCompletionListener);  
  108.         //设置音量改变的seekBar监听器  
  109.         mVolumeSb.setOnSeekBarChangeListener(mVolumeSeekBarChangeListener);  
  110.         //设置视频进度改变的seekBar监听器  
  111.         mVideoSb.setOnSeekBarChangeListener(mVideoSeekBarChangeListener);  
  112.         //设置缓冲监听  
  113.         mVideoView.setOnBufferingUpdateListener(mOnBufferingUpdateListener);  
  114.         //设置视频卡顿监听器  
  115.         mVideoView.setOnInfoListener(mOnInfoListener);  
  116.     }  
  117.   
  118.     @Override  
  119.     public void initData() {  
  120.         //注册电量接收器  
  121.         registerBatteryReceiver();  
  122.         // 检查Vitamio插件是否安装  
  123.         if (!LibsChecker.checkVitamioLibs(this)) return;  
  124.         mHandler = new Handler();  
  125.         Uri videoUri = getIntent().getData();  
  126.         if (null != videoUri) {  
  127.             // 说明是从第三方应用跳转过来的  
  128.             mLoadView.setProgressBarVisiable(true);  
  129.             mVideoView.setVideoURI(videoUri);  
  130.             mTitleTv.setText(videoUri.getPath());  
  131.             mPreIb.setEnabled(false);  
  132.             mNextIb.setEnabled(false);  
  133.         } else {  
  134.             //说明是从播放列表进入的  
  135.             Bundle bundle = getIntent().getExtras();  
  136.             if (null == bundle || bundle.size() < 0) {  
  137.                 mLoadView.setExceptionViewVisible(true);  
  138.                 return;  
  139.             }  
  140.             mPosition = bundle.getInt(Constant.KEY_POSITION);  
  141.             mVideoList = bundle.getParcelableArrayList(Constant.KEY_LIST);  
  142.             //设置当前播放的视频  
  143.             setCurrPlayVideo();  
  144.         }  
  145.         //初始化音量  
  146.         initVolume();  
  147.         //初始化手势监听器  
  148.         initGestures();  
  149.         //初始化亮度值  
  150.         initBrightness();  
  151.     }  
  152.   
  153.     @Override  
  154.     public void reLoadData() {  
  155.   
  156.     }  
  157.   
  158.     /** 
  159.      * 设置当前播放的视频 
  160.      */  
  161.     private void setCurrPlayVideo() {  
  162.         if (mVideoList == null || mVideoList.isEmpty() || mPosition == -1) {  
  163.             return;  
  164.         }  
  165.         mLoadView.setProgressBarVisiable(true);  
  166.         LogUtils.i(this"mPosition:" + mPosition + " mVideoList:" + mVideoList);  
  167.         //设置上一个/下一个按钮不可用时的背景图片  
  168.         mPreIb.setEnabled(mPosition != 0);//当前不是第一个,则可点击上一个  
  169.         mNextIb.setEnabled(mPosition != mVideoList.size() - 1);//当前不是最后一个,则可以点击下一个  
  170.         //从列表中取出要播放的视频  
  171.         mVideo = mVideoList.get(mPosition);  
  172.         //设置播放的地址  
  173.         mVideoView.setVideoPath(mVideo.path);  
  174.     }  
  175.   
  176.     /** 
  177.      * 初始化亮度值 
  178.      */  
  179.     private void initBrightness() {  
  180.         mBrightnessView.setVisibility(View.VISIBLE);  
  181.         ViewHelper.setAlpha(mBrightnessView, 0f);//一开始完全透明  
  182.         mBrightnessScreenHeightScale = 1.0f / UIUtils.getScreenHeight();//透明度和屏幕高度的比例  
  183.     }  
  184.   
  185.     /** 
  186.      * 初始化手势监听器 
  187.      */  
  188.     private void initGestures() {  
  189.         //手势监听器  
  190.         mGestureDetector = new GestureDetector(this, mOnGestureListener);  
  191.         //最大音量和屏幕高度的比例  
  192.         mVolumeScreenHeightScale = mMaxVolume * 1.0f / UIUtils.getScreenHeight();  
  193.         LogUtils.i(VitamioVideoPlayerActivity.this"mVolumeScreenHeightScale:" + mVolumeScreenHeightScale + " mMaxVolume:" + mMaxVolume  
  194.                 + " Env.screenHeight:" + UIUtils.getScreenHeight());  
  195.   
  196.     }  
  197.   
  198.     /** 
  199.      * 注册电量变化的接收器 
  200.      */  
  201.     private void registerBatteryReceiver() {  
  202.         IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);  
  203.         registerReceiver(mBatteryChangeReceiver, filter);  
  204.     }  
  205.   
  206.     /** 
  207.      * 初始化音量控制 
  208.      */  
  209.     private void initVolume() {  
  210.         mAudioManager = (AudioManager) getSystemService(AUDIO_SERVICE);  
  211.         mMaxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);//最大音量  
  212.         mCurrVolume = getStreamVolume();//当前音量  
  213.         mVolumeSb.setMax(mMaxVolume);  
  214.         mVolumeSb.setProgress(mCurrVolume);  
  215.     }  
  216.   
  217.     /** 
  218.      * 获取当前音量 
  219.      * 
  220.      * @return 
  221.      */  
  222.     private int getStreamVolume() {  
  223.         return mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);  
  224.     }  
  225.   
  226.     /** 
  227.      * 更新系统音量进度 
  228.      */  
  229.     private void updateVolumePosition(int progress) {  
  230.         int streamType = AudioManager.STREAM_MUSIC;  
  231.         int flags = 0//0:不显示系统音量面板,1:显示  
  232.         mAudioManager.setStreamVolume(streamType, progress, flags);  
  233.     }  
  234.   
  235.     /** 
  236.      * 切换音量 
  237.      */  
  238.     private void toggleVolume() {  
  239.         if (getStreamVolume() > 0) {  
  240.             //设置为静音  
  241.             mCurrVolume = getStreamVolume();  
  242.             updateVolumePosition(0);  
  243.             mVolumeSb.setProgress(0);  
  244.         } else {  
  245.             //恢复之前音量  
  246.             updateVolumePosition(mCurrVolume);  
  247.             mVolumeSb.setProgress(mCurrVolume);  
  248.         }  
  249.     }  
  250.   
  251.     /** 
  252.      * 通过手势改变音量大小 
  253.      * 
  254.      * @param deltaY 
  255.      */  
  256.     private void changeGestureVolume(float deltaY) {  
  257.         // 1、触摸(onTouchEvent方法中处理)  
  258.         // 2、识别手势(GuestureDetactor)  
  259.         // 3、计算音量最大值与屏幕高的比例  
  260.         // 4、计算移动的距离等于多少对应的音量值  
  261.   
  262.         //最终的音量=当前音量+滑动距离*比例  
  263.         int changeVolume = (int) (deltaY * mVolumeScreenHeightScale);  
  264.         int finalVolume = mCurrVolume + changeVolume;  
  265.   
  266.         // 预防超出范围  
  267.         if (finalVolume > mMaxVolume) {  
  268.             finalVolume = mMaxVolume;  
  269.         } else if (finalVolume < 0) {  
  270.             finalVolume = 0;  
  271.         }  
  272.         updateVolumePosition(finalVolume);  
  273.         mVolumeSb.setProgress(finalVolume);  
  274.         LogUtils.i(VitamioVideoPlayerActivity.this"当前音量:" + finalVolume);  
  275.     }  
  276.   
  277.     /** 
  278.      * 改变亮度 
  279.      * 
  280.      * @param deltaY 
  281.      */  
  282.     private void changeGestureBrightness(float deltaY) {  
  283.         // 1、触摸(onTouchEvent方法中处理)  
  284.         // 2、识别手势(GuestureDetactor)  
  285.         // 3、计算亮度最大值与屏幕高的比例  
  286.         // 4、计算移动的距离等于多少对应的亮度值  
  287.         float changeBrightness = deltaY * mBrightnessScreenHeightScale;  
  288.         // 5、在原来亮度的基础上加上移动对应的亮度值  
  289.         //这里取changeBrightness的相反值,是因为往上移动需要屏幕变亮,所以透明度值要变小  
  290.         float finalBrightness = mCurrBrightness - changeBrightness;  
  291.         if (finalBrightness < 0f) {  
  292.             finalBrightness = 0f;  
  293.         } else if (finalBrightness > 0.8f) {  
  294.             finalBrightness = 0.8f;//这里不能太接近1,1的话就什么都看不到了.  
  295.         }  
  296.         ViewHelper.setAlpha(mBrightnessView, finalBrightness);  
  297.     }  
  298.   
  299.     /** 
  300.      * 显示系统时间 
  301.      */  
  302.     private void updateSysTime() {  
  303.         mHandler.postDelayed(mUpdateSysTimeRunnable, 1000);  
  304.     }  
  305.   
  306.     /** 
  307.      * 更新视频的播放进度 
  308.      */  
  309.     private void updateVideoPosition() {  
  310.         mHandler.postDelayed(mUpdateVideoPositionRunnable, 300); //更新的频率可以调快一点  
  311.   
  312.     }  
  313.   
  314.     /** 
  315.      * 更新视频的二级缓冲 
  316.      * 
  317.      * @param percent 
  318.      */  
  319.     private void updateSecondaryProgress(int percent) {  
  320.         int secondaryProgress = (int) (mVideoView.getDuration() * percent / 100f);  
  321.         mVideoSb.setSecondaryProgress(secondaryProgress);  
  322.     }  
  323.   
  324.     /** 
  325.      * 播放/暂停视频 
  326.      */  
  327.     private void play() {  
  328.         if (mVideoView.isPlaying()) {  
  329.             mVideoView.pause();  
  330.         } else {  
  331.             mVideoView.start();  
  332.         }  
  333.         setPlayBgSelector();  
  334.     }  
  335.   
  336.     /** 
  337.      * 设置播放按钮的背景选择器 
  338.      */  
  339.     private void setPlayBgSelector() {  
  340.         //如果当前是播放,则显示暂停背景图片选择器  
  341.         //如果当前是暂停,则显示播放背景图片选择器  
  342.         mPlayIb.setImageResource(mVideoView.isPlaying() ? R.drawable.selector_ib_pause : R.drawable.selector_ib_play);  
  343.     }  
  344.   
  345.     /** 
  346.      * 播放上一个 
  347.      */  
  348.     private void pre() {  
  349.         if (mPosition > 0) {  
  350.             mPosition--;  
  351.             setCurrPlayVideo();  
  352.         }  
  353.     }  
  354.   
  355.     /** 
  356.      * 播放下一个 
  357.      */  
  358.     private void next() {  
  359.         if (mPosition != mVideoList.size() - 1) {  
  360.             mPosition++;  
  361.             setCurrPlayVideo();  
  362.         }  
  363.     }  
  364.   
  365.     /** 
  366.      * 在全屏和默认大小之间进行切换 
  367.      */  
  368.     private void toggleFullscreen() {  
  369.         mVideoView.toggleFullscreen();  
  370.         updateFullscreenBtnBg();  
  371.     }  
  372.   
  373.     /** 
  374.      * 更新全屏按钮的背景选择器 
  375.      */  
  376.     private void updateFullscreenBtnBg() {  
  377.         // 如果当前是全屏的,则显示一个恢复默认大小的按钮  
  378.         // 如果当前是默认大小的,则显示一个全屏的按钮  
  379.         mFullScreenIb.setImageResource(mVideoView.isFullscreen() ? R.drawable.selector_ib_default_screen  
  380.                 : R.drawable.selector_ib_full_screen);  
  381.     }  
  382.   
  383.     /** 
  384.      * 隐藏控制面板 
  385.      */  
  386.     private void hideControlLayout() {  
  387.         //瞬时执行隐藏动画  
  388. //        ViewHelper.setTranslationY(mTopControlLl, -mTopControlLl.getMeasuredHeight());//向上移动是负数  
  389. //        ViewHelper.setTranslationY(mBottomControlLl, mBottomControlLl.getMeasuredHeight());//向下移动是正数  
  390.         //带动画效果的隐藏控制面板  
  391.         ViewPropertyAnimator.animate(mTopControlLl).translationY(-mTopControlLl.getHeight());  
  392.         ViewPropertyAnimator.animate(mBottomControlLl).translationY(mBottomControlLl.getHeight());  
  393.     }  
  394.   
  395.     /** 
  396.      * 单击切换控制面板的显示/隐藏 
  397.      */  
  398.     private void toggleHideControlLayout() {  
  399.         //获取mTopControlLl当前相对控件Y坐标的位置  
  400.         float currTranslateY = ViewHelper.getTranslationY(mTopControlLl);  
  401.         if (currTranslateY == 0f) {  
  402.             //当前是显示控制面板的,需要隐藏  
  403.             hideControlLayout();  
  404.         } else {  
  405.             //显示控制面板  
  406.             ViewPropertyAnimator.animate(mTopControlLl).translationY(0f);  
  407.             ViewPropertyAnimator.animate(mBottomControlLl).translationY(0f);  
  408.             //5秒后自动隐藏控制面板  
  409.             HideControlLayoutDelay();  
  410.         }  
  411.     }  
  412.   
  413.     /** 
  414.      * 5秒后自动隐藏控制面板 
  415.      */  
  416.     private void HideControlLayoutDelay() {  
  417.         mHandler.removeCallbacks(mHideControlLayoutRunnable);  
  418.         mHandler.postDelayed(mHideControlLayoutRunnable, 5000);  
  419.     }  
  420.   
  421.     /** 
  422.      * 取消5秒后自动隐藏控制面板,在界面有用户操作(按钮单击、SeekBar手动、Touch事件)的时候取消 
  423.      */  
  424.     private void cancelHideControlLayout() {  
  425.         mHandler.removeCallbacks(mHideControlLayoutRunnable);  
  426.     }  
  427.   
  428.     /** 
  429.      * 更新电量的图标 
  430.      * 
  431.      * @param level 
  432.      */  
  433.     private void updateBatteryByLevel(int level) {  
  434.         int resId;  
  435.         if (level == 0) {  
  436.             resId = R.drawable.ic_battery_0;  
  437.         } else if (level <= 10) {  
  438.             resId = R.drawable.ic_battery_10;  
  439.         } else if (level <= 20) {  
  440.             resId = R.drawable.ic_battery_20;  
  441.         } else if (level <= 40) {  
  442.             resId = R.drawable.ic_battery_40;  
  443.         } else if (level <= 60) {  
  444.             resId = R.drawable.ic_battery_60;  
  445.         } else if (level <= 80) {  
  446.             resId = R.drawable.ic_battery_80;  
  447.         } else {  
  448.             resId = R.drawable.ic_battery_100;  
  449.         }  
  450.         mBatteryIv.setImageResource(resId);  
  451.     }  
  452.   
  453.     @Override  
  454.     public void onClick(View v) {  
  455.         //操作前先取消隐藏控制版面  
  456.         cancelHideControlLayout();  
  457.         switch (v.getId()) {  
  458.             case R.id.ib_voice:  
  459.                 toggleVolume();  
  460.                 break;  
  461.             case R.id.ib_back:  
  462.                 onBackPressed();  
  463.                 break;  
  464.             case R.id.ib_pre:  
  465.                 pre();  
  466.                 break;  
  467.             case R.id.ib_play:  
  468.                 play();  
  469.                 break;  
  470.             case R.id.ib_next:  
  471.                 next();  
  472.                 break;  
  473.             case R.id.ib_fullScreen:  
  474.                 toggleFullscreen();  
  475.                 break;  
  476.         }  
  477.         //延迟隐藏控制版面  
  478.         HideControlLayoutDelay();  
  479.     }  
  480.   
  481.   
  482.     /** 
  483.      * 视频准备完毕的监听 
  484.      */  
  485.     MediaPlayer.OnPreparedListener mOnPreparedListener = new MediaPlayer.OnPreparedListener() {  
  486.         @Override  
  487.         public void onPrepared(MediaPlayer mp) {  
  488.             LogUtils.i(VitamioVideoPlayerActivity.this">>>>>>>>>onPrepared");  
  489.             //隐藏加载圈  
  490.             mLoadView.setHideProgressBarWidthAlpha();  
  491.             //开始播放视频  
  492.             mVideoView.start();  
  493.             if (null != mVideo) {  
  494.                 //显示视频名称  
  495.                 mTitleTv.setText(mVideo.title);  
  496.             }  
  497.             hideControlLayout();  
  498.             //设置视频进度的最大值  
  499.             mVideoSb.setMax((int) mVideoView.getDuration());  
  500.             //设置视频总时长  
  501.             mVideoDurationTv.setText(TimeUtils.format(mVideoView.getDuration()));  
  502.             //更新播放的进度  
  503.             updateVideoPosition();  
  504.             //设置播放按钮的背景选择器  
  505.             setPlayBgSelector();  
  506.         }  
  507.     };  
  508.     /** 
  509.      * 视频播放完毕的监听 
  510.      */  
  511.     MediaPlayer.OnCompletionListener mOnCompletionListener = new MediaPlayer.OnCompletionListener() {  
  512.         @Override  
  513.         public void onCompletion(MediaPlayer mp) {  
  514.             //播放完后,将当前播放进度设置为0  
  515.            // mHandler.removeCallbacks(mUpdateVideoPositionRunnable);  
  516.             mLoadView.setProgressBarVisiable(false);  
  517.             mCurrVideoPositionTv.setText(TimeUtils.format(0));  
  518.             mVideoSb.setProgress(0);  
  519.             mVideoView.seekTo(0);  
  520.             mPlayIb.setImageResource(R.drawable.selector_ib_play);//恢复为播放按钮  
  521.         }  
  522.     };  
  523.   
  524.     /** 
  525.      * 电量改变的接收器 
  526.      */  
  527.     BroadcastReceiver mBatteryChangeReceiver = new BroadcastReceiver() {  
  528.         @Override  
  529.         public void onReceive(Context context, Intent intent) {  
  530. //            PrintUtils.printIntent(intent);  
  531.             int level = intent.getIntExtra("level"0);//电量的等级  
  532.             updateBatteryByLevel(level);  
  533.         }  
  534.     };  
  535.     /** 
  536.      * 更新系统时间的Runnable 
  537.      */  
  538.     Runnable mUpdateSysTimeRunnable = new Runnable() {  
  539.         @Override  
  540.         public void run() {  
  541.             mSysTimeTv.setText(DateFormat.format("HH:mm:ss", System.currentTimeMillis()));  
  542.             updateSysTime();  
  543.         }  
  544.     };  
  545.     /** 
  546.      * 更新视频播放进度的Runnable 
  547.      */  
  548.     Runnable mUpdateVideoPositionRunnable = new Runnable() {  
  549.         @Override  
  550.         public void run() {  
  551.             //获取当前进度,是一个时间毫秒值  
  552.             int currPosition = (int) mVideoView.getCurrentPosition();  
  553.             //更新时间  
  554.             mCurrVideoPositionTv.setText(TimeUtils.format(currPosition));  
  555.             //更新seekBar  
  556.             mVideoSb.setProgress(currPosition);  
  557.             updateVideoPosition();  
  558.         }  
  559.     };  
  560.     /** 
  561.      * 定时隐藏控制面板的Runnable 
  562.      */  
  563.     Runnable mHideControlLayoutRunnable = new Runnable() {  
  564.         @Override  
  565.         public void run() {  
  566.             hideControlLayout();  
  567.         }  
  568.     };  
  569.     /** 
  570.      * 音量改变的SeekBar监听器 
  571.      */  
  572.     SeekBar.OnSeekBarChangeListener mVolumeSeekBarChangeListener = new SeekBar.OnSeekBarChangeListener() {  
  573.         @Override  
  574.         public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {  
  575.             if (fromUser) {  
  576.                 //表示是用户拖动改变的  
  577.                 updateVolumePosition(progress);  
  578.             }  
  579.         }  
  580.   
  581.         //开始拖动  
  582.         @Override  
  583.         public void onStartTrackingTouch(SeekBar seekBar) {  
  584.             cancelHideControlLayout();  
  585.         }  
  586.   
  587.         //停止拖动  
  588.         @Override  
  589.         public void onStopTrackingTouch(SeekBar seekBar) {  
  590.             HideControlLayoutDelay();  
  591.         }  
  592.     };  
  593.     /** 
  594.      * 视频进度改变的SeekBar监听器 
  595.      */  
  596.     SeekBar.OnSeekBarChangeListener mVideoSeekBarChangeListener = new SeekBar.OnSeekBarChangeListener() {  
  597.         @Override  
  598.         public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {  
  599.             if (fromUser) {  
  600.                 //表示是用户拖动改变的  
  601.                 mVideoView.seekTo(progress);  
  602.             }  
  603.         }  
  604.   
  605.         @Override  
  606.         public void onStartTrackingTouch(SeekBar seekBar) {  
  607.             cancelHideControlLayout();  
  608.         }  
  609.   
  610.         @Override  
  611.         public void onStopTrackingTouch(SeekBar seekBar) {  
  612.             HideControlLayoutDelay();  
  613.         }  
  614.     };  
  615.     /** 
  616.      * 视频缓冲监听器 
  617.      */  
  618.     MediaPlayer.OnBufferingUpdateListener mOnBufferingUpdateListener = new MediaPlayer.OnBufferingUpdateListener() {  
  619.         @Override  
  620.         public void onBufferingUpdate(MediaPlayer mp, int percent) {  
  621.             updateSecondaryProgress(percent);  
  622.         }  
  623.     };  
  624.     /** 
  625.      * 视频卡顿监听器 
  626.      */  
  627.     MediaPlayer.OnInfoListener mOnInfoListener = new MediaPlayer.OnInfoListener() {  
  628.         @Override  
  629.         public boolean onInfo(MediaPlayer mp, int what, int extra) {  
  630.             switch (what) {  
  631.                 case MediaPlayer.MEDIA_INFO_BUFFERING_START: //开始缓冲  
  632.                     mLoadView.setProgressBarVisiable(true);  
  633.                     break;  
  634.                 case MediaPlayer.MEDIA_INFO_BUFFERING_END://停止缓冲:  
  635.                     mLoadView.setHideProgressBarWidthAlpha();  
  636.                     break;  
  637.   
  638.             }  
  639.             return true;  
  640.         }  
  641.     };  
  642.     /** 
  643.      * 手势监听器 
  644.      */  
  645.     GestureDetector.SimpleOnGestureListener mOnGestureListener = new GestureDetector.SimpleOnGestureListener() {  
  646.         //长按  
  647.         @Override  
  648.         public void onLongPress(MotionEvent e) {  
  649.             play();  
  650.         }  
  651.   
  652.         //滚动  
  653.         @Override  
  654.         public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {  
  655.             //获取是指滑动的距离,deltaY>0表示向上滑动,否则表示向下滑动  
  656.             float deltaY = e1.getY() - e2.getY();  
  657.             if (mIsLeftDown) {  
  658.                 //左侧按下,改变亮度,即mBrightnessView的透明度  
  659.                 changeGestureBrightness(deltaY);  
  660.             } else {  
  661.                 //右侧按下,改变音量  
  662.                 changeGestureVolume(deltaY);  
  663.             }  
  664.             return true;  
  665.         }  
  666.   
  667.         //按下  
  668.         @Override  
  669.         public boolean onDown(MotionEvent e) {  
  670.             mCurrVolume = getStreamVolume();//获取当前音量  
  671.             mCurrBrightness = mBrightnessView.getAlpha();//获取当前的亮度view的透明度  
  672.             mIsLeftDown = e.getX() < UIUtils.getScreenWidth() / 2//是否在屏幕左侧按下  
  673.             return super.onDown(e);  
  674.         }  
  675.   
  676.         //双击  
  677.         @Override  
  678.         public boolean onDoubleTap(MotionEvent e) {  
  679.             //3种方式执行全屏  
  680.             //toggleFullscreen();  
  681.             //onClick(mFullScreenIb);  
  682.             mFullScreenIb.performClick();    // 当过代码的方式去单击这个按钮  
  683.             return true;  
  684.         }  
  685.   
  686.         //单击  
  687.         @Override  
  688.         public boolean onSingleTapConfirmed(MotionEvent e) {  
  689.             //5秒后自动隐藏  
  690.             toggleHideControlLayout();  
  691.             return true;  
  692.         }  
  693.     };  
  694.   
  695.   
  696.     @Override  
  697.     public boolean onTouchEvent(MotionEvent event) {  
  698.         //传递触摸事件给手势监听器  
  699.         mGestureDetector.onTouchEvent(event);  
  700.         switch (event.getAction()) {  
  701.             case MotionEvent.ACTION_UP:  
  702.                 HideControlLayoutDelay();//5秒后自动隐藏  
  703.                 break;  
  704.             default:  
  705.                 cancelHideControlLayout();//取消自动隐藏  
  706.                 break;  
  707.         }  
  708.         return super.onTouchEvent(event);  
  709.     }  
  710.     @Override  
  711.     protected void onStart() {  
  712.         super.onStart();  
  713.         //显示系统时间  
  714.         updateSysTime();  
  715.     }  
  716.   
  717.     @Override  
  718.     protected void onStop() {  
  719.         super.onStop();  
  720.         mHandler.removeCallbacks(mUpdateSysTimeRunnable);  
  721.     }  
  722.   
  723.     @Override  
  724.     protected void onDestroy() {  
  725.         super.onDestroy();  
  726.         if (null != mBatteryChangeReceiver) {  
  727.             unregisterReceiver(mBatteryChangeReceiver);  
  728.         }  
  729.     }  
  730. }  


修改布局文件的VideoView全路径

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <io.vov.vitamio.widget.VideoView  
  2.     android:id="@id/videoView"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:layout_centerInParent="true"/>  


修改清单文件中播放器的类名

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. android:name=".module.video.VitamioVideoPlayerActivity"  


当然上述的所有操作都是在关联了vitamio库之后的.


最后还需要在Vitamio库的VideoView源码上增加个全屏和按比例播放直接的切换.直接加在源码最后面即可:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. /** 
  2.  * 全屏和按比例播放间的切换 
  3.  */  
  4. public void toggleFullscreen() {  
  5.     int layout;  
  6.     if (mVideoLayout == VIDEO_LAYOUT_STRETCH) {  
  7.         //当前是全屏播放,调用后设置为按比例播放  
  8.         layout = VIDEO_LAYOUT_SCALE;  
  9.     } else {  
  10.         //当前是按比例播放,调用后设置为全屏播放  
  11.         layout = VIDEO_LAYOUT_STRETCH;  
  12.     }  
  13.     float aspectRatio = 0;  
  14.     setVideoLayout(layout, aspectRatio);  
  15. }  
  16. /** 
  17.  * 当前的播放模式是否是全屏播放 
  18.  */  
  19. public boolean isFullscreen() {  
  20.     return mVideoLayout == VIDEO_LAYOUT_STRETCH;  
  21. }  

0 0