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
相关产品推荐
相关产品推荐

