实现多行多列的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
- 实现多行多列的RadioButton同时自由调整每行显示数量和上下间距
- Android-CheckBox和RadioButton调整间距(有坑,注意)
- 文字位于RadioButton后,如何调整间距?
- 调整字符和单词间的间距
- 两个textarea文本框上下间距调整及inline-block间距
- radiobutton 选择框和文字间距的设置方法
- vc窗口自由调整大小的实现
- 实现sinx和直线的同时显示
- magento修改列表页每行显示数量
- ListView+radioButton实现每行单选
- 应用ArrayAdapter和ListView实现简单的上下滚动显示
- Eclipse 调整每行的字数
- engine中调整Element的上下显示顺序(遮盖)
- engine中调整Element的上下显示顺序(遮盖)
- Echarts 如何调整 legend 和图表的间距
- android textView调整字体的间距和行间距
- myeclipse中调整一行显示的字符数量
- RadioGroup和RadioButton的实现
- 顺序表应用6:有序顺序表查询
- 第12个python程序:提示输入
- 通过函数实现程序内敛
- (11)Struts2_result概述
- 基于SignalR的小型IM系统
- 实现多行多列的RadioButton同时自由调整每行显示数量和上下间距
- ORA-56705: I/O calibration already in progress的解决方法
- HTML 5 属性
- Cassandra 故障探测原理--Accrual Failure Detector
- 堆排序
- 虚拟机 Kali的网络连不上?
- 封装HTTPRequestSerializer 的知识(一)
- 关于HBase协处理器导致问题的研究
- 使用 AngularJS 的路由和模板实现单页应用 (Single Page)