1. 程式人生 > >React實戰-深入分析ReactNative中的動畫效果

React實戰-深入分析ReactNative中的動畫效果

React實戰-深入分析ReactNative中的動畫效果

說起動畫效果感覺回到JavaScript的起源了,在早期的Web開發中,JS更多的是扮演著頁面特效的角色,當然也只是屬於做些邊角料的工作,真正需要動畫的地方,大多還是採用Flash或者AppletJs更多的是操作html元素的變化,如果大量採用Js,則會嚴重影響頁面的效能。

在瞭解ReactNative中動畫之前,我們還是看看網頁動畫基本實現方式。在Web業務效果方面,基本的做法是改變Html頁面元素的屬性,例如:width,left,top等,導致頁面重繪,由於元素屬性變化和重繪過程存在時差,也就產生了動畫的效果,但總的來說效能並不太好。在

Css3中增加了transformtransition使得Web元素動畫效果變的簡單、流暢,再加上Htmlcanvas元素對視訊的支援,大大降低了Web頁面對外掛式動畫的依賴。在ReactNative的動畫主要關注在Web元素的效果變化,視訊的支援依然交給了canvas(weixin號:React實戰)

1.ReactNative中的四種變化方式

ReactNative中實現動畫效果的基本原理與之前並沒有什麼區別,再結合ReactJSUI重繪原則,主要有以下方式:

a通過Js直接構造新的元素,改變Style屬性。

if(this.state.complete === true){

      }else{

         return <View style={{width:20,height:20,backgroundColor:'blue'}} />

      }

b依據不同條件,設定不同的Style屬性

c.通過改變transform的值,產生平滑的動畫效果

<View style={this.state.complete ? {backgroundColor:'red'} : {backgroundColor:'blue',

transaction: ‘all 1s’, transform:{scale: 2}}/>

d.採用Animatortransform相結合,實現更炫動畫效果

<Animated.Image                         

          source={{uri: 'http://i.imgur.com/XMKOH81.jpg'}}

          style={{

            flex: 1,

            transform: [                        

              {scale: this.state.bounceValue}

            ]

          }}

        />

以上四種方式,如果不需要產生變化效果,一般採用第二種,如果需要產生平滑的變化效果,推薦採用第四種。

到目前為止,動畫依然是ReactNative的弱項,還在不斷的發展中。主要的方式是採用LayoutAnimationAnimated來實現,但背後的原理依然是改變state中的值,引起UI重繪。LayoutAnimation主要用於整體佈局的變化,Animated則用與更多規則和變化的特殊值變化。

2.ReactNativeAnimated實現方式

Animated主要對兩類特殊值的變化,一是單個值:Value,一個是對值物件值:ValueXY

a.Animated.Value的單值實現方式

state中定義Animated.Value的值:

 this.state = {

      bounceValue: new Animated.Value(0),

};

在頁面屬性中定義style屬性,屬性值基於state中的值:

 <Animated.Image                                 source={{uri: 'http://i.imgur.com/XMKOH81.jpg'}}

        style={{

          flex: 1,

          transform: [                                    {scale: this.state.bounceValue},            ]

        }}

      />

觸發動畫效果:

  Animated.spring(                         

      this.state.bounceValue,                 

      {

        toValue: 0.8,                        

        friction: 1,                         

      }

    ).start();   

b.Animator.ValueXY的雙值實現方式:

state中定義ValueXY值:

this.state = {

       pan: new Animated.ValueXY(),

     };

定義指定元素拖動時的ValueXY變化:

this.state.panResponder = PanResponder.create({

       onStartShouldSetPanResponder: () => true,

       onPanResponderMove: Animated.event([null, {

         dx: this.state.pan.x,

         dy: this.state.pan.y,

       }]),

       onPanResponderRelease: () => {

         Animated.spring(

           this.state.pan,         

           {toValue: {x: 0, y: 0}}

         ).start();

       },

     });

設定特定元素的樣式:

 <Animated.View

         {...this.state.panResponder.panHandlers}

         style={this.state.pan.getLayout()}>

         {this.props.children}

       </Animated.View>

c.Animator設定過程中的約束

Animator在設定原理並不複雜,但是有一些潛規則,在缺乏文件的情況下,還是看看原始碼比較好。Animator設定過程中有以下約束:

1)Animator.Value的值雖然定義在state中,但是在頁面元素中只有<Animator.View/>,<Animator.Text/>,<Animator.Image/>,<Animator.ScrollView/>等才能獲取,一般的<View/>等是不能獲取的,或者採用Animated.createAnimatedComponent建立自己的控制元件。並且文件中只列舉了View,Text,Image,但從原始碼中可以看到ScroolView也可以,見react-native原始碼:

