Created
January 5, 2016 17:35
-
-
Save NeoLSN/1b1262425ca6312a0588 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.hitachi.smartac.widget; | |
import android.content.Context; | |
import android.util.AttributeSet; | |
import android.view.View; | |
import android.view.ViewGroup; | |
import android.widget.LinearLayout; | |
import android.widget.RadioGroup; | |
/** | |
* Created by JasonYang on 2016/1/5. | |
*/ | |
public class FlowRadioGroup extends RadioGroup { | |
private int line_height; | |
public static class LayoutParams extends LinearLayout.LayoutParams { | |
public final int horizontal_spacing; | |
public final int vertical_spacing; | |
/** | |
* @param horizontal_spacing Pixels between items, horizontally | |
* @param vertical_spacing Pixels between items, vertically | |
*/ | |
public LayoutParams(int horizontal_spacing, int vertical_spacing) { | |
super(0, 0); | |
this.horizontal_spacing = horizontal_spacing; | |
this.vertical_spacing = vertical_spacing; | |
} | |
} | |
public FlowRadioGroup(Context context) { | |
super(context); | |
} | |
public FlowRadioGroup(Context context, AttributeSet attrs) { | |
super(context, attrs); | |
} | |
@Override | |
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { | |
// assert (MeasureSpec.getMode(widthMeasureSpec) != MeasureSpec.UNSPECIFIED); | |
final int width = MeasureSpec.getSize(widthMeasureSpec) - getPaddingLeft() - getPaddingRight(); | |
int height = MeasureSpec.getSize(heightMeasureSpec) - getPaddingTop() - getPaddingBottom(); | |
final int count = getChildCount(); | |
int line_height = 0; | |
int xpos = getPaddingLeft(); | |
int ypos = getPaddingTop(); | |
int childHeightMeasureSpec; | |
if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST) { | |
childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.AT_MOST); | |
} else { | |
childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); | |
} | |
for (int i = 0; i < count; i++) { | |
final View child = getChildAt(i); | |
if (child.getVisibility() != GONE) { | |
final LayoutParams lp = (LayoutParams) child.getLayoutParams(); | |
child.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.AT_MOST), childHeightMeasureSpec); | |
final int childw = child.getMeasuredWidth(); | |
line_height = Math.max(line_height, child.getMeasuredHeight() + lp.vertical_spacing); | |
if (xpos + childw > width) { | |
xpos = getPaddingLeft(); | |
ypos += line_height; | |
} | |
xpos += childw + lp.horizontal_spacing; | |
} | |
} | |
this.line_height = line_height; | |
if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.UNSPECIFIED) { | |
height = ypos + line_height; | |
} else if (MeasureSpec.getMode(heightMeasureSpec) == MeasureSpec.AT_MOST) { | |
if (ypos + line_height < height) { | |
height = ypos + line_height; | |
} | |
} | |
setMeasuredDimension(width, height); | |
} | |
@Override | |
protected LinearLayout.LayoutParams generateDefaultLayoutParams() { | |
return new FlowRadioGroup.LayoutParams(1, 1); // default of 1px spacing | |
} | |
@Override | |
protected boolean checkLayoutParams(ViewGroup.LayoutParams p) { | |
return p instanceof LayoutParams; | |
} | |
@Override | |
protected void onLayout(boolean changed, int l, int t, int r, int b) { | |
final int count = getChildCount(); | |
final int width = r - l; | |
int xpos = getPaddingLeft(); | |
int ypos = getPaddingTop(); | |
for (int i = 0; i < count; i++) { | |
final View child = getChildAt(i); | |
if (child.getVisibility() != GONE) { | |
final int childw = child.getMeasuredWidth(); | |
final int childh = child.getMeasuredHeight(); | |
final LayoutParams lp = (LayoutParams) child.getLayoutParams(); | |
if (xpos + childw > width) { | |
xpos = getPaddingLeft(); | |
ypos += line_height; | |
} | |
child.layout(xpos, ypos, xpos + childw, ypos + childh); | |
xpos += childw + lp.horizontal_spacing; | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
參考來源:
http://www.cnblogs.com/atskyline/p/3457742.html
https://nishantvnair.wordpress.com/2010/09/28/flowlayout-in-android/