实现LineLayout布局的动画收缩


虽然标题是LineLayout布局,但其实也能通用的修改任何布局。


首先由于LineLayout布局有layout_weight属性,我们就通过动画来实现对layout_weight的动态修改

public void changeLinearLayoutWeightAnimatorStart(final LinearLayout linearLayout, final float startWeight, final float endWeight) {
        if (linearLayout != null && startWeight >= 0 && endWeight >= 0) {
            ValueAnimator animator = ValueAnimator.ofFloat(startWeight, endWeight);
            if (startWeight > endWeight) {
                tabPosition_record = tlMenu.getSelectedTabPosition();
                scrollX_record = tlMenu.getScrollX();
            }
            animator.addUpdateListener(animation -> {
                LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) linearLayout.getLayoutParams();
                params.weight = (float) animation.getAnimatedValue();
                linearLayout.setLayoutParams(params);
                if (params.weight == endWeight) {
                    //动画结束后手动设置位置,否则恢复到第一个tab
                    vpMenu.setCurrentItem(tabPosition_record);
                    tlMenu.selectTab(tlMenu.getTabAt(tabPosition_record));
                    tlMenu.smoothScrollTo(scrollX_record, 0);
                }
            });
            animator.start();
        }
    }


startweight和endweight也可以传入其他比如起始高度,最终高度之类的值,也能同样实现布局修改

startWeight > endWeight  这里主要记录的是tablayout滑动前的状态

 params.weight == endWeight  这里主要对滑动完成后tablayout和viewpager的状态进行还原



*******注意点

1.由于tablayout和viewpager进行布局缩放的过程中,会重置当前选择的position,为了还原到缩放之前的状态,必须要在缩放前进行记录,在缩放后还原,其他布局不受此影响

2.因为weight为Linelayout独有,所以使用LinearLayout.LayoutParams

如果只是修改宽高,可以使用viewgroup.LayoutParams即可