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