Android Segment
在IOS开发中有一个很好用的控件SegmentControl,而在Android要实现相同的功能就需要自己手动完成,如果能有一个已经封装好了的功能类似的控件就好了,基于这个想法,自己实现了一个Android版的SegmentView。
代码比较简单,就是在一个LinearLayout下动态的生成各个Segment Item,通过RoundRectShape画好圆角矩阵背景。最左边和右边的Item的背景需要特殊处理(有圆角),具体代码如下(最左边的,最右边的和左边的类似):
int selected = android.R.attr.state_selected;
float[] radiusBuffer = new float[]{mRadius, mRadius, 0, 0, 0, 0, mRadius, mRadius};
RoundRectShape shape = new RoundRectShape(radiusBuffer, null, null);
ShapeDrawable selectedDrawable = new ShapeDrawable(shape);
selectedDrawable.getPaint().setAntiAlias(true);
selectedDrawable.getPaint().setColor(mSelectedColor);
ShapeDrawable normalDrawable = new ShapeDrawable(shape);
normalDrawable.getPaint().setAntiAlias(true);
normalDrawable.getPaint().setColor(mColor);
mLeftDrawable = new StateListDrawable();
mLeftDrawable.addState(new int[]{selected}, selectedDrawable);
mLeftDrawable.addState(new int[]{-selected}, normalDrawable);
其中的radiusBuffer是用来设定圆角矩形的各个角的半径的。
public class Item {
private View mCustomView;
private ItemView mItemView;
private Context mContext;
private ColorStateList mTextColorList;
private void initColorList() {
int selected = android.R.attr.state_selected;
mTextColorList = new ColorStateList(new int[][]{{selected}, {-selected}}, new int[]{mSelectedTextColor, mTextColor});
}
private LayoutParams newLayoutParams() {
LayoutParams lp = new LayoutParams(0, ViewGroup.LayoutParams.MATCH_PARENT);
lp.weight = 1;
return lp;
}
private void checkItemView() {
if (mItemView == null) {
mItemView = new ItemView(mContext);
if (mTextColorList == null) {
initColorList();
}
mItemView.mTextView.setTextColor(mTextColorList);
mItemView.mTextView.setTextSize(mTextSize);
mItemView.setLayoutParams(newLayoutParams());
}
}
public Item(Context context) {
mContext = context;
}
public Item setCustomView(View customView) {
mCustomView = customView;
mCustomView.setLayoutParams(newLayoutParams());
return this;
}
public Item setIcon(int drawableId) {
checkItemView();
mItemView.mIconView.setImageResource(drawableId);
return this;
}
public Item setText(int strId) {
checkItemView();
mItemView.mTextView.setText(strId);
return this;
}
public Item setText(String str) {
checkItemView();
mItemView.mTextView.setText(str);
return this;
}
}
Item表示将要添加到Segment上的元素,其中ItemView是默认的元素View而CustomView则是用户自定义的View元素。如果设置了CustomView则ItemView不会起作用,而ItemView也是惰性初始化的,如果设置CustomView,那么ItemView并不会占用空间。
整体代码就不上了,如果有需要可以到git上去下载
https://github.com/belows/SegmentDemo
本文介绍了一种在Android中模仿iOS的SegmentControl功能的方法。作者创建了一个名为SegmentView的自定义视图,可以在LinearLayout中动态生成多个具有圆角背景的SegmentItem。文中详细解释了如何为这些项设置不同的状态颜色和圆角。

1345

被折叠的 条评论
为什么被折叠?



