react-native-video是github上一個專用於React Native作視頻播放的組件。這個組件是React Native上功能最全最好用的視頻播放組件,還在持續開發之中,雖然還有些bug,但基本不影響使用,強力推薦。react
本篇文章主要介紹下怎麼使用react-native-video播放視頻,以及如何實現全屏播放,屏幕旋轉時視頻播放器大小隨之調整,顯示全屏或收起全屏。android
首先來看看react-native-video有哪些功能。git
react-native-video經過source屬性設置視頻,播放遠程視頻時使用uri來設置視頻地址,以下:github
source={{uri: "http://www.xxx.com/xxx/xxx/xxx.mp4"}}
複製代碼
播放本地視頻時,使用方式以下:npm
source={require('../assets/video/turntable.mp4')}
複製代碼
須要注意的是,source屬性不能爲空,uri或本地資源是必需要設置的,不然會致使app閃退。uri不能設置爲空字符串,必須是一個具體的地址。react-native
使用npm i -S react-native-video
或yarn add react-native-video
安裝,完成以後使用react-native link react-native-video
命令link這個庫。bash
Android端在執行完link命令後,gradle中就已經完成了配置。iOS端還須要手動配置一下,這裏簡單說一下,與官方說明不一樣的是,咱們通常不使用tvOS的,選中你本身的target,在build phases中先移除掉自動link進來的libRCTVideo.a
這個庫,而後點擊下方加號從新添加libRCTVideo.a
,注意不要選錯。 app
實現視頻播放其實很簡單,咱們只須要給Video組件設置一下source資源,而後設置style調整Video組件寬高就好了。ide
<Video
ref={(ref) => this.videoPlayer = ref}
source={{uri: this.state.videoUrl}}
rate={1.0}
volume={1.0}
muted={false}
resizeMode={'cover'}
playWhenInactive={false}
playInBackground={false}
ignoreSilentSwitch={'ignore'}
progressUpdateInterval={250.0}
style={{width: this.state.videoWidth, height: this.state.videoHeight}}
/>
複製代碼
其中videoUrl是咱們用來設置視頻地址的變量,videoWidth和videoHeight是用來控制視頻寬高的。函數
視頻全屏播放其實就是在橫屏狀況下全屏播放,豎屏通常都是非全屏的。要實現設備橫屏時視頻全屏顯示,提及來很簡單,就是經過改變Video組件寬高來實現。
上面咱們把videoWidth和videoHeight存放在state中,目的就是爲了經過改變兩個變量的值來刷新UI,使視頻寬高能隨之改變。問題是,怎樣在設備的屏幕旋轉時及時獲取到改變後的寬高呢?
豎屏時我設置的視頻初始寬度爲設備屏幕的寬度,高度爲寬度的9/16,即按16:9的比例顯示。橫屏時視頻的寬度應爲屏幕的寬度,高度應爲當前屏幕的高度。因爲橫屏時設備寬高發生了變化,及時獲取到寬高就能及時刷新UI,視頻就能全屏展現了。
剛開始我想到的辦法是使用react-native-orientation監聽設備轉屏的事件,在回調方法中判斷當前是橫屏仍是豎屏,這個在iOS上是可行的,可是在Android上橫屏和豎屏時獲取到寬高值老是不匹配的(好比,橫屏寬384高582,豎屏寬582高384,顯然不合理),這樣就沒法作到統一處理。
因此,監聽轉屏的方案是不行的,不只費時還得不到想要的結果。更好的方案是在render函數中使用View做爲最底層容器,給它設置一個"flex:1"的樣式,使其充滿屏幕,在View的onLayout方法中獲取它的寬高。不管屏幕怎麼旋轉,onLayout均可以獲取到當前View的寬高和x、y座標。
/// 屏幕旋轉時寬高會發生變化,能夠在onLayout的方法中作處理,比監聽屏幕旋轉更加及時獲取寬高變化
_onLayout = (event) => {
//獲取根View的寬高
let {width, height} = event.nativeEvent.layout;
console.log('經過onLayout獲得的寬度:' + width);
console.log('經過onLayout獲得的高度:' + height);
// 通常設備橫屏下都是寬大於高,這裏能夠用這個來判斷橫豎屏
let isLandscape = (width > height);
if (isLandscape){
this.setState({
videoWidth: width,
videoHeight: height,
isFullScreen: true,
})
} else {
this.setState({
videoWidth: width,
videoHeight: width * 9/16,
isFullScreen: false,
})
}
};
複製代碼
這樣就實現了屏幕在旋轉時視頻也隨之改變大小,橫屏時全屏播放,豎屏迴歸正常播放。注意,Android和iOS須要配置轉屏功能才能使界面自動旋轉,請自行查閱相關配置方法。
上面實現了全屏播放還不夠,咱們還須要一個工具欄來控制視頻的播放,好比顯示進度,播放暫停和全屏按鈕。具體思路以下:
這樣纔算是一個有模有樣的視頻播放器。下面是豎屏和橫屏的效果圖
不再必爲presentFullscreenPlayer方法不起做用而煩惱了,全屏播放實現起來其實很簡單。具體代碼請看demo:github.com/mrarronz/re…。