gpt4 book ai didi

android - ScrollView 中的 FlowLayout

转载 作者:行者123 更新时间:2023-11-29 00:08:00 24 4
gpt4 key购买 nike

我正在 ScrollView 中创建流布局。现在我无法理解的问题是,如果 flowlayout 的高度小于 ScrollView (即 match_parent),我希望我的 flowlayout View 正好是 match_parent,否则高度应该是包装内容。

这是我的 onMeasure 方法。

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

int widthLimit = MeasureSpec.getSize(widthMeasureSpec) - getPaddingRight() - mHorizontalEndSpacingView;
int widthMode = MeasureSpec.getMode(widthMeasureSpec);

int heightLimit = MeasureSpec.getSize(heightMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);

boolean growHeight = widthMode != MeasureSpec.UNSPECIFIED;

int width = 0;

int currentWidth = getPaddingLeft() + mHorizontalStartSpacingView;
int currentHeight = getPaddingTop() + mVerticalStartSpacingView;

int maxChildHeight = 0;

boolean breakLine = false;
boolean newLine = false;
int spacing = 0;

final int count = getChildCount();
for (int i = 0; i < count; i++) {
View child = getChildAt(i);
measureChild(child, MeasureSpec.makeMeasureSpec(widthLimit - getPaddingLeft() - mHorizontalStartSpacingView, MeasureSpec.AT_MOST), heightMeasureSpec);

LayoutParams lp = (LayoutParams) child.getLayoutParams();
spacing = mHorizontalCenterSpacingView;

if (lp.horizontalSpacing > 0) {
spacing = lp.horizontalSpacing;
}

if (growHeight && (breakLine || ((currentWidth + child.getMeasuredWidth()) > widthLimit))) {
newLine = true;
currentHeight += maxChildHeight + mVerticalCenterSpacingView;

width = Math.max(width, currentWidth - spacing);

currentWidth = getPaddingLeft() + mHorizontalStartSpacingView;
maxChildHeight = 0;
} else {
newLine = false;
}

maxChildHeight = Math.max(maxChildHeight, child.getMeasuredHeight());

lp.x = currentWidth;
lp.y = currentHeight;

currentWidth += child.getMeasuredWidth() + spacing;

breakLine = lp.breakLine;
}

if (newLine == false) {
width = Math.max(width, currentWidth - spacing);
}

width += getPaddingRight();
int height = currentHeight + maxChildHeight + getPaddingBottom() + mVerticalEndStartSpacingView;

setMeasuredDimension(resolveSize(width, widthMeasureSpec),
resolveSize(height, heightMeasureSpec));
}

最佳答案

已修复。下面是新的 onMeasure

 @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

int widthLimit = MeasureSpec.getSize(widthMeasureSpec) - getPaddingRight() - mHorizontalEndSpacingView;
int widthMode = MeasureSpec.getMode(widthMeasureSpec);

int heightLimit = MeasureSpec.getSize(heightMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);

boolean growHeight = widthMode != MeasureSpec.UNSPECIFIED;

int width = 0;

int currentWidth = getPaddingLeft() + mHorizontalStartSpacingView;
int currentHeight = getPaddingTop() + mVerticalStartSpacingView;

int maxChildHeight = 0;

boolean breakLine = false;
boolean newLine = false;
int spacing = 0;

final int count = getChildCount();
for (int i = 0; i < count; i++) {
View child = getChildAt(i);
measureChild(child, MeasureSpec.makeMeasureSpec(widthLimit - getPaddingLeft() - mHorizontalStartSpacingView, MeasureSpec.AT_MOST), heightMeasureSpec);

LayoutParams lp = (LayoutParams) child.getLayoutParams();
spacing = mHorizontalCenterSpacingView;

if (lp.horizontalSpacing > 0) {
spacing = lp.horizontalSpacing;
}

if (growHeight && (breakLine || ((currentWidth + child.getMeasuredWidth()) > widthLimit))) {
newLine = true;
currentHeight += maxChildHeight + mVerticalCenterSpacingView;

width = Math.max(width, currentWidth - spacing);

currentWidth = getPaddingLeft() + mHorizontalStartSpacingView;

maxChildHeight = 0;
} else {
newLine = false;
}

maxChildHeight = Math.max(maxChildHeight, child.getMeasuredHeight());

lp.x = currentWidth;
lp.y = currentHeight;

currentWidth += child.getMeasuredWidth() + spacing;

breakLine = lp.breakLine;
}

if (newLine == false) {
width = Math.max(width, currentWidth - spacing);
}

width += getPaddingRight();
int height = currentHeight + maxChildHeight + getPaddingBottom() + mVerticalEndStartSpacingView;

// The Fix.
int parentViewHeight = ((ScrollView) getParent()).getHeight();
if(parentViewHeight > height) {
height = parentViewHeight;
}
// End

int finalWidth = resolveSize(width, widthMeasureSpec);
int finalHeight = resolveSize(height, heightMeasureSpec);
setMeasuredDimension(finalWidth, finalHeight);
}

关于android - ScrollView 中的 FlowLayout,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32367888/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com