Android SegmentView

5559 ワード

Android Segment
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