小程序动画循环方案

小程序中适当使用微型动画,可以给交互带来更好的体验。


demo做的是一个刷新动画。 点击banner右下角的“刷新”图标,拉取接口,获取新图片地址,刷新banner图。 我希望的效果是在这个过程中,图标一直转圈,直到图片刷新成功。

按照小程序开发指南的介绍,在小程序中,通常可以使用 CSS 渐变CSS 动画 来创建简易的界面动画。同时,还可以使用 wx.createAnimation 接口来动态创建简易的动画效果。实际使用发现css动画更容易实现。以下是两种实现方案代码。


小程序动画API creatAnimation

首先创建一个动画实例(描述动画持续时间,延迟执行时间,动画运行曲线,原点),然后往这个实例里面添加动画组,每组动画可以包含很多动作(旋转、缩放、位置变换等等),这些动作是同时执行的,一组动画执行完毕后,继续执行下一组动画。动画组全部添加好了,通过动画实例的 export 方法导出动画数据 setData 给组件的 animation 属性。官方文档

wxml:

<!--给button组件添加animation属性, 图标使用的是iconfont -->
<button class="button" bindtap="refresh" animation="{{animationData}}" >
        <icon class="iconfont iconhuanyipi" />
</button>

js:

onReady() {
        // 创建动画
        this.animation = wx.createAnimation({
            duration: 1000  // 默认持续时间1000ms
        });
    },
refresh() {
    this.animation.rotate(360).step();  // 往animation里面添加转圈动画组
// 导出动画,传递给组件
    this.setData({
          animationData: this.animation.export()
    });
// 调接口,获取新图片地址,成功后动画停止
...
}

写到这里,发现小程序动画API少了一些东西:
1.有动画持续时间 duration属性,单位是ms,可是没有类似css3中的 infinite 无限循环。 要实现无限循环,需要自己写代码实现。
2.转圈动画只能转一次,再次点击不转圈了。原因动画执行后,图标是旋转360度的状态,没有回到原点。需要自己写代码回到原点。
this.animation.rotate(0).step({ duration: 0 }); // 动画持续时间设置为0
3.实现了动画循环,还要在适当的时候停止动画,小程序也没有停止动画的功能提供。需要自己写代码实现。
4.小程序动画的原理,是不停的改变wxml 元素的style属性,估计执行复杂动画有性能瓶颈,卡顿的可能。 我用到动画的比较简单,暂时没有发现这个问题。


幸好,在小程序开发指南里面还提供了 bindtransitionend 来监听动画结束一个阶段。 这个事件为循环动画,和停止动画提供了可能。 注意这里监听的是动画结束一个阶段,也就是上面提到的一个动画组(step)。每次结束都会调用。

wxml: 增加了一个 bindtransitionend 事件,监听每组动画结束

<view class="button" bindtap="refresh" animation="{{animationData}}" bindtransitionend="reAnimation">
        <icon class="iconfont iconhuanyipi" />
</view>

js: 增加 circling 来记录动画状态(动画中,或者停止),增加 bindtransitionend方法

data:{
 animationData: {},
},
onReady() {
        // 创建动画
        this.animation = wx.createAnimation({
            duration: 1000
        });
        this.circling = false;  // 记录动画状态
    },
refresh() {
        this.animation.rotate(360).step();  // 往animation里面添加转圈动画组
// 导出动画,传递给组件
        this.setData({
                animationData: this.animation.export()
         });
        this.circling = true;
// 模拟调用接口延时,3秒后停止动画
        setTimeout(()=>{
            this.circling = false;
        },3000)
},
// 监听wx动画step结束
reAnimation(val) {
        console.log("reAnimation",val)
        if (!this.circling) {
            console.log("结束动画");
            this.animation.rotate(0).step({ duration: 0 }); 
            this.setData({
                animationData: this.animation.export()
            });
        } else {
            console.log("循环动画");
// 先把旋转回归到初始0度,然后重新设置动画组,两次setData必须有时间差(这里写的60ms),否则不生效
            this.animation.rotate(0).step({ duration: 0 });
            this.setData({
                animationData: this.animation.export()
            });
            this.animation.rotate(360).step();
            setTimeout(() => {
                this.setData({
                    animationData: this.animation.export()
                });
            }, 60); 
        }
   },

经过一番折腾总算勉强实现了!动画的停止只能在完成一组动作后实现,中途不能停止。


css3动画实现

同样的效果,如果使用css3动画来实现,会简单很多。首先在wxss里面引入css3动画样式,我习惯用animate.css
@import "./animate.wxss";

<view class="button animated infinite {{animateName}}" bindtap="refresh">
        <icon class="iconfont iconhuanyipi" />
</view>
data: {
animateName: ""  // 
},
refresh() {
  this.setData({
            animateName: "circle"
        });
// 模拟调用接口延时,3秒后停止动画
        setTimeout(()=>{
            this.setData({
                animateName: ""
            });
        },3000)
}

ps:

小程序另外还有“高级动画方式”:WXS 响应事件。通过wxs事件不断改变 style 属性的值可以做到动画效果。实现复杂场景动画。

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

推荐阅读更多精彩内容

  • 每天的学习记录,可能有的地方写的不对,因为刚学,以后发现错的话会回来改掉整体流程 https://develope...
    有点健忘阅读 4,660评论 0 7
  • 因新工作主要负责微信小程序这一块,最近的重心就移到这一块,该博客是对微信小程序整体的整理归纳以及标明一些细节点,初...
    majun00阅读 7,341评论 0 9
  • 在AngularJS应用中创建动画,有三种途径: 使用CSS3动画 使用JavaScript动画 使用CSS3过渡...
    oWSQo阅读 1,456评论 0 3
  • 小程序 基本知识 项目文件 JSON 配置 小程序配置 app.json app.json 是对当前小程序的全局配...
    勇敢的_心_阅读 1,347评论 0 6
  • 当爱在身边时,我们会忘记那种珍贵的感觉,最初的生命力会慢慢陷落。有一日,你陷入失去时,才知我们在追寻的一个...
    朵儿的世界ula阅读 316评论 0 0