高效React Native動畫開發(fā) - LayoutAnimation

為什么要使用LayoutAnimtion???

在我們平常的開發(fā)中,對于普通需求,經(jīng)常會需要做一些簡單的位移,淡入淡出等動畫禾乘,而對于這種頻繁的動畫來說,使用Animated來做虽缕,雖然也是一個不錯的選擇始藕,但是Animated在使用的過程中,需要更多的代碼量氮趋,從定義變量伍派,啟動動畫,結(jié)束剩胁,等等流程都要手動控制诉植。如何高效快速地給App添加動畫,也是一個比較廣泛的需求昵观。這就是我們使用LayoutAnimation的原因晾腔,快速舌稀,高效,相比Animated灼擂,雖然對于動畫的控制減弱了壁查,但是同時也獲得了更高的開發(fā)效率。

和Animated有什么區(qū)別??

上面說了LayoutAnimation對比Animated的優(yōu)勢剔应,下面來更詳細(xì)的對比一下兩種方式在平常使用中的差異
首先是Animated(代碼取自官方文檔睡腿,并做了一些修改)

// part 1: 定義fadeAnim變量
state = {
    fadeAnim: new Animated.Value(0)
}

// part 2: 在某個時機(jī)啟動動畫(這個例子中我們在didMount生命周期中啟動)
componentDidMount() {
  Animated.timing(
    this.state.fadeAnim,
    {
      toValue: 1,
      duration: 10000,
    }
  ).start();
}

// part 3: 在render中,使用Animated提供的Animated.View實現(xiàn)動畫
render() {
  let { fadeAnim } = this.state;
  return (
    <Animated.View
      style={{
        opacity: fadeAnim,
      }}
    >
      {this.props.children}
    </Animated.View>
  );
}

下面是LayoutAnimation

// part 1: 使用普通的state來定義變量
state = {
    bottom: 0
}

// part 2: 
// 此處假設(shè)我們在某個View的style中峻贮,使用了this.state.bottom這個變量作為bottom的值
// 是的席怪,只需要添加一行代碼,你的View就有了動畫月洛!
LayoutAnimation.spring();
this.setState({ bottom: 20 });

通過上面的代碼何恶,我們可以很直觀的發(fā)現(xiàn)LayoutAnimation有多方便,我們可以使用這個api以非常低的代價嚼黔,使我們的App加入動畫??

快速上手???♀?

React Native LayoutAnimation api提供了三個可以直接使用的api,分別是easeInEaseOut, linear, spring

LayoutAnimation.easeInEaseOut()
LayoutAnimation.linear()
LayoutAnimation.spring()

使用方式和上面的例子相同惜辑,只要在相應(yīng)的setState之前調(diào)用下面三個API其中之一唬涧,在UI更新的時候,React Native就會自動讓UI實現(xiàn)相應(yīng)的動畫效果盛撑。

進(jìn)階 - 自定義animation????

為了自定義animation碎节,我們就需要稍微深入的了解一下LayoutAnimation提供了哪些API了,首先抵卫,我們來看一下源碼中接口的定義吧

/**
 * Automatically animates views to their new positions when the
 * next layout happens.
 *
 * A common way to use this API is to call it before calling `setState`.
 *
 * Note that in order to get this to work on **Android** you need to set the following flags via `UIManager`:
 *
 *     UIManager.setLayoutAnimationEnabledExperimental && UIManager.setLayoutAnimationEnabledExperimental(true);
 */
