You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android:如何同时结合并行与串行方式为多视图添加动画?

实现步骤与代码示例

这事儿不难,咱们分步骤来搞定就行~核心思路是先给View A做组合动画,等它结束后立刻触发View B、C的透明度动画,同时调用自定义复选框D的带动画方法。

1. 准备工作:初始化视图与常量

先把预设高度转成像素值(避免适配问题),并给所有视图设置初始状态:

// 预设高度(以200dp为例,需转成像素值)
private static final int CONSTANT_HEIGHT_DP = 200;
private int CONSTANT_HEIGHT_PX;

private View viewA, viewB, viewC;
private CustomCheckBox viewD; // 你的自定义复选框实例

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.your_layout);
    
    // 把dp转成当前设备的像素值
    CONSTANT_HEIGHT_PX = (int) TypedValue.applyDimension(
        TypedValue.COMPLEX_UNIT_DIP,
        CONSTANT_HEIGHT_DP,
        getResources().getDisplayMetrics()
    );
    
    // 获取视图实例
    viewA = findViewById(R.id.view_a);
    viewB = findViewById(R.id.view_b);
    viewC = findViewById(R.id.view_c);
    viewD = findViewById(R.id.view_d);
    
    // 设置初始状态:View A高度为0、透明度0;B、C透明度0
    ViewGroup.LayoutParams aParams = viewA.getLayoutParams();
    aParams.height = 0;
    viewA.setLayoutParams(aParams);
    viewA.setAlpha(0f);
    viewB.setAlpha(0f);
    viewC.setAlpha(0f);
}

2. 实现View A的组合动画

用AnimatorSet把高度动画和透明度动画绑定在一起,同时设置结束监听器来触发后续操作:

private void startAnimationSequence() {
    // 高度动画:从0到预设高度
    ValueAnimator heightAnimator = ValueAnimator.ofInt(0, CONSTANT_HEIGHT_PX);
    heightAnimator.addUpdateListener(animation -> {
        int currentHeight = (int) animation.getAnimatedValue();
        ViewGroup.LayoutParams params = viewA.getLayoutParams();
        params.height = currentHeight;
        viewA.setLayoutParams(params);
    });
    
    // 透明度动画:从0到1
    ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(viewA, "alpha", 0f, 1f);
    
    // 组合两个动画,同时执行
    AnimatorSet animatorSetA = new AnimatorSet();
    animatorSetA.playTogether(heightAnimator, alphaAnimator);
    animatorSetA.setDuration(300); // 动画时长可按需调整,比如300ms
    
    // 监听动画结束,触发后续操作
    animatorSetA.addListener(new Animator.AnimatorListener() {
        @Override
        public void onAnimationStart(Animator animation) {}
        
        @Override
        public void onAnimationEnd(Animator animation) {
            // A的动画结束后,立刻执行B、C和D的操作
            startPostAAnimations();
        }
        
        @Override
        public void onAnimationCancel(Animator animation) {}
        
        @Override
        public void onAnimationRepeat(Animator animation) {}
    });
    
    // 启动View A的动画
    animatorSetA.start();
}

3. 处理动画A结束后的后续操作

在这个方法里完成View B、C的透明度动画,同时调用自定义复选框的带动画方法:

private void startPostAAnimations() {
    // View B的透明度动画
    ObjectAnimator alphaAnimB = ObjectAnimator.ofFloat(viewB, "alpha", 0f, 1f);
    // View C的透明度动画
    ObjectAnimator alphaAnimC = ObjectAnimator.ofFloat(viewC, "alpha", 0f, 1f);
    
    // 组合B、C的动画,同时执行
    AnimatorSet animatorSetBC = new AnimatorSet();
    animatorSetBC.playTogether(alphaAnimB, alphaAnimC);
    animatorSetBC.setDuration(200); // 时长按需调整
    
    // 启动B、C的动画
    animatorSetBC.start();
    
    // 调用自定义复选框的setChecked方法,开启动画
    // 这里的checked值根据你的业务需求设置,比如设为true
    viewD.setChecked(true, true);
}

4. 触发整个动画序列

最后在需要的时机(比如按钮点击、页面加载完成)调用startAnimationSequence()就行:

// 示例:按钮点击触发动画
findViewById(R.id.trigger_btn).setOnClickListener(v -> startAnimationSequence());

小提示

  • 如果View A是ConstraintLayout这类布局,高度设置可能需要用ConstraintSet调整,但上面的代码对大多数View都适用。
  • 动画时长可以根据UI风格微调,让过渡更自然。
  • 自定义复选框的setChecked方法默认在主线程执行,这里的调用时机没问题。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:47:23