module.exports = {

  ...AnimatedImplementation,

  View: AnimatedImplementation.createAnimatedComponent(View),

  Text: AnimatedImplementation.createAnimatedComponent(Text),

  Image: AnimatedImplementation.createAnimatedComponent(Image),

  ScrollView: AnimatedImplementation.createAnimatedComponent(ScrollView),

};

2)Animator.ValueXY的值{x,y}是特定的,如果你需要取值也應採用{x,y}

pan: new Animated.ValueXY()....

{dx: this.state.pan.x,dy: this.state.pan.y}

3.ReactNativeLayoutAnimation實現方式

ReactNative中更簡單的方式是對全域性進行Animation設定,即採用LayoutAnimation,則一般的元素也可以訪問state中的值,值的設定也就沒有什麼特殊的要求了,但是設定過程有些需要特別注意。其中在Android的控制元件裡特別需要的是要加入原生元件,否則效果失效。如下:

 UIManager.setLayoutAnimationEnabledExperimental &&

      UIManager.setLayoutAnimationEnabledExperimental(true);

動畫啟動也簡單:

LayoutAnimation.spring();

4.組合動畫

在設定動畫效果時,我們往往並不止一個動畫效果,可能是多個動畫的組合,ReactNative為我們提供了Animated.sequenceAnimated.parallel兩個方法進行動畫組合,使用也很簡單:

Animated.sequence([              

Animated.decay(position, {      

velocity: {x: gestureState.vx, y: gestureState.vy},     

deceleration: 0.997,

  }),

  Animated.parallel([        

    Animated.spring(position, {

      toValue: {x: 0, y: 0}   

    }),

    Animated.timing(twirl,

      toValue: 360,

    }),

  ]),

]).start();

5.三種主要動畫效果

ReactNative中主要有三種動畫效果:Spring, decaytiming,至於用法基本上看看引數就行,但是文件裡給出的引數太少,還是看看原始碼知道這些動畫的引數,以下是spring的引數表,其他的也可參加相關原始碼:

type SpringAnimationConfig = AnimationConfig & {

  toValue: number | AnimatedValue | {x: number, y: number} | AnimatedValueXY,

  overshootClamping?: bool,

  restDisplacementThreshold?: number,

  restSpeedThreshold?: number,

  velocity?: number | {x: number, y: number},

  bounciness?: number,

  speed?: number,

  tension?: number,

  friction?: number,

};

6.動畫過程中值的變化

在動畫執行過程中,採用Animator時,Animator相關元素能自動獲得Animator中的值,但這些值是不透明的,在外部是無法獲得中間值的,我們只能新增相關事件,在動畫執行結束時設定回撥函式,以執行動畫之後的操作。

及時採用LayoutAnimation,我們獲得的也只是最終值。

另外在ReactNative中提供了一種插值區間的方法interpolate,在動畫效果值變化過程中,會自動進行區間對映。如:

value.interpolate({

  inputRange: [0, 1],

  outputRange: [0, 100],

});

7.demo的原始碼

[email protected]:chenhuitian/ReactNative.git

相關推薦

React實戰-深入分析ReactNative動畫效果

React實戰-深入分析ReactNative中的動畫效果 說起動畫效果感覺回到JavaScript的起源了,在早期的Web開發中,JS更多的是扮演著頁面特效的角色,當然也只是屬於做些邊角料的工作,真正需要動畫的地方,大多還是採用Flash或者Applet,Js更多的是

用純CSS實現載入動畫效果

HTML &lt;div class="pswp__preloader__icn"&gt; &lt;div class="pswp__preloader__cut"&gt; &lt;div class="pswp__preloader__donut"&

用純CSS實現加載動畫效果

cit one form overflow relative tor -o ica tom HTML &lt;div class="pswp__preloader__icn"&gt; &lt;div class="

深入分析Javastatic關鍵字

  static是Java中的一個比較重要的關鍵字。它具有多種的用法,合適地運用static關鍵字可以有效地提高程式的執行效能,優化程式的結構。static關鍵字主要具有以下四種應用場景和用途: 修飾成員變數 修飾成員方法 靜態程式碼塊 靜態導包 1

深入分析JVM執行緒的建立和執行原理 (future)

在JVM中除了應用執行緒,還有其他的一些執行緒用於支援JVM的執行,這些執行緒可以被劃分為以下幾類: VM Thread:負責JVM在安全點內的各種操作,這些操作(諸如自動記憶體管理、取消偏向鎖、執行緒dump、執行緒掛起等等)在執行過程中需要JVM處於這樣一個狀態——堆的內容不會被改變,這種狀態在

MPAndroidChart遇到的坑,release包動畫效果不起作用!!

