更多信息请访问:与华为官方共建的Harmonyos技术社区https://harmonyos.51cto.com后台这是一个非常小的鸿蒙开关emoji表情包的实现.效果类似于在微信中发送“生日快乐”、“妈妈妈妈”等词时触发的动画。功能展示基于鸿蒙系统,通过自定义控件属性实现EmojiRain组件,支持java代码设置。原理分析如图所示,表情控件Image的初始位置在屏幕顶部,EmojiRainLayout占满了整个屏幕。在表情包开始下落之前,从指定的表情包集合中获取对应的元素,并计算本次下落时元素的起始位置、结束位置、宽高。然后根据位置坐标和高度创建对应的动画对象,并设置Animator.CurveType.ACCELERATE_DECELERATE动画插值器。根据emoji掉落的数量准备好Image元素后,调用addComponent()将Image添加到EmojiRainLayout中,实现遮屏的效果。最后执行先加速后减速的动画效果,并开启表情下雨模式。//使用rxjava控制动画执行间隔、执行顺序、执行对象Subscriptionsubscription=Observable.interval(mDropFrequency,TimeUnit.MILLISECONDS).take(mDuration/mDropFrequency).flatMap(flow->Observable.range(0,mEmojiPer)).地图(图像->mEmojiPool.acquire()).过滤器(ep->ep!=null).observeOn(OhosSchedulers.mainThread()).subscribe(this::startDropAnimationForSingleEmoji,Throwable::printStackTrace);mSubscriptions.add(subscription);//为ImageAnimatorProperty创建动画对象animatorProperty=emoji.createAnimatorProperty();//设置动画执行时长animatorProperty.setDuration((int)(mDropAverageDuration*Randoms.floatAround(1,RELATIVE_DROP_DURATION_OFFSET)));floatstartX=Randoms.getStartX();floatendX=Randoms.getStopX();//指定动画的起止坐标Animator.CurveType.ACCELERATE_DECELERATE);animatorProperty.start();//初始化Image,随机分配比例缩放高宽,指定图片加载方式Imageemoji=newImage(getContext());emoji.setImageElement(emojiDrawable);emoji.setScaleMode(Image.ScaleMode.CENTER);doublepositive=Randoms.positiveGaussian()*0.6;finalintwidth=(int)(emoji_standard_size*(1.0+positive));finalinheight=(int)(emoji_standard_size*(1.0+积极的));finalLayoutConfigparams=newLayoutConfig(宽度,高度);params.setMarginTop(-height);params.setMarginLeft((int)(-0.5F*width));emoji.setLayoutConfig(params);一个wave中掉落的emoji数量,默认6duration掉落动画的总时长,默认8000msdropDuration每个emoji的平均掉落时长,默认2400msdropFrequency掉落频率,即每一个表情之间的时间间隔两个表盘,默认500ms在布局中配置EmojiRainLayout继承自StackLayout,可以当做原生的StackLayout使用
