最简单,实用,功能最全的vitamio

    这个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,共同学习,欢迎点评,谢谢

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值