<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        ReactNative實現Toast的示例

        來源:懂視網 責編:小采 時間:2020-11-27 22:22:29
        文檔

        ReactNative實現Toast的示例

        ReactNative實現Toast的示例:對于Android開發工程師來說,Toast在熟悉不過了,用它來顯示一個提示信息,并自動隱藏。在我們開發RN應用的時候,我門也要實現這樣的效果,就一點困難了,倒也不是困難,只是需要我們去適配,RN官方提供了一個API ToastAndroid,看到這個名字應該猜出,它只
        推薦度:
        導讀ReactNative實現Toast的示例:對于Android開發工程師來說,Toast在熟悉不過了,用它來顯示一個提示信息,并自動隱藏。在我們開發RN應用的時候,我門也要實現這樣的效果,就一點困難了,倒也不是困難,只是需要我們去適配,RN官方提供了一個API ToastAndroid,看到這個名字應該猜出,它只

        對于Android開發工程師來說,Toast在熟悉不過了,用它來顯示一個提示信息,并自動隱藏。在我們開發RN應用的時候,我門也要實現這樣的效果,就一點困難了,倒也不是困難,只是需要我們去適配,RN官方提供了一個API ToastAndroid,看到這個名字應該猜出,它只能在Android中使用,在iOS中使用沒有效果,所以,我們需要適配或者我們自定義一個,今天的這篇文章就是自定義一個Toast使其在Android和iOS都能運行,并有相同的運行效果。

        源碼傳送門

        定義組件

        import React, {Component} from 'react';
        import {
         StyleSheet,
         View,
         Easing,
         Dimensions,
         Text,
         Animated
        } from 'react-native';
        import PropTypes from 'prop-types';
        import Toast from "./index";
        const {width, height} = Dimensions.get("window");
        const viewHeight = 35;
        class ToastView extends Component {
         static propTypes = {
         message:PropTypes.string,
         };
         dismissHandler = null;
        
         constructor(props) {
         super(props);
         this.state = {
         message: props.message !== undefined ? props.message : ''
         }
         }
        
         render() {
         return (
         <View style={styles.container} pointerEvents='none'>
         <Animated.View style={[styles.textContainer]}><Text
         style={styles.defaultText}>{this.state.message}</Text></Animated.View>
         </View>
         )
         }
         componentDidMount() {
         this.timingDismiss()
         }
        
         componentWillUnmount() {
         clearTimeout(this.dismissHandler)
         }
        
        
         timingDismiss = () => {
         this.dismissHandler = setTimeout(() => {
         this.onDismiss()
         }, 1000)
         };
        
         onDismiss = () => {
         if (this.props.onDismiss) {
         this.props.onDismiss()
         }
         }
        }
        
        const styles = StyleSheet.create({
         textContainer: {
         backgroundColor: 'rgba(0,0,0,.6)',
         borderRadius: 8,
         padding: 10,
         bottom:height/8,
         maxWidth: width / 2,
         alignSelf: "flex-end",
         },
         defaultText: {
         color: "#FFF",
         fontSize: 15,
         },
         container: {
         position: "absolute",
         left: 0,
         right: 0,
         top: 0,
         bottom: 0,
         flexDirection: "row",
         justifyContent: "center",
         }
        });
        export default ToastView
        

        首先導入我們必須的基礎組件以及API,我們自定義組件都需要繼承它,Dimensions用于實現動畫,Easing用于設置動畫的軌跡運行效果,PropTypes用于對屬性類型進行定義。

        render方法是我們定義組件渲染的入口,最外層view使用position為absolute,并設置left,right,top,bottom設置為0,使其占滿屏幕,這樣使用Toast顯示期間不讓界面監聽點擊事件。內層View是Toast顯示的黑框容器,backgroundColor屬性設置rgba形式,顏色為黑色透明度為0.6。并設置圓角以及最大寬度為屏幕寬度的一半。然后就是Text組件用于顯示具體的提示信息。

        我們還看到propTypes用于限定屬性message的類型為string。constructor是我們組件的構造方法,有一個props參數,此參數為傳遞過來的一些屬性。需要注意,構造方法中首先要調用super(props),否則報錯,在此處,我將傳遞來的值設置到了state中。

        對于Toast,顯示一會兒自動消失,我們可以通過setTimeout實現這個效果,在componentDidMount調用此方法,此處設置時間為1000ms。然后將隱藏毀掉暴露出去。當我們使用setTimeout時還需要在組件卸載時清除定時器。組件卸載時回調的時componentWillUnmount。所以在此處清除定時器。

        實現動畫效果

        在上面我們實現了Toast的效果,但是顯示和隱藏都沒有過度動畫,略顯生硬。那么我們加一些平移和透明度的動畫,然后對componentDidMount修改實現動畫效果

        在組件中增加兩個變量

        moveAnim = new Animated.Value(height / 12);
         opacityAnim = new Animated.Value(0);

        在之前內層view的樣式中,設置的bottom是height/8。我們此處將view樣式設置如下

        style={[styles.textContainer, {bottom: this.moveAnim, opacity: this.opacityAnim}]}

        然后修改componentDidMount

        componentDidMount() {
         Animated.timing(
         this.moveAnim,
         {
         toValue: height / 8,
         duration: 80,
         easing: Easing.ease
         },
         ).start(this.timingDismiss);
         Animated.timing(
         this.opacityAnim,
         {
         toValue: 1,
         duration: 100,
         easing: Easing.linear
         },
         ).start();
         }
        

        也就是bottom顯示時從height/12到height/8移動,時間是80ms,透明度從0到1轉變執行時間100ms。在上面我們看到有個easing屬性,該屬性傳的是動畫執行的曲線速度,可以自己實現,在Easing API中已經有多種不同的效果。大家可以自己去看看實現,源碼地址是 https://github.com/facebook/react-native/blob/master/Libraries/Animated/src/Easing.js ,自己實現的話直接給一個計算函數就可以,可以自己去看模仿。

        定義顯示時間

        在前面我們設置Toast顯示1000ms,我們對顯示時間進行自定義,限定類型number,

        time: PropTypes.number

        在構造方法中對時間的處理

        time: props.time && props.time < 1500 ? Toast.SHORT : Toast.LONG,

        在此處我對時間顯示處理為SHORT和LONG兩種值了,當然你可以自己處理為想要的效果。

        然后只需要修改timingDismiss中的時間1000,寫為this.state.time就可以了。

        組件更新

        當組件已經存在時再次更新屬性時,我們需要對此進行處理,更新state中的message和time,并清除定時器,重新定時。

        componentWillReceiveProps(nextProps) {
         this.setState({
         message: nextProps.message !== undefined ? nextProps.message : '',
         time: nextProps.time && nextProps.time < 1500 ? Toast.SHORT : Toast.LONG,
         })
         clearTimeout(this.dismissHandler)
         this.timingDismiss()
         }

        組件注冊

        為了我們的定義的組件以API的形式調用,而不是寫在render方法中,所以我們定義一個跟組件

        import React, {Component} from "react";
        import {StyleSheet, AppRegistry, View, Text} from 'react-native';
        viewRoot = null;
        class RootView extends Component {
         constructor(props) {
         super(props);
         console.log("constructor:setToast")
         viewRoot = this;
         this.state = {
         view: null,
         }
         }
        
         render() {
         console.log("RootView");
         return (<View style={styles.rootView} pointerEvents="box-none">
         {this.state.view}
         </View>)
         }
         static setView = (view) => {
        //此處不能使用this.setState
         viewRoot.setState({view: view})
         };
        }
        
        const originRegister = AppRegistry.registerComponent;
        AppRegistry.registerComponent = (appKey, component) => {
         return originRegister(appKey, function () {
         const OriginAppComponent = component();
         return class extends Component {
        
         render() {
         return (
         <View style={styles.container}>
         <OriginAppComponent/>
         <RootView/>
         </View>
         );
         };
         };
         });
        };
        const styles = StyleSheet.create({
         container: {
         flex: 1,
         position: 'relative',
         },
         rootView: {
         position: "absolute",
         left: 0,
         right: 0,
         top: 0,
         bottom: 0,
         flexDirection: "row",
         justifyContent: "center",
         }
        });
        export default RootView
        
        

        RootView就是我們定義的根組件,實現如上,通過AppRegistry.registerComponent注冊。

        包裝供外部調用

        import React, {
         Component,
        } from 'react';
        import RootView from '../RootView'
        import ToastView from './ToastView'
        class Toast {
         static LONG = 2000;
         static SHORT = 1000;
        
         static show(msg) {
         RootView.setView(<ToastView
         message={msg}
         onDismiss={() => {
         RootView.setView()
         }}/>)
         }
        
         static show(msg, time) {
         RootView.setView(<ToastView
         message={msg}
         time={time}
         onDismiss={() => {
         RootView.setView()
         }}/>)
         }
        }
        export default Toast
        

        Toast中定義兩個static變量,表示顯示的時間供外部使用。然后提供兩個static方法,方法中調用RootView的setView方法將ToastView設置到根view。

        使用

        首先導入上面的Toast,然后通過下面方法調用

        Toast.show("測試,我是Toast");
         //能設置顯示時間的Toast
         Toast.show("測試",Toast.LONG);

        好了文章介紹完畢。如果想看完整代碼,可以進我 GitHub 查看。文中若有不足或錯誤的地方歡迎指出。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。最后新年快樂。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        ReactNative實現Toast的示例

        ReactNative實現Toast的示例:對于Android開發工程師來說,Toast在熟悉不過了,用它來顯示一個提示信息,并自動隱藏。在我們開發RN應用的時候,我門也要實現這樣的效果,就一點困難了,倒也不是困難,只是需要我們去適配,RN官方提供了一個API ToastAndroid,看到這個名字應該猜出,它只
        推薦度:
        標簽: 實現 示例 React
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲色一色噜一噜噜噜| 最近最新MV在线观看免费高清| 成年免费a级毛片免费看无码| 处破痛哭A√18成年片免费| 亚洲国产电影在线观看| 久草免费在线观看视频| 亚洲人成影院午夜网站| 日本一区二区三区免费高清| 亚洲AV日韩综合一区尤物| 妞干网免费视频观看| 亚洲国产精品99久久久久久| 免费无码又爽又高潮视频 | 国产精品V亚洲精品V日韩精品| 亚洲av无码一区二区三区人妖 | 最近中文字幕无吗免费高清 | 久久久久一级精品亚洲国产成人综合AV区| 亚洲精品无播放器在线播放| 天天看免费高清影视| 男女超爽视频免费播放| 久久精品国产亚洲5555| 国产精品一区二区三区免费 | 亚洲国产精品无码专区在线观看| 最近免费中文字幕中文高清 | 亚洲国产精品成人午夜在线观看 | 99精品免费视品| 久久综合亚洲鲁鲁五月天| 成年在线网站免费观看无广告| 亚洲乱码在线卡一卡二卡新区| 日本妇人成熟免费中文字幕| 成人精品国产亚洲欧洲| 亚洲中文字幕无码久久2017| 91香焦国产线观看看免费| 亚洲日韩中文字幕一区| 成人亚洲性情网站WWW在线观看 | 99热在线免费观看| 亚洲中文字幕一二三四区苍井空| 免费观看的av毛片的网站| 中文字幕一区二区免费| 亚洲综合一区无码精品| 久久亚洲中文字幕精品一区四| 四虎影视在线影院在线观看免费视频|