开篇
很久没有更新博客了。本篇给同学们分享一个简单的超级好用的均分布局,提升你的开发效率。
场景
在日常开发中会经常用到均分布局,而我们通常的做法是用LinearLayout
和android:layout_weight
配合完成。但是有时候,child
并不需要占用1
个比重,这时候为了满足android:layout_weight
居中,不得不给child
再包一层父类。而此控件就是为了解决这个问题因运而生!当然,通过ConstraintLayout
经过复杂的约束也能达到这个效果,只是AverageLayout
比ConstraintLayout
更简洁方便。
效果截屏
立即体验
扫描以下二维码下载体验App(从0.2.3
版本开始,体验App内嵌版本更新检测功能):
JSCKit库传送门:https://github.com/JustinRoom/JSCKit
简析源码
public class AverageLayout extends ViewGroup implements IViewAttrDelegate{}
- 1、测量
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int childCount = getChildCount();
if (childCount > 0){
measureChildren(widthMeasureSpec, heightMeasureSpec);
LayoutParams params = getLayoutParams();
int width = 0;
int height = 0;
switch (orientation){
case HORIZONTAL:
width = getPaddingLeft() + getPaddingRight();
for (int i = 0; i < childCount; i++) {
View child = getChildAt(i);
width += child.getMeasuredWidth();
height = Math.max(height, child.getMeasuredHeight());
}
height = height + getPaddingTop() + getPaddingBottom();
if (params.width == LayoutParams.WRAP_CONTENT){
widthMeasureSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY);
}
if (params.height == LayoutParams.WRAP_CONTENT){
heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
}
break;
case VERTICAL:
height = getPaddingTop() + getPaddingBottom();
for (int i = 0; i < childCount; i++) {
View child = getChildAt(i);
height += child.getMeasuredHeight();
width = Math.max(width, child.getMeasuredWidth());
}
width = width + getPaddingLeft() + getPaddingRight();
if (params.height == LayoutParams.WRAP_CONTENT){
heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);
}
if (params.width == LayoutParams.WRAP_CONTENT){
widthMeasureSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY);
}
break;
}
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
- 2、放置
protected void onLayout(boolean changed, int l, int t, int r, int b)
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
int childCount = getChildCount();
int width = getMeasuredWidth();
int height = getMeasuredHeight();
int left = 0;
int top = 0;
if (childCount > 0){
switch (orientation){
case HORIZONTAL:
int avWidth = (width - getPaddingLeft() - getPaddingRight()) / childCount;
for (int i = 0; i < childCount; i++) {
View child = getChildAt(i);
left = getPaddingLeft() + i * avWidth + (avWidth - child.getMeasuredWidth()) / 2;
top = (height - child.getMeasuredHeight()) / 2;
child.layout(left, top, left + child.getMeasuredWidth(), top + child.getMeasuredHeight());
}
break;
case VERTICAL:
int avHeight = (height - getPaddingTop() - getPaddingBottom()) / childCount;
for (int i = 0; i < childCount; i++) {
View child = getChildAt(i);
left = (width - child.getMeasuredWidth()) / 2;
top = getPaddingTop() + i * avHeight + (avHeight - child.getMeasuredHeight()) / 2;
child.layout(left, top, left + child.getMeasuredWidth(), top + child.getMeasuredHeight());
}
break;
}
}
}
使用示例
<jsc.kit.component.widget.AverageLayout
android:id="@+id/average_layout"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal"
android:background="#f2f"
app:orientation="horizontal">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/main_mid_show_left_camera" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/main_mid_show_left_share" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/main_mid_show_left_yx" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/main_icon_create" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/main_mid_show_left_fullscreen" />
</jsc.kit.component.widget.AverageLayout>
其他的不多说了,请自行安装体验app体验,用过才会知道它的好👌。
😊童鞋们,如果你们觉得不错的话给我点个💗吧,谢谢!!!
篇尾
Wechat:eoy9527
。
在人生的道路上,当你的希望一个个落空的时候,你也要坚定,要沉着。 —— 朗费罗
网友评论