在上一篇文章中,我解決了MarkerView顯示有偏移的問題。新的一週開始,由於公司測試請假了,所以新功能沒法配合測試。所以自己就又看了看自己做的圖表(爭取做的跟完美一點,嘻嘻)。看了看還真是有問題了!! 原本的動畫效果沒有了!!!這就頭大了,原本上線的的專案中還是好好的,難道就是上週修改了Ma

React實戰-如何在ReactJs呼叫Google、Baidu地圖

React實戰-如何在ReactJs中呼叫Google、Baidu地圖 在這個網際網路時代,對地圖的運用已經成為Web、移動各類應用的必選項。國內外各大地圖應用提供商均有開放的Api供大家使用,當然更具使用的功能會提供付費版和免費版,如果僅僅只是小的應用或者練手,完全可以呼

深入分析Java 的中文編碼問題

QueryString 又如何解析?GET 方式HTTP 請求的QueryString 與POST 方式HTTP 請求的表單引數都是作為Parameters 儲存,都是通過request.getParameter 獲取引數值。對它們的解碼是在request.getParameter 方法第一次被呼叫時進行

深入分析dwr的DWRUtil.$

 為了更好的使用dwr的util.js,瞭解 $是必須的 /**  * Find the element in the current HTML document with the given id or ids  * @see http://getahead.ltd.uk/

React實戰-深入原始碼瞭解Redux用法之Reducers

React實戰-深入原始碼瞭解Redux用法之Reducers 在Redux中Reducers是真正實現state資料變化的工作。我們在使用Redux時,可能也只是似懂非懂,我們不知道它是如何工作的,我們知道在Action中定義事件,在Reducers中定義對應事件對應的操

深入分析 Java 的中文編碼問題

幾種常見的編碼格式 為什麼要編碼? 不知道大家有沒有想過一個問題,那就是為什麼要編碼?我們能不能不編碼?要回答這個問題必須要回到計算機是如何表示我們人類能夠理解的符號的,這些符號也就是我們人類使用的語言。由於人類的語言有太多,因而表示這些語言的符號太多,無法用計算機中一個基本的儲存單元—— byte 來表

Shiro許可權管理框架(四):深入分析Shiro的Session管理

其實關於Shiro的一些學習筆記很早就該寫了,因為懶癌和拖延症晚期一直沒有落實,直到今天公司的一個專案碰到了在叢集環境的單點登入頻繁掉線的問題,為了解決這個問題,Shiro相關的文件和教程沒少翻。最後問題解決了,但我覺得我也是時候來做一波Shiro學習筆記了。 本篇是Shiro系列第四篇,Shiro中的過濾器

react使用css動畫效果

100% index bsp urn key port pac ops def index.js import React, { Component, Fragment } from ‘react‘; class App extends Component

anime.js 實戰:實現一個帶有描邊動畫效果的復選框

由於 圓角 理解 http 中心 timeline 實例 描邊 evel 在網頁或者是APP的開發中,動畫運用得當可以起到錦上添花的作用。正確使用動畫,不但可以有助於用戶理解交互的作用,還可以大大提高網頁應用的魅力和使用體驗。並且在現在的網頁開發中,動畫已經成為了一個設計的

深入理解Java的逃逸分析

end 代碼 堆內存 解決 永遠 例子 append 解釋器 return 在Java的編譯體系中,一個Java的源代碼文件變成計算機可執行的機器指令的過程中,需要經過兩段編譯,第一段是把.java文件轉換成.class文件。第二段編譯是把.class轉換成機器指令的過程。

深入分析大數據時代的數據倉庫技術

運營商 olt ltp 千萬 連接 chan 並發 重點 nbsp 大數據背景 眾所周知,當前是一個數據爆炸的時代,大數據背景下的數據治理是每一個企業應該重點考慮的問題。例如金融機構、電信運營商這種“傳統”行業每日需要處理的數據量都已經十分巨大了,中小型互聯網公司都已

web開發常用的jquery動畫效果

1、隱藏&顯示 設定元素的隱藏,顯示功能,語法如下: jquery show(speed ,callback); jquery hide(speed ,callback); jquery togger(speed ,callback); 說明:引數不是必須的,在

iOS動畫效果實戰篇之CABasicAnimation的使用

最近正在研究iOS動畫效果的實現,目的也是為了自己能夠寫出比較炫酷的動畫效果。趁著專案不怎麼忙,抽出時間寫篇文章來記錄一下自己的學習成果及實戰效果。由於本人是最近才開始寫部落格,不善言辭,不喜勿噴,如果錯誤,還請指正。 本篇文章的動畫效果也是我在學習動畫效果的過程中其中一個頁面的動畫

Android屬性動畫深入分析 讓你成為動畫牛人

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

JQuery動畫效果

show() hide() slideUp slideDown fadeIn fadeOut animate : 自定義動畫   JQuery中的動畫效果.html <!DOCTYPE html> <html> <head> <m