ReactNative实现点赞飘心动画

前言

公司正在做直播项目,其中需要做一个类似YY,虎牙,斗鱼中的点赞飘心的动画.由于没有找到对应的库,就只能自己写一个了,目前采用的是ReactNative中的插值动画,其实实现起来也比较简单.上代码.....

第一步

在构造函数中声明多个用来驱动动画的Animate变量,以及一个用来做视图于动画匹配的变量

constructor(props) {
        super(props)
        for (let i = 0; i < 10; i++) {
            this[`HeartArg${i}`] = new Animated.Value(0)
        }
        this.viewNum = 0
    }

第二步

在render函数中使用循环声明多个View,我这里使用的是10个图片来进行动画的循环,其中要注意的是ref属性,这里是为了后续设置随机颜色而设置的变量,其中的top,right, transform, opacity都使用了插值函数,不过大家也可以通过这种方式实现对其他属性的操作

            <View>
                    {
                      Array(10).fill().map((_, index) => {
                            return <Animated.Image
                                key={index}
                                ref={_ => this[`animImg${index}`] = _}
                                style={[ChatRoomToolsSty.animImg, {
                                    top: this[`HeartArg${index}`].interpolate({
                                        inputRange: [0, 1, 2, 3],
                                        outputRange: [10, -100, -200, -300]
                                    }),
                                    right: this[`HeartArg${index}`].interpolate({
                                        inputRange: [0, 1, 2, 3],
                                        outputRange: Math.floor(Math.random() + 0.5) === 0 ? [7, 30, 15, 7] : [7, 0, 30, 10]
                                    }),
                                    transform: [{
                                        scale: this[`HeartArg${index}`].interpolate({
                                            inputRange: [0, 1, 2, 3],
                                            outputRange: [0.5, 1, 1.5, 1]
                                        })
                                    }],
                                    opacity: this[`HeartArg${index}`].interpolate({
                                        inputRange: [0, 1, 2, 3],
                                        outputRange: [0.5, 1, 0.5, 0]
                                    })
                                }]}
                                source={Images.action4}
                            />
                        })
                    }
            </View>

第三步

声明一个用来驱动动画的函数,其中的随机颜色用到了上一步中的ref声明, COLOR_ARR这个常亮根据产品需求可以自己定义一个数组

    startAnimate = () => {
        this[`HeartArg${this.viewNum}`].setValue(0)
        //设置随机颜色
        let colorIndex = Math.floor(Math.random() * 10)
        this[`animImg${this.viewNum}`].setNativeProps({
            style: {
                tintColor: COLOR_ARR[colorIndex]
            }
        })
        //根据当前动画驱动值进行判断是否对新VIEW进行驱动
        let currentValue = this[`HeartArg${this.viewNum}`].__getValue()
        if (currentValue !== 0) {
            this.viewNum++
        }
        Animated.timing(
            this[`HeartArg${this.viewNum}`],
            {
                toValue: 3,
                duration: 2000,
                easing: Easing.linear
            }
        ).start(() => {
            this[`HeartArg${this.viewNum}`].setValue(0)
        })
        //如果当前正在驱动的VIEW的数量大于8,则重置回0,让动画循环
        if (this.viewNum > 8) {
            this.viewNum = 0
        }
        this.viewNum++
    }

颜色数组可定义成下面这样👇

const COLOR_ARR = [
    '#9C89B8',
    '#F0A6CA',
    '#EFC3E6',
    '#F0E6EF',
    '#B8BEDD',
    '#5BC0EB',
    '#FDE74C',
    '#9BC53D',
    '#E55934',
    '#FA7921'
]

第四步

定义一个Btn按钮,开始吧😁

<ChatRoomToolsActionBtn
    source={Images.action4}
    onPress={() => {
          this.startAnimate()
             }}/>

看成品

如果觉得这些内容对你有用,那点个赞再走吧❤️,欢迎转发,还请注明出处,谢谢

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容