使用VideoView做個實用的視訊播放器

Sorrower發表於2019-03-01

目錄

  • 最終效果圖
  • 前言
  • 佈局檔案
  • VideoView的使用
  • 橫豎屏切換
  • 檔案選擇
  • 手勢調節音量
  • 最後

最終效果圖

最終效果圖


前言

這裡用VideoView寫一個播放器, 可以橫豎屏, 可以選檔案, 可以暫停, 可以快進後退, 可以進度條拖動, 可以觸屏調節音量. 來看看怎麼實現的吧!


佈局檔案

RelativeLayout包裹VideoView是要點, 常規設定會形變的. 當然了, 還要重寫onConfigurationChanged, 見後面橫豎屏切換.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior"
    tools:context="com.so.mymedia.ui.activity.MainActivity"
    tools:showIn="@layout/activity_main">

    <RelativeLayout
        android:id="@+id/rl_vv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@android:color/black"
        android:minHeight="200dp">

        <VideoView
            android:id="@+id/vv_video"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true" />
    </RelativeLayout>
</RelativeLayout>
複製程式碼

VideoView的使用

VideoView使用起來非常簡單, 設定好MediaController, 然後設定URI或者是Path, 然後start開始就好. 這裡的要點是一些使用功能的實現. 可以查閱官方文件.

官方文件


橫豎屏切換

第一步是到配置檔案裡面設定. 在activity標籤下新增android:configChanges="keyboard|orientation|screenSize". 這樣的話, 螢幕切換的時候不會去呼叫onStop等方法. 我們在Toolbar裡面新增切換橫豎屏按鈕, 然後重寫onConfigurationChanged.

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    if (mVvVideo == null) {
        return;
    }
    if (this.getResources().getConfiguration().orientation
            == Configuration.ORIENTATION_LANDSCAPE) {
        // 橫屏
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                WindowManager.LayoutParams.FLAG_FULLSCREEN);
        getWindow().getDecorView().invalidate();
        float height = new ScreenUtil(this).getAppWidth();
        float width = new ScreenUtil(this).getAppHeight();
        mRlVv.getLayoutParams().height = (int) width;
        mRlVv.getLayoutParams().width = (int) height;
    } else {
        // 豎屏
        final WindowManager.LayoutParams attrs = getWindow().getAttributes();
        attrs.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN);
        getWindow().setAttributes(attrs);
        getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);
        float width = new ScreenUtil(this).getAppWidth();
        float height = DisplayUtil.dp2px(this, 200.f);
        mRlVv.getLayoutParams().height = (int) height;
        mRlVv.getLayoutParams().width = (int) width;
    }
}
複製程式碼

裡面有幾個uitl, 都是常見的封裝, 不多說了. 這樣就可以實現橫豎屏切換了.


檔案選擇

關於檔案選擇器, 請檢視我之前的文章. 然後就是要返回選中的檔案路徑. 這是Intent的常規使用了. 不多說了.


手勢調節音量

新增觸控監聽, 然後用手勢操作實現. 然後是依據上下劃方向確定增大還是減小音量. 調節音量的程式碼也是很常規的了.

@Override
public boolean onTouch(View v, MotionEvent event) {
    return mGestureDetector.onTouchEvent(event);
}
複製程式碼
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
    float v = e2.getY() - e1.getY();
    if (Math.abs(v) > 10) {
        setVoiceVolume(v);
    }
    return true;
}
複製程式碼
private void setVoiceVolume(float value) {
    int currentVolume = mAM.getStreamVolume(AudioManager.STREAM_MUSIC);
    int maxVolume = mAM.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
    int flag = value > 0 ? -1 : 1;
    currentVolume += flag * 0.15 * maxVolume;
    mAM.setStreamVolume(AudioManager.STREAM_MUSIC, currentVolume, 0);
}
複製程式碼

最後

如果想更多的DIY, 可以考慮使用SurfaceView, 但是VideoView大部分時候也夠用了. 喜歡記得點贊或者關注我, 有意見或者建議評論區見.


相關文章