虽然标题是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即可