RN Animated動畫 - 頭像自動循環(huán)縮放展示

需求:

類似pdd百億補貼里面的頭像自動循環(huán)縮放展示

注意:由于項目需要,加入頭像自動循環(huán)縮放展示,研究了下動畫,以下是效果堰怨,可自行在代碼中調整動畫執(zhí)行時間

1uw9v-jm8d2.gif

1、創(chuàng)建動畫組件

import React from 'react';
import {View, StyleSheet, Animated, Image} from 'react-native';
import px2dp from '../../../utils/px2dp';

const showTime = 2000; //啟動時間
//頭像動畫
export default class HeaderIconView extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      marginLeft: new Animated.Value(px2dp(20)),
      iconOneOpacity: new Animated.Value(1),
      iconOneScale: new Animated.Value(1),
      iconFourOpacity: new Animated.Value(0),
      iconFourScale: new Animated.Value(0),
      iconOne: (props.iconList && props.iconList[0]) || '',
      iconTwo: (props.iconList && props.iconList[1]) || '',
      iconThree: (props.iconList && props.iconList[2]) || '',
      iconFour: (props.iconList && props.iconList[3]) || '',
    };
    this.startIndex = 0;
  }

  componentDidMount() {
    const {iconList = []} = this.props;
    if (iconList.length >= 4) {
      this.animatedShowAction();
    }
  }
  animatedShowAction() {
    const {iconList = []} = this.props;
    Animated.parallel([
      Animated.timing(this.state.marginLeft, {
        toValue: 0,
        duration: showTime,
        useNativeDriver: true,
      }),
      Animated.timing(this.state.iconOneOpacity, {
        toValue: 0,
        duration: showTime,
        useNativeDriver: true,
      }),
      Animated.timing(this.state.iconOneScale, {
        toValue: 0,
        duration: showTime,
        useNativeDriver: true,
      }),
      Animated.timing(this.state.iconFourScale, {
        toValue: 1,
        duration: showTime,
        useNativeDriver: true,
      }),
      Animated.timing(this.state.iconFourOpacity, {
        toValue: 1,
        duration: showTime,
        useNativeDriver: true,
      }),
    ]).start(() => {
      ++this.startIndex;
      let twoIndex = this.startIndex + 1;
      let threeIndex = this.startIndex + 2;
      let fourIndex = this.startIndex + 3;
      if (this.startIndex > iconList.length - 1) {
        this.startIndex = 0;
        twoIndex = 1;
        threeIndex = 2;
        fourIndex = 3;
      }
      if (twoIndex > iconList.length - 1) {
        twoIndex = 0;
        threeIndex = 1;
        fourIndex = 2;
      }
      if (threeIndex > iconList.length - 1) {
        threeIndex = 0;
        fourIndex = 1;
      }
      if (fourIndex > iconList.length - 1) {
        fourIndex = 0;
      }

      this.setState(
        {
          marginLeft: new Animated.Value(px2dp(20)),
          iconOneOpacity: new Animated.Value(1),
          iconOneScale: new Animated.Value(1),
          iconFourScale: new Animated.Value(0),
          iconFourOpacity: new Animated.Value(0),
          iconOne: iconList[this.startIndex],
          iconTwo: iconList[twoIndex],
          iconThree: iconList[threeIndex],
          iconFour: iconList[fourIndex],
        },
        () => {
          this.animatedShowAction();
        },
      );
    });
  }

  render() {
    const {
      iconOne = '',
      iconTwo = '',
      iconThree = '',
      iconFour = '',
    } = this.state;
    return (
      <Animated.View
        style={{
          flexDirection: 'row',
          width: px2dp(100),
          transform: [
            {
              translateX: this.state.marginLeft,
            },
          ],
        }}>
        <Animated.View
          style={[
            styles.topTwoIconView,
            {
              opacity: this.state.iconOneOpacity,
              transform: [{scale: this.state.iconOneScale}],
            },
          ]}>
          <Image
            style={styles.iconView}
            source={{
              uri: iconOne,
            }}
            fadeDuration={0}
            contentMode="stretch"
          />
        </Animated.View>
        <View
          style={[styles.topTwoIconView, {zIndex: 3, marginLeft: -px2dp(20)}]}>
          <Image
            style={styles.iconView}
            source={{
              uri: iconTwo,
            }}
            fadeDuration={0}
            contentMode="stretch"
          />
        </View>
        <View
          style={[styles.topTwoIconView, {zIndex: 2, marginLeft: -px2dp(20)}]}>
          <Image
            style={styles.iconView}
            source={{
              uri: iconThree,
            }}
            fadeDuration={0}
            contentMode="stretch"
          />
        </View>
        <Animated.View
          style={[
            styles.topTwoIconView,
            {
              zIndex: 1,
              marginLeft: -px2dp(20),
              opacity: this.state.iconFourScale,
              transform: [{scale: this.state.iconFourScale}],
            },
          ]}>
          <Image
            style={styles.iconView}
            source={{
              uri: iconFour,
            }}
            fadeDuration={0}
            contentMode="stretch"
          />
        </Animated.View>
      </Animated.View>
    );
  }
}
const styles = StyleSheet.create({
  topTwoIconView: {
    width: px2dp(40),
    height: px2dp(40),
    borderRadius: px2dp(20),
    borderWidth: px2dp(2),
    zIndex: 4,
    borderColor: '#ffffff',
    justifyContent: 'center',
    alignItems: 'center',
    overflow: 'hidden',
  },
  iconView: {
    width: px2dp(40),
    height: px2dp(40),
    borderRadius: px2dp(20),
  },
});

