当前位置: 首页 > 科技观察

从微信小程序到鸿蒙JS开发——CSS3动画&JS动画&定时器

时间:2023-03-16 14:42:42 科技观察

更多内容请访问:与华为官方共建的鸿蒙技术社区https://harmonyos.51cto.com进入一个APP,通常会有欢迎界面,用于显示APP的名称和logo,并预加载一些数据。既然是欢迎页面,自然少不了一些动画元素。简单使用CSS3和JS动画效果、进度组件和倒计时推出欢迎页面。直接效果:1.基于CSS3的动画效果1.1为动画元素设置动画属性。animation-name:动画名称animation-duration:动画时长animation-delay:动画开始前的延迟时间animation-iteration-count:动画重复次数animation-timing-function:动画执行速度animation-fill-mode:动画模式.logo{width:300px;height:300px;border-radius:150px;animation-name:an1;animation-duration:5s;animation-iteration-count:1;animation-timing-function:linear;animation-fill-mode:none;}1.2使用“@keyframes动画名称”匹配设置动画规则。@keyframesan1{from{transform:rotate(180deg);opacity:0.3;}to{transform:rotate(360deg);opacity:1.0;}}除了from,to,还可以用百分比(比如20%{...})设置动画期间的效果。以上两步实现了gif中的HUAWEIlogo旋转和渐清动画效果。2.基于JS的动画效果2.1给动画元素赋予id/ref等属性,可用于元素匹配。2.2在onShow()方法中获取元素实例,使用animate()方法给出动画规则和基本属性。注意这一步在onInit()和onReady()中执行时没有效果。animate()接受两个参数,第一个是数组,指定动画的关键帧效果。第二个是指定动画基本属性的对象。2.3调用play()方法开始动画执行。onShow(){//设置动画lettextImg=this.$element("textImg").animate([{transform:{translateY:'200px'},opacity:0.1},{transform:{translateY:'0px'},opacity:1}],{duration:5000,easing:"linear-out-slow-in",fill:"forwards",iterations:1});textImg.play();...}这个方法没有说明在开发者文档中找到,但确认可用,IDE也有提示。transform中没有按键输入的提示。这里写完之后会有红线说缺少属性,但是运行没有问题,可以忽略。如果看起来不舒服,可以单独将数组声明为变量,然后将其作为animate()方法的参数。以上三步实现了gif中的“litemall”字样从下向上移动,逐渐清晰的动画效果。与CSS3动画技术相比,使用JS实现动画会更加灵活。动画可以定义在onShow()中,它会在用户执行某些操作后执行。CSS3只能在页面显示后执行一定时间,但可以通过百分比的形式定义更丰富的动画渐变效果。3、JS定时器setTimeout()和setInterval()这两个定时函数在鸿蒙中可以无缝使用。gif图中的倒计时使用setInterval()每1秒倒计时一个数并改变省略号的个数,倒计时到0时清空定时器。为了防止僵尸线程影响性能,记得调用clearTimeout()和clearInterval()来清除定时器。倒计时部分,hml视图层:{{loading}}

{{seconds}}css渲染层:.loading{width:100%;height:150px;display:flex;justify-content:center;align-items:center;}progress{width:120px;height:120px;}.loading>text{font-size:40px;color:#666666;}.count{position:fixed;bottom:385px;left:225px;font-size:60px;color:#666666;}js逻辑层:onShow(){......//设置倒计时letiv=setInterval(()=>{letsuffix;switch(this.seconds%3){case2:suffix="...";break;case1:suffix="..";break;default:suffix=".";break;}this.loading="Dataloading"+suffix;this.seconds--;if(this.seconds==0){clearInterval(iv);}},1000);}动画播放完后页面会跳转到商城首页,可以使用setTimeout()设置定时跳转。这里在播放动画时预加载首页需要的数据,作为页面参数进行跳转,可以加快商城页面的显示速度,提升用户体验。onInit(){//首页数据预加载//获取广告图片fetch.fetch({...});//获取推荐商品fetch.fetch({...});//获取一级分类fetch.fetch({...});},onShow(){//设置时序跳转letto=setTimeout(()=>{router.replace({uri:"pages/index/index",params:{ad:this.ad,newGoods:this.newGoods,hotGoods:this.hotGoods,types:this.types}});clearTimeout(to);},6000);…}4。微信小程序的动画效果最后写一下微信小程序的动画实现。wxss也支持CSS3动画属性:.happy{font-size:50rpx;color:#e20a0b;animation-name:an1;动画持续时间:5s;动画延迟:500ms;动画迭代计数:无限;动画方向:正常;动画填充模式:向前;动画计时函数:线性;}@keyframesan1{from{transform:translateX(0px);opacity:0.5;}to{transform:translateX(300px);opacity:1;}}微信小程序的动画JS实现方式和鸿蒙有很大的不同,动画的定义和实现是通过微信提供的API。该接口提供了丰富的方法,可以在开发者文档中找到。Page({/***页面初始数据*/data:{an2:null},onShow:function(){letan2=wx.createAnimation({delay:500,duration:5000,timingFunction:'ease-in-out'});an2.translate(100,300).step();an2.rotate(90).opacity(0.1).step();this.setData({an2:an2.export()})},}动画基础属性作为createAnimation()方法的入参,动画关键帧由一系列方法流程操作给出,以step()结束,这里一个动画的执行时间就是duration给出的时间。动画对象需要使用export()将其导出为data,绑定到页面元素的animation属性HappyNewYear查看更多信息请访问:与华为合作共建Harmonyos技术社区https://harmonyos.51cto.com