鸿蒙实现新功能!

技术宅 2021-08-20 16:38:06 3983

这是一个特别小巧的鸿蒙掉 emoji 表情包实现。效果类似于微信中发送"生日快乐"和"么么哒"之类的词语时触发的动画效果。

功能展示

基于鸿蒙系统,通过自定义控件属性方式实现了 EmojiRain 组件,同时支持 Java 代码设置。

原理解析

如下图所示,表情控件 Image 初始位置在屏幕的上方,EmojiRainLayout 充满整个屏幕。

表情包开始掉落前,从指定表情包集合中获取对应元素,计算该元素本次掉落时的起始位置、终止位置、宽度、高度。

然后根据位置坐标及高度创建对应的动画对象,设置 Animator.CurveType.ACCELERATE_DECELERATE 动画插值器。

根据表情包掉落数量将 Image 元素准备完成后,通过调用 addComponent() 将 Image 添加到 EmojiRainLayout 上,达到覆盖在屏幕上的效果。

最后执行先加速后减速的动画效果,开启表情雨模式。
//使用rxjava控制动画执行间隔、执行顺序、执行对象
Subscription subscription = Observable.interval(mDropFrequency, TimeUnit.MILLISECONDS)
.take(mDuration / mDropFrequency)
.flatMap(flow -> Observable.range(0, mEmojiPer))
.map(image -> mEmojiPool.acquire())
.filter(ep -> ep != null)
.observeOn(OhosSchedulers.mainThread())
.subscribe(this::startDropAnimationForSingleEmoji, Throwable::printStackTrace);
mSubscriptions.add(subscription);

//为Image创建动画对象
AnimatorProperty animatorProperty = emoji.createAnimatorProperty();
//设置动画执行时长
animatorProperty.setDuration((int)
(mDropAverageDuration * Randoms.floatAround(1, RELATIVE_DROP_DURATION_OFFSET)));
float startX = Randoms.getStartX();
float endX = Randoms.getStopX();
//指定动画开始的坐标及终止坐标
animatorProperty.moveFromX(startX).moveToX(endX).moveFromY(-imageHeight).moveToY(mWindowHeight);
animatorProperty.setCurveType(Animator.CurveType.ACCELERATE_DECELERATE);
animatorProperty.start();

    //初始化Image,随机赋予等比例缩放高度、宽度,指定图片加载模式
    Image emoji = new Image(getContext());
    emoji.setImageElement(emojiDrawable);
    emoji.setScaleMode(Image.ScaleMode.CENTER);
    double positive = Randoms.positiveGaussian() * 0.6;
    final int width = (int) (emoji_standard_size * (1.0 + positive));
    final int height = (int) (emoji_standard_size * (1.0 + positive));
    final LayoutConfig params = new LayoutConfig(width, height);
    params.setMarginTop(-height);
    params.setMarginLeft((int) (-0.5F * width));
    emoji.setLayoutConfig(params);

使用说明

参数配置如下:
per:每一波掉落的 emoji 个数,默认 6 个

duration:掉落动画持续的总时长,默认 8000ms

dropDuration:每个 emoji 掉落时长的平均值,默认 2400ms

dropFrequency:掉落频率,即每两拨的时间间隔,默认 500ms

在 layout 中配置 EmojiRainLayout 继承自 StackLayout,你完全可以把它当做原生的 StackLayout 使用。

<com.luolc.emojirain.EmojiRainLayout
xmlns:ohos="http://schemas.huawei.com/res/ohos"
xmlns:app="http://schemas.huawei.com/res/ohos-auto"
xmlns:tools="http://schemas.android.com/tools"
ohos:height="match_parent"
ohos:width="match_parent"
app:dropDuration="2400"
app:dropFrequency="500"
app:duration="7200"
app:per="10">

<Text
ohos:height="match_content"
ohos:width="match_content"
ohos:text="Hello world!" />

</com.luolc.emojirain.EmojiRainLayout>

public class MainAbilitySlice extends AbilitySlice {

private EmojiRainLayout mContainer;

@Override
protected void onStart(Intent intent) {
    super.onStart(intent);
    super.setUIContent(ResourceTable.Layout_ability_main);

    // bind view
    mContainer = (EmojiRainLayout) findComponentById(ResourceTable.Id_group_emoji_container);

    // add emoji sources
    mContainer.addEmoji(ResourceTable.Media_emoji_1_3);
    mContainer.addEmoji(ResourceTable.Media_emoji_2_3);
    mContainer.addEmoji(ResourceTable.Media_emoji_3_3);
    mContainer.addEmoji(ResourceTable.Media_emoji_4_3);
    mContainer.addEmoji(ResourceTable.Media_emoji_5_3);

    // set emojis per flow, default 6
    mContainer.setPer(10);

    // set total duration in milliseconds, default 8000
    mContainer.setDuration(7200);

    // set average drop duration in milliseconds, default 2400
    mContainer.setDropDuration(2400);

    // set drop frequency in milliseconds, default 500
    mContainer.setDropFrequency(500);
}

}

开始掉落:

mContainer.startDropping();

停止掉落:

mContainer.stopDropping();

项目地址:

https://gitee.com/chinasoft5_ohos/EmojiRain

来源:鸿蒙技术社区

声明:本文内容由易百纳平台入驻作者撰写,文章观点仅代表作者本人,不代表易百纳立场。如有内容侵权或者其他问题,请联系本站进行删除。
红包 93 收藏 评论 打赏
评论
0个
内容存在敏感词
手气红包
    易百纳技术社区暂无数据
相关专栏
置顶时间设置
结束时间
删除原因
  • 广告/SPAM
  • 恶意灌水
  • 违规内容
  • 文不对题
  • 重复发帖
打赏作者
易百纳技术社区
技术宅
您的支持将鼓励我继续创作!
打赏金额:
¥1易百纳技术社区
¥5易百纳技术社区
¥10易百纳技术社区
¥50易百纳技术社区
¥100易百纳技术社区
支付方式:
微信支付
支付宝支付
易百纳技术社区微信支付
易百纳技术社区
打赏成功!

感谢您的打赏,如若您也想被打赏,可前往 发表专栏 哦~

举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

审核成功

发布时间设置
发布时间:
是否关联周任务-专栏模块

审核失败

失败原因
备注
拼手气红包 红包规则
祝福语
恭喜发财,大吉大利!
红包金额
红包最小金额不能低于5元
红包数量
红包数量范围10~50个
余额支付
当前余额:
可前往问答、专栏板块获取收益 去获取
取 消 确 定

小包子的红包

恭喜发财,大吉大利

已领取20/40,共1.6元 红包规则

    易百纳技术社区