最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

react-native 封裝視頻播放器react-native-video的使用

 更新時間:2023年01月31日 15:07:03   作者:在下月亮有何貴干  
本文主要介紹了react-native 封裝視頻播放器react-native-video的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

最近工作業(yè)務用到了react-native-video,還需要能夠全屏,全屏需要用到鎖定應用方向(橫屏),需要用到組件react-native-orientation-locker,本文記錄使用方法以及提供一種解決思路。

react-native-orientation-locker

橫豎屏方法

我就只介紹這常用的三個,其他的可以翻看官方文檔

import Orientation from 'react-native-orientation-locker';
Orientation.lockToLandscapeLeft() // 向左方向鎖定橫屏
Orientation.lockToLandscapeRight() // 向右方向鎖定橫屏
Orientation.unlockAllOrientations(); // 解除鎖定
Orientation.lockToPortrait(); // 鎖定豎屏

react-native-video

導入

import Video from 'react-native-video';

函數(shù)部分

? // 設置總時長
? setDuration({ duration }) {
? ? this.setState({ duration });
? }

? // 播放結(jié)束可將暫停變量設置為true
? onEnd() {
? ? this.setState({
? ? ? paused: true,
? ? });
? }

? // 緩沖,loading變量可控制緩沖圈顯示
? onBuffer({ isBuffering }) {
? ? this.setState({ loading: isBuffering });
? }

? // 設置進度條和播放時間的變化,sliderValue用來同步步進器
? setTime({ currentTime }) {
? ? this.setState({
? ? ? sliderValue: currentTime,
? ? });
? }
??
? // 播放暫停
? changePlayed() {
? ? this.setState({ paused: !this.state.paused });
? }

視頻組件

    <View style={styles.Video}>
        {
            loading ? <View style={styles.loading}>
                <ActivityIndicator size='large' color='lightgray' /> // 緩沖圈
            </View> : null
        }
        <Video
            ref={(ref: Video) => {
                this.video = ref; // 視頻Video的ref
            }}
            source={{
                uri: 'http://xxx/xxx.mp4', //播放路徑
            }}
            style={{ width: '100%', height: '100%' }}
            rete={1}
            volume={1}
            paused={paused} // 暫停變量
            onEnd={() => {
                this.onEnd(); // 播放結(jié)束時執(zhí)行
            }}
            onBuffer={data => this.onBuffer(data)} // 緩沖時執(zhí)行,用于顯示緩沖圈
            onProgress={data => this.setTime(data)} // 播放時執(zhí)行函數(shù),用于同步步進器進度
            onLoad={data => this.setDuration(data)} // 播放前得到總時長,用于步進器設置總長
            muted={muted} // 靜音
        />
    </View>

控制臺

    <View style={styles.videoControl}>
        {/* 暫停按鈕 */}
        <TouchableOpacity
            onPress={() => {
                this.changePlayed();
            }}
        >
            <Image style={styles.paused} source={paused ? pausedImg : played} />
        </TouchableOpacity>
        <Slider
            value={sliderValue}
            maximumValue={duration}
            // onValueChange 和 onSlidingComplete 是修改步進器進度時觸發(fā)的函數(shù)
            // 可以在此時同步視頻播放,同步視頻播放的函數(shù)是,video的Ref.seek()
            // 中間需要設置視頻暫停和播放,否則邊拖動邊播放會很奇怪
            onValueChange={(value) => {
                this.video.seek(value);
                this.setState({
                    paused: true,
                });
            }}
            onSlidingComplete={(value) => {
                this.video.seek(value);
                this.setState({
                    paused: false,
                });
            }}
            style={styles.slider}
        />
        {/* 靜音按鈕 */}
        <TouchableOpacity
            onPress={() => {
                this.setState({ muted: !muted });
            }}
        >
            <Image style={{ marginLeft: 10, height: 24, width: 24 }} source={muted ? mute : sound} />
        </TouchableOpacity>
        {/* 全屏按鈕 */}
        <TouchableOpacity
            onPress={() => {
                // 這里涉及到react-native-orientation-locker
                // 可以鎖定應用為橫屏,這里的狀態(tài)設置是我的全屏解決方案
                this.setState({ fullVideoShow: true, sliderValue2: sliderValue }, () => {
                  this.setState({ paused: true });// 需要將原視頻暫停
                });
                Orientation.lockToLandscapeLeft();
            }}
        >
            <Image style={{ marginLeft: 10, height: 20, width: 20 }} source={fullScreen} />
        </TouchableOpacity>
    </View>

