You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

HarmonyOS中Android setWindowAnimations方法的替代方案及Dialog窗口缩放动画实现

在HarmonyOS中为CommonDialog添加缩放动画的两种实现方式

我明白你在HarmonyOS里找类似Android setWindowAnimations 方法的困惑,确实HarmonyOS没有直接对应的API,但我们可以通过两种方式实现你要的从0到1的缩放动画效果:


方法一:通过自定义样式+动画资源实现(类似Android的思路)

这种方式和Android的实现逻辑最接近,通过定义动画资源和Dialog样式绑定动画:

1. 创建动画资源文件

在项目 resources/base/anim 目录下(没有的话直接新建),分别创建进入和退出动画的XML文件:

scale_enter.xml(对应你需要的进入缩放效果):

<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:ohos="http://schemas.huawei.com/res/ohos"
       ohos:duration="75"
       ohos:fromXScale="0.0"
       ohos:fromYScale="0.0"
       ohos:toXScale="1.0"
       ohos:toYScale="1.0"
       ohos:pivotX="50%"
       ohos:pivotY="50%"
       ohos:interpolator="accelerate_decelerate"/>

scale_exit.xml(可选,对应退出时的缩放消失效果):

<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:ohos="http://schemas.huawei.com/res/ohos"
       ohos:duration="75"
       ohos:fromXScale="1.0"
       ohos:fromYScale="1.0"
       ohos:toXScale="0.0"
       ohos:toYScale="0.0"
       ohos:pivotX="50%"
       ohos:pivotY="50%"
       ohos:interpolator="accelerate_decelerate"/>

2. 创建Dialog自定义样式

resources/base/values/styles.xml 中添加自定义样式,绑定刚才的动画资源:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <style name="CustomDialogAnimation">
        <item name="windowEnterAnimation">anim/scale_enter</item>
        <item name="windowExitAnimation">anim/scale_exit</item>
    </style>
</resources>

3. 在代码中应用样式到CommonDialog

创建CommonDialog时,直接设置这个自定义样式即可:

CommonDialog commonDialog = new CommonDialog(getContext());
// 绑定自定义动画样式
commonDialog.setStyle(ResourceTable.Style_CustomDialogAnimation);
// 后续设置Dialog内容、按钮等逻辑
commonDialog.setTitleText("自定义动画Dialog")
            .setContentText("这是带有缩放动画的Dialog")
            .setPositiveButtonText("确定")
            .setNegativeButtonText("取消")
            .show();

方法二:通过属性动画直接操作Dialog组件(纯代码实现)

如果不想依赖XML资源,也可以直接通过代码给Dialog的根组件添加属性动画:

CommonDialog commonDialog = new CommonDialog(getContext());
// 设置Dialog基础内容
commonDialog.setTitleText("代码实现动画Dialog")
            .setContentText("这是用属性动画实现的缩放效果");

// 获取Dialog的根布局组件
Component rootView = commonDialog.getWindow().getDecorComponent();

// 创建X轴和Y轴的缩放动画
ObjectAnimator scaleXAnimator = ObjectAnimator.ofFloat(rootView, "scaleX", 0f, 1f);
ObjectAnimator scaleYAnimator = ObjectAnimator.ofFloat(rootView, "scaleY", 0f, 1f);

// 设置动画时长(对应你要的75ms)
scaleXAnimator.setDuration(75);
scaleYAnimator.setDuration(75);

// 组合两个动画,让它们同时执行
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(scaleXAnimator, scaleYAnimator);

// 在Dialog显示后启动动画
commonDialog.show();
animatorSet.start();

// 可选:添加退出动画,监听Dialog关闭事件
commonDialog.setDialogDismissListener(dialog -> {
    ObjectAnimator exitScaleX = ObjectAnimator.ofFloat(rootView, "scaleX", 1f, 0f);
    ObjectAnimator exitScaleY = ObjectAnimator.ofFloat(rootView, "scaleY", 1f, 0f);
    exitScaleX.setDuration(75);
    exitScaleY.setDuration(75);
    AnimatorSet exitSet = new AnimatorSet();
    exitSet.playTogether(exitScaleX, exitScaleY);
    exitSet.start();
});

小提示

  • 动画时长单位是毫秒,你提到的duration="75"对应代码里的75ms,注意不要写错。
  • 方法一中的样式资源路径要确保正确,IDE会自动生成ResourceTable中的引用,不用手动拼写。
  • 方法二中如果getDecorComponent()获取根组件失败,可以尝试用commonDialog.getContentLayout().getComponentParent()替代。

内容的提问来源于stack exchange,提问作者alpesh kaushal

火山引擎 最新活动