这个Demo中实现了Vitamio的横竖屏幕切换,控制音量和亮度,起止时间,暂停播放,开始等待progressbar,显示网络加载,当前网速等功能
首先配置vitamio
从官网下载vitamio之后,将其vitamio文件夹作为Module导入,配置一下gradle
implementation project(':vitamio')
然后配置AndroidMainfest.xml,注册
<activity android:name="io.vov.vitamio.activity.InitActivity" android:configChanges="orientation|screenSize|smallestScreenSize|keyboard|keyboardHidden|navigation" android:launchMode="singleTop" android:theme="@android:style/Theme.NoTitleBar" android:windowSoftInputMode="stateAlwaysHidden" />
后面不废话,直接上代码,本人看博客习惯不喜欢看多余的话,找到干货就好
首先是Activity
public class MainActivity extends AppCompatActivity { private String TAG = "motejia"; private VideoView videoView; private RelativeLayout rl; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what == 1218) { //获取当前进度 float nowCurrent = videoView.getCurrentPosition(); //工具类转换 String now = time.stringForTime((int) nowCurrent); //设置当前播放进度 now_time.setText(now); int v = (int) (nowCurrent / video_scale); Log.e(TAG, "==========" + v); //更新seekBar seekBar.setProgress(v); handler.sendEmptyMessageDelayed(1218, 1000); } else if (msg.what == 0625) { //让底部控制条隐藏 rl.setVisibility(View.GONE); } else if (msg.what == 400) { //让音量控制和亮度控制隐藏 kzLayout.setVisibility(View.GONE); } } }; private ImageView imgButton; private ProgressBar bar; private TextView intent_speed; private TextView loading; private final int PLAY_STATUS_PLAY = 1; private final int PLAY_STATUS_PAUSE = 0; private int status_play = PLAY_STATUS_PLAY; private ImageView center_img, videw_img; private SeekBar seekBar; private long length; private float video_scale; private String end; private TextView end_time; private TextView now_time; private TimerUtils time = new TimerUtils(); private GestureDetector myGesTure; private float nowVioce = -1.0f, mBrightness = -1.0f, mMaxVolume; private AudioManager mAudioManager; private RelativeLayout kzLayout; private ImageView kzImg; private TextView kzText; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //检查vitamio框架是否可用 if (!io.vov.vitamio.LibsChecker.checkVitamioLibs(this)) return; setContentView(R.layout.activity_main); Vitamio.initialize(this); initView(); initData(); } //手指按下事件 @Override public boolean onTouchEvent(MotionEvent event) { if (myGesTure.onTouchEvent(event)) return true; // 处理手势结束 switch (event.getAction() & MotionEvent.ACTION_MASK) { //当手指离开时 case MotionEvent.ACTION_UP: nowVioce = -1; mBrightness = -1f; //隐藏 handler.removeMessages(400); handler.sendEmptyMessageDelayed(400, 500); break; } return super.onTouchEvent(event); } private void initData() { //获取系统声音管理类 mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); //获取最大音量 mMaxVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); //自定义手势控制类 myGesTure = new GestureDetector(this, new MyGesturedetector()); videoView.setVideoURI(Uri.parse("https://media.w3.org/2010/05/sintel/trailer.mp4")); //videoView.setVideoQuality(MediaPlayer.VIDEOQUALITY_HIGH);//设置高清播放 //videoView.setBufferSize(1024); //设置视频缓冲大小。默认1024KB,单位byte //开始请求数据 videoView.requestFocus(); //开始播放 videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() { @Override public void onPrepared(MediaPlayer mediaPlayer) { Toast.makeText(MainActivity.this, "准备好了", Toast.LENGTH_LONG).show(); //倍速 mediaPlayer.setPlaybackSpeed(1.0f); //获取视频总长度 length = videoView.getDuration(); //获取总时间 end = time.stringForTime((int) length); end_time.setText(end); //得到进度条和视频长度比例 video_scale = length / 100; handler.sendEmptyMessage(1218); } }); //播放出现错误 videoView.setOnErrorListener(new MediaPlayer.OnErrorListener() { @Override public boolean onError(MediaPlayer mp, int what, int extra) { Toast.makeText(MainActivity.this, "凉了", Toast.LENGTH_LONG).show(); return true; } }); //播放完成 videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { Toast.makeText(MainActivity.this, "播放完成", Toast.LENGTH_LONG).show(); //视频停止 videoView.pause(); } }); //手指按下的事件 videoView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { //按下的时候,让rl显示出来 if (rl.getVisibility() == View.GONE) { rl.setVisibility(View.VISIBLE); //清空所有消息 handler.removeMessages(0625); handler.sendEmptyMessageDelayed(0625, 3000); } else if (rl.getVisibility() == View.VISIBLE) { rl.setVisibility(View.GONE); } } return false; } }); //缓存监听事件 videoView.setOnInfoListener(new MediaPlayer.OnInfoListener() { @Override public boolean onInfo(MediaPlayer mp, int what, int extra) { switch (what) { //开始缓存 case MediaPlayer.MEDIA_INFO_BUFFERING_START: bar.setVisibility(View.VISIBLE); loading.setVisibility(View.VISIBLE); intent_speed.setVisibility(View.VISIBLE); mp.pause(); break; //缓存结束 case MediaPlayer.MEDIA_INFO_BUFFERING_END: bar.setVisibility(View.GONE); loading.setVisibility(View.GONE); intent_speed.setVisibility(View.GONE); mp.start(); break; //正在缓存 case MediaPlayer.MEDIA_INFO_DOWNLOAD_RATE_CHANGED: intent_speed.setText("当前网速" + extra + "kb/s"); break; } return true; } }); //缓存百分比 videoView.setOnBufferingUpdateListener(new MediaPlayer.OnBufferingUpdateListener() { @Override public void onBufferingUpdate(MediaPlayer mp, int percent) { loading.setText("已缓存" + percent + "%"); } }); //横竖屏切换 imgButton.setOnClickListener(new View.OnClickListener() { @Override //切换横竖屏 public void onClick(View v) { //判断手机的方向是啥方向 //如果是水平的 if (MainActivity.this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { //设置手机为竖直方向 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); //切换成垂直方向时,需要重新设置他的宽高 RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) videoView.getLayoutParams(); layoutParams.addRule(RelativeLayout.CENTER_IN_PARENT); layoutParams.width = ScreenUtil.getScreenWidth(MainActivity.this); layoutParams.height = getResources().getDimensionPixelSize(R.dimen.videoview_height); Log.e(TAG, "竖直屏幕宽度是" + layoutParams.width + "屏幕高度" + layoutParams.height); videoView.setLayoutParams(layoutParams); } else { //如果当前手机是垂直方向的话,就置为水平 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); //切换成水平方向时,需要重新设置他的宽高 RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); Log.e(TAG, "横着屏幕宽度是" + ViewGroup.LayoutParams.MATCH_PARENT + "屏幕高度" + ViewGroup.LayoutParams.MATCH_PARENT); videoView.setLayoutParams(lp); } } }); //设置拖拽进度条 seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { //进度条发生变化时候 } @Override public void onStartTrackingTouch(SeekBar seekBar) { //当开始拖拽时候 } @Override public void onStopTrackingTouch(SeekBar seekBar) { //停止触摸时 int progress = seekBar.getProgress(); //通过seekbar拿到当前的进度 Log.e(TAG, "=====stop=====" + progress); float v = progress * video_scale;//当前的播放进度 videoView.seekTo((long) v); //把视频定位到这个位置 } }); } //初始化控件 private void initView() { videoView = (VideoView) findViewById(R.id.vv_main); rl = (RelativeLayout) findViewById(R.id.rl); imgButton = (ImageView) findViewById(R.id.iv_zoom); bar = (ProgressBar) findViewById(R.id.progress); loading = (TextView) findViewById(R.id.loding); intent_speed = (TextView) findViewById(R.id.intent_speed); center_img = (ImageView) findViewById(R.id.center_img); videw_img = (ImageView) findViewById(R.id.video_img); seekBar = (SeekBar) findViewById(R.id.seek_bar); end_time = (TextView) findViewById(R.id.end_time); now_time = (TextView) findViewById(R.id.now_time); kzLayout = (RelativeLayout) findViewById(R.id.rela_layout); kzImg = (ImageView) findViewById(R.id.kongzhi_img); kzText = (TextView) findViewById(R.id.kongzhi_text); } //销毁时 @Override protected void onDestroy() { videoView.stopPlayback(); super.onDestroy(); } //左下角图片点击事件,控制播放暂停 public void play_or_stop(View view) { //如果现在的状态是正在播放 if (status_play == PLAY_STATUS_PLAY && videoView.isPlaying()) { //如果是播放状态,这个时候点击暂停 ,这个时候需要三角图标 提示用户现在是暂停状态 //暂停的逻辑 videoView.pause(); center_img.setVisibility(View.VISIBLE); center_img.setBackgroundResource(R.drawable.play); videw_img.setImageResource(R.drawable.play); handler.removeMessages(1218); status_play = PLAY_STATUS_PAUSE; } else if (status_play == PLAY_STATUS_PAUSE) { videoView.start(); handler.sendEmptyMessage(1218); center_img.setVisibility(View.GONE); center_img.setBackgroundResource(R.drawable.stop); videw_img.setImageResource(R.drawable.stop); status_play = PLAY_STATUS_PLAY; } } //手势控制类 private class MyGesturedetector extends GestureDetector.SimpleOnGestureListener { @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { float mOldX = e1.getX(), mOldY = e1.getY(); int y = (int) e2.getRawY(); //获取宽高 int windowWidth = ScreenUtil.getScreenWidth(MainActivity.this); int windowHeight = ScreenUtil.getScreenHeight(MainActivity.this); if (mOldX > windowWidth * 3.0 / 4)// 右边滑动 //改变声音 //手指触摸的地方到滑动的地方除以屏幕的高度获取百分比 onVolumeSlide((mOldY - y) / windowHeight); else if (mOldX < windowWidth / 4.0)// 左边滑动 //改变亮度 onBrightnessSlide((mOldY - y) / windowHeight); return super.onScroll(e1, e2, distanceX, distanceY); } } //改变亮度 private void onBrightnessSlide(float v) { //当前声音 if (mBrightness < 0) { mBrightness = getWindow().getAttributes().screenBrightness; if (mBrightness <= 0.00f) mBrightness = 0.50f; if (mBrightness < 0.01f) mBrightness = 0.01f; //显示 kzLayout.setVisibility(View.VISIBLE); } WindowManager.LayoutParams lpa = getWindow().getAttributes(); lpa.screenBrightness = mBrightness + v; if (lpa.screenBrightness > 1.0f) lpa.screenBrightness = 1.0f; else if (lpa.screenBrightness < 0.01f) lpa.screenBrightness = 0.01f; getWindow().setAttributes(lpa); //设置当前亮度 kzText.setText((int) (lpa.screenBrightness * 100) + "%"); kzImg.setImageResource(R.drawable.light); } //改变声音 private void onVolumeSlide(float v) { if (nowVioce == -1) { //获取当前声音 nowVioce = mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC); if (nowVioce < 0) nowVioce = 0; //显示 kzLayout.setVisibility(View.VISIBLE); } //当前音量 int index = (int) ((int) (v * mMaxVolume) + nowVioce); //如果超过最大音量设置为最大音量 if (index > mMaxVolume) index = (int) mMaxVolume; //超过最小音量设置为最小音量 else if (index < 0) index = 0; // 变更声音 mAudioManager.setStreamVolume(AudioManager.STREAM_MUSIC, index, 0); //设置当前音量 int i = (int) (index/mMaxVolume*100); kzText.setText(i+"%"); if (index == 0) { kzImg.setImageResource(R.drawable.novoice); } else { kzImg.setImageResource(R.drawable.voice); } } }
然后是Xml文件
<?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" xmlns:app="http://schemas.android.com/apk/res-auto" android:background="#fff" android:orientation="vertical" tools:context=".MainActivity"> <io.vov.vitamio.widget.VideoView android:id="@+id/vv_main" android:layout_width="match_parent" android:layout_height="@dimen/videoview_height" android:layout_centerInParent="true"></io.vov.vitamio.widget.VideoView> <RelativeLayout android:id="@+id/rl" android:layout_width="match_parent" android:layout_height="40dp" android:layout_alignBottom="@+id/vv_main" android:background="#a666" android:visibility="gone"> <ImageView android:id="@+id/video_img" android:layout_width="30dp" android:layout_height="30dp" android:layout_alignParentLeft="true" android:scaleType="fitXY" android:layout_centerVertical="true" android:onClick="play_or_stop" android:src="@drawable/stop" /> <ImageView android:id="@+id/iv_zoom" android:layout_width="20dp" android:layout_height="match_parent" android:layout_alignParentRight="true" android:src="@drawable/sf" /> <TextView android:id="@+id/end_time" android:layout_width="30dp" android:layout_height="match_parent" android:layout_toLeftOf="@id/iv_zoom" android:layout_margin="2dp" android:textColor="#fff" android:text="33:33:33" android:gravity="center" android:textSize="12sp" /> <TextView android:id="@+id/now_time" android:layout_width="30dp" android:layout_height="match_parent" android:layout_toRightOf="@+id/video_img" android:layout_margin="2dp" android:textColor="#fff" android:text="33:33:33" android:gravity="center" android:textSize="12sp" /> <SeekBar android:id="@+id/seek_bar" style="@style/MediaController_SeekBar" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="3dp" android:layout_toLeftOf="@id/end_time" android:layout_toRightOf="@id/now_time" /> </RelativeLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:orientation="horizontal"> <TextView android:id="@+id/loding" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="12dp" android:textColor="#e6ff01" /> <TextView android:id="@+id/intent_speed" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="12dp" android:textColor="#04fa00" /> </LinearLayout> <ProgressBar android:id="@+id/progress" style="?android:attr/progressBarStyleLarge" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" /> <ImageView android:id="@+id/center_img" android:layout_width="60dp" android:layout_height="60dp" android:layout_centerInParent="true" android:onClick="play_or_stop" android:scaleType="fitXY" android:visibility="gone" /> <RelativeLayout android:layout_width="60dp" android:layout_height="60dp" android:layout_centerInParent="true" android:id="@+id/rela_layout" android:visibility="gone" android:background="@drawable/myback" > <com.mdj.acer.vitamiodemo.Utils.MyCircleARGB android:id="@+id/kongzhi_img" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_marginTop="5dp" /> <TextView android:id="@+id/kongzhi_text" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_marginTop="5dp" android:gravity="center" style="@style/MediaController_Text" /> </RelativeLayout> </RelativeLayout>
就是这些了,本人测试可以使用,效果图,图片为三星note3-9008v调试,iphnoe7p手持拍摄
本人做的一个vitamio的demo,共同学习,欢迎点评,谢谢