2甸私、引入動畫組件

const iconList=['','','','',''];
 <HeaderBIconView iconList={iconList} />
以上就是我的頭像自動循環(huán)播放的功能代碼诚些,歡迎各位童鞋評論、指導皇型,謝謝诬烹!

PS (以上播放的圖片大都是從網上找到,如若有侵權弃鸦,請聯系我馬上刪除绞吁,謝謝)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市唬格,隨后出現的幾起案子家破,更是在濱河造成了極大的恐慌,老刑警劉巖购岗,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件汰聋,死亡現場離奇詭異,居然都是意外死亡喊积,警方通過查閱死者的電腦和手機烹困,發(fā)現死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乾吻,“玉大人髓梅,你說我怎么就攤上這事∫锴” “怎么了枯饿?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長诡必。 經常有香客問我奢方,道長,這世上最難降的妖魔是什么爸舒? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任蟋字,我火速辦了婚禮,結果婚禮上碳抄,老公的妹妹穿的比我還像新娘愉老。我一直安慰自己场绿,他們只是感情好剖效,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布嫉入。 她就那樣靜靜地躺著,像睡著了一般璧尸。 火紅的嫁衣襯著肌膚如雪咒林。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天爷光,我揣著相機與錄音垫竞,去河邊找鬼。 笑死蛀序,一個胖子當著我的面吹牛欢瞪,可吹牛的內容都是我干的。 我是一名探鬼主播徐裸,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼遣鼓,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了重贺?” 一聲冷哼從身側響起骑祟,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎气笙,沒想到半個月后次企,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡潜圃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年缸棵,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秉犹。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡蛉谜,死狀恐怖,靈堂內的尸體忽然破棺而出崇堵,到底是詐尸還是另有隱情型诚,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布鸳劳,位于F島的核電站狰贯,受9級特大地震影響,放射性物質發(fā)生泄漏赏廓。R本人自食惡果不足惜涵紊,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望幔摸。 院中可真熱鬧摸柄,春花似錦、人聲如沸既忆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至跃脊,卻和暖如春宇挫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背酪术。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工器瘪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绘雁。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓橡疼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親庐舟。 傳聞我的和親對象是個殘疾皇子衰齐,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內容

  • 用兩張圖告訴你,為什么你的 App 會卡頓? - Android - 掘金 Cover 有什么料继阻? 從這篇文章中你...
    hw1212閱讀 12,714評論 2 59
  • 漸變的面目拼圖要我怎么拼? 我是疲乏了還是投降了墨辛? 不是不允許自己墜落卓研, 我沒有滴水不進的保護膜。 就是害怕變得面...
    悶熱當乘涼閱讀 4,244評論 0 13
  • 夜鶯2517閱讀 127,719評論 1 9
  • 版本:ios 1.2.1 亮點: 1.app角標可以實時更新天氣溫度或選擇空氣質量睹簇,建議處女座就不要選了奏赘,不然老想...
    我就是沉沉閱讀 6,887評論 1 6
  • 我是一名過去式的高三狗,很可悲太惠,在這三年里我沒有戀愛磨淌,看著同齡的小伙伴們一對兒一對兒的,我的心不好受凿渊。怎么說呢梁只,高...
    小娘紙閱讀 3,387評論 4 7