Android SegmentView
5559 ワード
Android Segment
IOS開発では使いやすいコントロールSegmentControlがあり、Androidでは同じ機能を実現するには自分で手動で行う必要があり、パッケージされた機能に似たコントロールがあればいいという考えに基づいてAndroid版のSegmentViewを実現しました.コードは比較的簡単で、1つのLinearLayoutの下で各Segment Itemを動的に生成し、RoundRectShapeを通じてフィレットマトリクスの背景を描きます.一番左と右のItemの背景には特殊な処理(フィレットあり)が必要です.具体的なコードは以下の通りです(一番左、一番右、左の類似).
ここでradiusBufferは、角丸長方形の各角の半径を設定するために使用されます.
ItemはSegmentに追加する要素を表し、ItemViewはデフォルトの要素Viewであり、CustomViewはユーザー定義のView要素である.CustomViewが設定されている場合、ItemViewは機能せず、ItemViewも不活性に初期化されます.CustomViewが設定されている場合、ItemViewはスペースを消費しません.
全体のコードは行かないで、必要があればgitにダウンロードすることができますhttps://github.com/belows/SegmentDemo
IOS開発では使いやすいコントロールSegmentControlがあり、Androidでは同じ機能を実現するには自分で手動で行う必要があり、パッケージされた機能に似たコントロールがあればいいという考えに基づいてAndroid版のSegmentViewを実現しました.コードは比較的簡単で、1つの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