实现多行多列的RadioButton同时自由调整每行显示数量和上下间距

来源:互联网 发布:linux file命令 编辑:程序博客网 时间:2024/06/11 05:53

在网上找了几个方法都不是特别好用,所以自己根据:http://www.cnblogs.com/atskyline/p/3457742.html

效果图:


稍微扩展了一下这里贴下代码方便大家使用:

import android.content.Context;import android.util.AttributeSet;import android.util.Log;import android.view.View;import android.widget.RadioGroup;/** * 多行多列的RadioGroup */public class MyRadioGroup extends RadioGroup {private final String TAG = MyRadioGroup.class.getSimpleName();private boolean isSingleColumn = true;private int mColumnNumber = 2;// 这里是一行显示的RadioButton的数量默认为2.private int mMaxWidth;// 所有RadioGroup的最大宽度。private int mEveryColumnWidth;// 指的是每个RadioButton的最大宽度。就是横着的长度除以每行显示的数量,得到的结果。private int mMaxColumnHeight = -1;// RadioButton中最高的高度。默认为setColumnHeight中的值,但是如果实际高度大于预设值则变为最大高度。private int[] mEveryColumnMaxWidth;// 每一列当中最长的宽度值,主要用于使一列的RadioButton的开始位置相同,看起来整齐。public void setColumnHeight(int px) {mMaxColumnHeight = px;}public void setColumnNumber(int columnNumber) {this.mColumnNumber = columnNumber;}public void setSingleColumn(boolean isSingleColumn) {this.isSingleColumn = isSingleColumn;}public MyRadioGroup(Context context) {super(context);}public MyRadioGroup(Context context, AttributeSet attrs) {super(context, attrs);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {if (isSingleColumn) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);} else {mEveryColumnMaxWidth = new int[mColumnNumber];mMaxWidth = MeasureSpec.getSize(widthMeasureSpec);mEveryColumnWidth = mMaxWidth / mColumnNumber;Log.i(TAG, "everyColumnWidth:" + mEveryColumnWidth + " maxWidth:"+ mMaxWidth + " columnNumber:" + mColumnNumber);int childCount = getChildCount();int y = 0;int row = 0;for (int index = 0; index < childCount; index++) {final View child = getChildAt(index);if (child.getVisibility() != View.GONE) {child.measure(MeasureSpec.UNSPECIFIED,MeasureSpec.UNSPECIFIED);int height = child.getMeasuredHeight();// 计算单个RadioButton的宽高。int width = child.getMeasuredWidth();if (height < mMaxColumnHeight) {height = mMaxColumnHeight;}int columnNumber = index % mColumnNumber;// 这里是计算这个位置是属于第几列,从0开始。if (mEveryColumnMaxWidth[columnNumber] < width) {mEveryColumnMaxWidth[columnNumber] = width;}if (index > 0 && columnNumber == 0) {row++;// 当到达了第0列的时候行数增加1.}y = row * height + height;}}// 设置RadioGroup所需的宽度和高度setMeasuredDimension(mMaxWidth, y);}}@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {if (isSingleColumn) {super.onLayout(changed, l, t, r, b);} else {final int childCount = getChildCount();int x = 0;int y = 0;int row = 0;for (int i = 0; i < childCount; i++) {final View child = this.getChildAt(i);if (child.getVisibility() != View.GONE) {int width = child.getMeasuredWidth();int height = child.getMeasuredHeight();int columnIndex = i % mColumnNumber;// 这里x的位置代表了RadioButton的起始X轴的位置。// 计算方法为用平均下来的每个RadioButton的最大宽度,// 减去这一列最长的RadioButton的宽度然后除以2// 然后加上相应的列数加成。// 策略就是最长的处于中间。//如果需要调整RadioButton的左右距离,请调整此处x值即可。x = (mEveryColumnWidth - mEveryColumnMaxWidth[columnIndex])/ 2 + columnIndex * mEveryColumnWidth;if (i > 0 && columnIndex == 0) {row++;}// 高度的方法类似。不过需要注意,这里不是以文字为对齐,而是以左侧的RadioButton的单选框对齐。请注意。y = row * mMaxColumnHeight + (mMaxColumnHeight - height)/ 2;child.layout(x, y, x + width, y + height);}}}}}

使用方法:

private MyRadioGroup mRG;mRG.setSingleColumn(false);mRG.setColumnNumber(2);mRG.setColumnHeight(getResources().getDimensionPixelSize(R.dimen.radio_button_of_height));


0 0
原创粉丝点击