const LayoutAnimation = {
  /**
   * Schedules an animation to happen on the next layout.
   *
   * @param config Specifies animation properties:
   *
   *   - `duration` in milliseconds
   *   - `create`, `AnimationConfig` for animating in new views
   *   - `update`, `AnimationConfig` for animating views that have been updated
   *
   * @param onAnimationDidEnd Called when the animation finished.
   * Only supported on iOS.
   * @param onError Called on error. Only supported on iOS.
   */
  configureNext,
  /**
   * Helper for creating a config for `configureNext`.
   */
  create,
  Types: Object.freeze({
    spring: 'spring',
    linear: 'linear',
    easeInEaseOut: 'easeInEaseOut',
    easeIn: 'easeIn',
    easeOut: 'easeOut',
    keyboard: 'keyboard',
  }),
  Properties: Object.freeze({
    opacity: 'opacity',
    scaleX: 'scaleX',
    scaleY: 'scaleY',
    scaleXY: 'scaleXY',
  }),
  checkConfig(...args: Array<mixed>) {
    console.error('LayoutAnimation.checkConfig(...) has been disabled.');
  },
  Presets,
  easeInEaseOut: (configureNext.bind(null, Presets.easeInEaseOut): (
    onAnimationDidEnd?: any,
  ) => void),
  linear: (configureNext.bind(null, Presets.linear): (
    onAnimationDidEnd?: any,
  ) => void),
  spring: (configureNext.bind(null, Presets.spring): (
    onAnimationDidEnd?: any,
  ) => void),
};

主要方法??

  • configureNext
  • create

其實最主要的方法只有configureNext狮荔,create只是一個幫助創(chuàng)建配置的方法

使用configureNext

LayoutAnimation.configureNext(
  config: LayoutAnimationConfig,  // 提供一個動畫的配置
  onAnimationDidEnd?: Function,  // 動畫結(jié)束的回調(diào),可以為空
)

從configureNext接口的定義中我們可以看到介粘,使用很簡單殖氏,提供一個LayoutAnimationConfig就可以了,那么這個LayoutAnimationConfig是什么呢

type LayoutAnimationConfig = $ReadOnly<{|
  duration: number,
  create?: AnimationConfig,
  update?: AnimationConfig,
  delete?: AnimationConfig,
|}>;

再次從定義中我們發(fā)現(xiàn)姻采,這個config就是一個object雅采,我們可以使用之前提到的create方法來快速生成它,下面是完整的使用例子

LayouteAnimation.configureNext(
  LayoutAnimation.create(
    // 動畫的時長
    200,
    // 動畫的類型慨亲, 例如linear婚瓜,spring,easeIn
    LayouteAnimation.Types.linear,
    // 動畫在哪些地方生效刑棵,scaleX就是在X軸生效
    LayouteAnimation.Properties.scaleX
  )
)

這樣巴刻,我們就完全實現(xiàn)了LayoutAnimation動畫的自定義了。更多的配置選項可以在源碼中發(fā)現(xiàn)!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蛉签,一起剝皮案震驚了整個濱河市胡陪,隨后出現(xiàn)的幾起案子沥寥,更是在濱河造成了極大的恐慌,老刑警劉巖督弓,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件营曼,死亡現(xiàn)場離奇詭異,居然都是意外死亡愚隧,警方通過查閱死者的電腦和手機(jī)蒂阱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來狂塘,“玉大人录煤,你說我怎么就攤上這事≤窈” “怎么了妈踊?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長泪漂。 經(jīng)常有香客問我廊营,道長,這世上最難降的妖魔是什么萝勤? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任露筒,我火速辦了婚禮,結(jié)果婚禮上敌卓,老公的妹妹穿的比我還像新娘慎式。我一直安慰自己,他們只是感情好趟径,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布瘪吏。 她就那樣靜靜地躺著,像睡著了一般蜗巧。 火紅的嫁衣襯著肌膚如雪掌眠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天惧蛹,我揣著相機(jī)與錄音扇救,去河邊找鬼。 笑死香嗓,一個胖子當(dāng)著我的面吹牛迅腔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播靠娱,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼沧烈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了像云?” 一聲冷哼從身側(cè)響起锌雀,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蚂夕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后腋逆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體婿牍,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年惩歉,在試婚紗的時候發(fā)現(xiàn)自己被綠了等脂。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡撑蚌,死狀恐怖上遥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情争涌,我是刑警寧澤粉楚,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站亮垫,受9級特大地震影響模软,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜饮潦,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一撵摆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧害晦,春花似錦、人聲如沸暑中。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鳄逾。三九已至稻轨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間雕凹,已是汗流浹背殴俱。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留枚抵,地道東北人线欲。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像汽摹,于是被迫代替她去往敵國和親李丰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容