亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

ReactNative實現Toast的示例

2024-05-06 16:41:42
字體:
來源:轉載
供稿:網友

對于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 查看。文中若有不足或錯誤的地方歡迎指出。希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。最后新年快樂。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
午夜精品久久17c| 亚洲丝袜一区在线| 精品香蕉在线观看视频一| 国产成人福利夜色影视| 精品亚洲一区二区三区在线播放| 日韩中文字幕视频| 欧美中文字幕视频在线观看| 日韩亚洲国产中文字幕| 川上优av一区二区线观看| 久久香蕉国产线看观看网| 精品国内自产拍在线观看| 精品视频一区在线视频| 欧美成在线观看| 26uuu另类亚洲欧美日本老年| 亚洲国产精品久久| xxxxxxxxx欧美| 欧美电影《睫毛膏》| 成人午夜在线影院| 综合网中文字幕| 欧美大片免费观看| 国外日韩电影在线观看| 日韩免费在线免费观看| 91在线高清视频| 欧美日韩国产影院| 日韩免费精品视频| 亚洲男人av电影| 精品国产91久久久久久老师| 欧美精品中文字幕一区| 亚洲视频网站在线观看| 国模精品一区二区三区色天香| 久久人人爽人人爽人人片av高请| 亚洲欧美国产精品专区久久| 国产91在线视频| 日韩一区二区三区xxxx| 国产精品久久久久av免费| 91国语精品自产拍在线观看性色| 国产日韩欧美91| 亚洲精品国产精品久久清纯直播| 57pao国产成人免费| 久久91精品国产91久久久| 精品成人在线视频| 日本精品久久久| 亚洲激情视频网站| 8050国产精品久久久久久| 91视频免费在线| 国产日韩欧美夫妻视频在线观看| 欧美亚洲国产视频| 一区二区三区四区精品| 欧美老女人性生活| 91精品视频在线看| 成人写真福利网| 日韩精品免费一线在线观看| 欧美亚洲国产成人精品| 欧美日韩中文在线观看| 亚洲综合色激情五月| 亚洲性生活视频在线观看| 在线观看精品国产视频| 欧美日韩福利在线观看| 日韩在线观看免费av| 亚洲精品之草原avav久久| 久久全球大尺度高清视频| 亚洲男人天堂手机在线| 亚洲三级 欧美三级| 国产精品久久久久久av| 国产精品久久久久秋霞鲁丝| 精品无人区太爽高潮在线播放| 成人黄色中文字幕| 日韩电视剧免费观看网站| 欧美国产极速在线| 欧美在线视频免费播放| 国产精品jizz在线观看麻豆| 欧美二区乱c黑人| 国内精品久久影院| 久久久久国产精品免费网站| 热久久免费视频精品| 在线播放日韩欧美| 亚洲大尺度美女在线| 国产精品jvid在线观看蜜臀| 欧美大片网站在线观看| 精品欧美国产一区二区三区| 国内精品久久久| 成人欧美一区二区三区黑人| 亚洲欧美激情另类校园| 成人av番号网| 欧美一级黄色网| 精品一区电影国产| 中文字幕免费国产精品| 97婷婷大伊香蕉精品视频| 色先锋久久影院av| 国产精品稀缺呦系列在线| 亚洲跨种族黑人xxx| 久久久久中文字幕| 日韩**中文字幕毛片| 国产精品久久久久秋霞鲁丝| 亚洲电影第1页| 日韩大陆毛片av| 国外色69视频在线观看| 精品视频在线导航| 久久久久久久999| 美日韩在线视频| 亚洲成人激情小说| 欧美成人sm免费视频| 国产美女精品视频免费观看| 欧美肥臀大乳一区二区免费视频| 欧美精品午夜视频| 国产精品男人爽免费视频1| 亚洲日本成人网| 日韩电影中文 亚洲精品乱码| 久久久国产精彩视频美女艺术照福利| 668精品在线视频| 热久久免费视频精品| 全球成人中文在线| 91久久国产综合久久91精品网站| 精品视频久久久久久| 亚洲图片在区色| 久久精品亚洲精品| 国产精品av免费在线观看| 欧美壮男野外gaytube| 亚洲的天堂在线中文字幕| 日韩电影免费观看在线| 青青a在线精品免费观看| 中文字幕欧美在线| 欧美激情视频给我| 亚洲成人精品久久| 国产性色av一区二区| 亚洲男人的天堂在线| 欧美大成色www永久网站婷| 欧美另类极品videosbest最新版本| 欧美日韩亚洲一区二区三区| 亚洲aa中文字幕| 欧美在线日韩在线| 亚洲视频777| 91天堂在线观看| 亚洲区中文字幕| 欧美亚洲午夜视频在线观看| 久久成人这里只有精品| 久久久噜噜噜久久久| 欧美激情在线播放| 国产午夜精品美女视频明星a级| 亚洲一区二区久久久| 日韩av在线网页| 国产福利精品视频| 午夜精品久久久久久久久久久久| 亚洲理论片在线观看| 色中色综合影院手机版在线观看| 久久久久久国产三级电影| 国产精品爽黄69| 91精品国产综合久久久久久久久| 欧美精品videos另类日本| 日韩精品在线免费观看视频| 中文字幕视频在线免费欧美日韩综合在线看| 日本三级久久久| 国产成人精品久久二区二区91| 亚洲欧美国产精品久久久久久久| 欧美猛少妇色xxxxx| 羞羞色国产精品| 亚洲黄色av网站| 国产精品极品在线| 国产精品久久久久久久久久三级| 日韩中文字幕国产| 国产精品视频自在线| 国产男人精品视频| 国产成人一区二区三区小说| 91久久久久久久久|