Android LinearLayout布局切换动画实现:数据为空时的布局替换需求
解决LinearLayout数据为空时的平移动画问题
我帮你完善并优化这个需求的实现方案,先直接上可用代码,再拆解关键细节:
核心实现(补间动画版)
// 初始化控件 LinearLayout l1 = findViewById(R.id.lnrlgn); LinearLayout l2 = findViewById(R.id.lnrlgn1); // 假设dataForL1是你从服务器获取的L1对应的数据源 if (dataForL1 == null || dataForL1.isEmpty()) { // 用GONE而非INVISIBLE,让L1彻底不占用布局空间 l1.setVisibility(View.GONE); // 必须等View测量完成后再获取高度,否则会得到0 l2.post(() -> { int moveUpDistance = l1.getHeight(); // 创建平移动画:X轴保持不动,Y轴向上移动L1的高度 TranslateAnimation animate = new TranslateAnimation( 0, // X轴起始偏移量 0, // X轴结束偏移量 0, // Y轴起始偏移量(当前位置) -moveUpDistance // Y轴结束偏移量(向上移动L1的高度) ); animate.setDuration(300); // 300ms是比较自然的过渡时长 animate.setFillAfter(true); // 关键!动画结束后保持最终位置,不会回弹 l2.startAnimation(animate); }); }
更推荐的属性动画版(避免点击区域异常)
补间动画只是改变View的绘制位置,实际布局坐标没变化,可能导致点击L2新位置时无响应。属性动画会真正修改View的位置属性,更稳定:
// 初始化控件 LinearLayout l1 = findViewById(R.id.lnrlgn); LinearLayout l2 = findViewById(R.id.lnrlgn1); if (dataForL1 == null || dataForL1.isEmpty()) { l1.setVisibility(View.GONE); l2.post(() -> { int moveUpDistance = l1.getHeight(); // 直接修改translationY属性,真正改变View的布局位置 ObjectAnimator animator = ObjectAnimator.ofFloat(l2, "translationY", 0, -moveUpDistance); animator.setDuration(300); animator.start(); }); }
几个关键注意事项
- 数据为空的判断逻辑:你原来写的
l1.isEmpty是错误的,要判断的是从服务器拿到的数据源是否为空,比如dataForL1 == null || dataForL1.isEmpty() - View高度的正确获取:在
onCreate里直接调用getHeight()会返回0,因为View还没完成测量布局,用post()把逻辑放到View绘制完成后执行就能解决这个问题 - 动画保持的关键设置:补间动画必须加
setFillAfter(true),否则动画结束后L2会弹回原位置;属性动画不需要这个设置,因为它直接修改了View的属性值
内容的提问来源于stack exchange,提问作者user9427911
相关产品推荐
相关产品推荐