全屏實現(xiàn)方案(可參考)

我采用的是彈出層方案,使用Orientation橫屏時,新建一個model層覆蓋全屏,然后新建一個相同的播放組件,記得將原視頻組件暫停。

可以參考的點,以下表示model層上的視頻組件

? // 放大時,總長已經(jīng)不需要再次獲取,我們可以在onLoad2時將sliderValue賦值給video2
? // 達到放大時同步進度的效果
? onLoad2(data) {
? ? this.video2.seek(this.state.sliderValue);
? }
??
? // 設置vedio2的同步步進器2進度時,需要注意,currentTime>0再賦值
? // 否則在視頻加載過程中會出現(xiàn)步進器2跳一下0再恢復的情況
? setTime2({ currentTime }) {
? ? if (currentTime > 0) {
? ? ? this.setState({
? ? ? ? sliderValue2: currentTime,
? ? ? });
? ? }
? }
??
? // 退出全屏
? outFullScreen() {
? ? const { sliderValue2, paused2 } = this.state;
? ? this.setState({ fullVideoShow: false, sliderValue: sliderValue2);
? ? Orientation.lockToPortrait();
? ? // 退出時將原視頻進度同步
? ? this.video.seek(sliderValue2);
? }
??
? // 播放暫停
? changePlayed2() {
? ? this.setState({ paused2: !this.state.paused2 });
? }
??
? // 另外全屏時,要將原視頻paused暫停,可以在全屏按鈕事件那里我有提到。

放大視頻

    <Modal
        visible={fullVideoShow}
        transparent
        animationType='slide'
    >
        <View style={styles.videoModelBack}>
            <View style={styles.videoModel}>
                {
                    loading ? <View style={styles.loading}>
                        <ActivityIndicator size='large' color='lightgray' /> //緩沖圈可復用狀態(tài)
                    </View> : null
                }
                <View style={{ flex: 1 }}>
                    <Video
                        ref={(ref: Video) => {
                            this.video2 = ref;
                        }}
                        source={{
                            uri: 'http://xxx/xxx.mp4',
                        }}
                        style={{ flex: 1 }}
                        rete={1}
                        volume={1}
                        paused={paused2}
                        onEnd={() => {
                            this.onEnd(0);
                        }}
                        onBuffer={data => this.onBuffer(data)}
                        onProgress={data => this.setTime2(data)}
                        onLoad={data => this.onLoad2(data)}
                        muted={muted}
                    />
                </View>
            </View>
            <View style={styles.videoBack}>
                <TouchableOpacity
                    onPress={() => {
                        this.changePlayed2();
                    }}
                >
                    <Image style={[styles.paused]} source={paused2 ? pausedImg : played} />
                </TouchableOpacity>
                <Slider
                    value={sliderValue2}
                    maximumValue={duration}
                    onValueChange={(value) => {
                        this.video2.seek(value);
                        this.setState({
                            paused2: true,
                        });
                    }}
                    onSlidingComplete={(value) => {
                        this.video2.seek(value);
                        this.setState({
                            paused2: false,
                        });
                    }}
                    style={styles.slider}
                />
                <TouchableOpacity
                    onPress={() => {
                        this.setState({ muted: !muted });
                    }}
                >
                    <Image style={styles.img} source={muted ? mute : sound} />
                </TouchableOpacity>
                <TouchableOpacity
                    onPress={() => {
                        this.outFullScreen();
                    }}
                >
                    <Image source={outFullScreen} /> // 退出全屏按鈕
                </TouchableOpacity>
            </View>
        </View>
    </Modal>

尾言

樣式我沒有寫出來,因為內(nèi)容可能比較多,布局情況也不大相同,想完全復用不太現(xiàn)實,不過如果你耐心點理解重要的部分,相信你會有所收獲。

到此這篇關于react-native 封裝視頻播放器react-native-video的使用的文章就介紹到這了,更多相關react-native 視頻播放器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • React網(wǎng)絡請求發(fā)起方法詳細介紹

    React網(wǎng)絡請求發(fā)起方法詳細介紹

    在編程開發(fā)中,網(wǎng)絡數(shù)據(jù)請求是必不可少的,這篇文章主要介紹了React網(wǎng)絡請求發(fā)起方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-09-09
  • React 錯誤邊界組件的處理

    React 錯誤邊界組件的處理

    這篇文章主要介紹了React 錯誤邊界組件的處理,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • react native 文字輪播的實現(xiàn)示例

    react native 文字輪播的實現(xiàn)示例

    這篇文章主要介紹了react native 文字輪播的實現(xiàn)示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • react-redux action傳參及多個state處理的實現(xiàn)

    react-redux action傳參及多個state處理的實現(xiàn)

    本文主要介紹了react-redux action傳參及多個state處理的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-07-07
  • React實現(xiàn)菜單欄滾動功能

    React實現(xiàn)菜單欄滾動功能

    本文將會基于react實現(xiàn)滾動菜單欄功能,點擊菜單,內(nèi)容區(qū)域會自動滾動到對應卡片,內(nèi)容區(qū)域滑動,指定菜單欄會被選中,代碼簡單易懂,感興趣的朋友一起看看吧
    2024-03-03
  • 關于React Native 無法鏈接模擬器的問題

    關于React Native 無法鏈接模擬器的問題

    許多朋友遇到React Native 無法鏈接模擬器的問題,怎么解決呢,本文給大家分享完整簡便解決方法及配置例題,對React Native 鏈接模擬器相關知識感興趣的朋友一起看看吧
    2021-06-06
  • React組件渲染后對DOM的操作方式

    React組件渲染后對DOM的操作方式

    這篇文章主要介紹了React組件渲染后對DOM的操作方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • Taro?React自定義TabBar使用useContext解決底部選中異常

    Taro?React自定義TabBar使用useContext解決底部選中異常

    這篇文章主要為大家介紹了Taro?React底部自定義TabBar使用React?useContext解決底部選中異常(需要點兩次才能選中的問題)示例詳解,有需要的朋友可以借鑒參考下
    2023-08-08
  • React自定義視頻全屏按鈕實現(xiàn)全屏功能

    React自定義視頻全屏按鈕實現(xiàn)全屏功能

    這篇文章主要介紹了React自定義視頻全屏按鈕實現(xiàn)全屏功能,通過繪制全屏按鈕,并綁定點擊事件,編寫點擊事件,通過實例代碼給大家詳細講解,需要的朋友可以參考下
    2022-11-11
  • react?native?reanimated實現(xiàn)動畫示例詳解

    react?native?reanimated實現(xiàn)動畫示例詳解

    這篇文章主要為大家介紹了react?native?reanimated實現(xiàn)動畫示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03

最新評論

平阴县| 兴和县| 巴林左旗| 当阳市| 通城县| 徐汇区| 甘洛县| 乐昌市| 吴堡县| 大安市| 丰顺县| 兴义市| 陇南市| 如皋市| 崇阳县| 龙泉市| 永修县| 上栗县| 定南县| 辽源市| 乌拉特中旗| 盐城市| 庆元县| 顺义区| 榆树市| 平顺县| 赤峰市| 师宗县| 南宁市| 额济纳旗| 东至县| 辉南县| 新龙县| 衡南县| 泰和县| 合山市| 东山县| 郴州市| 怀来县| 海口市| 博白县|