仿照Ios segmentView效果的實現(xiàn)

直接上效果圖片
圖片效果1
圖片效果二
實現(xiàn)思路

通過自定義view 繼承至RadioGroup,通過RadioGroup的監(jiān)聽事件个少,來達到選項切換的效果。

    setOrientation(LinearLayout.HORIZONTAL); //設(shè)置橫向排列
       line.setBounds(0, 0, 1, line.getMinimumHeight()); //設(shè)置分割線
       if (null != attrs) {
           TypedArray typedArray = mContext.obtainStyledAttributes(attrs, R.styleable.SegmentView);
           //設(shè)置選項的個數(shù)
           number = typedArray.getInt(R.styleable.SegmentView_sv_number, DEFAULT_NUM);
           //文字的大小
           textSize = typedArray.getInt(R.styleable.SegmentView_text_size, 16);
           initTextView(number);
           typedArray.recycle();
       }
       //注冊監(jiān)聽事件
       setOnCheckedChangeListener(this);

初始化視圖

 private void initTextView(int number) {
        if (number <= 0)
            return;

        setBackgroundResource(R.drawable.shape_guide_corner20_gray);
        radioButtons = new RadioButton[number];
        titles = new String[number];

        //不同狀態(tài)下的按鈕顯示不同的顏色
        ColorStateList csl = getResources().getColorStateList(R.color.selector_segment_color_tab);
        RadioButton radioButton;
        //實現(xiàn)中間部分的textview潭辈,兩邊都是圓角
        for (int i = 0; i < number; i++) {
            radioButton = new RadioButton(mContext);
            radioButton.setId(START_ID + i);
            // 設(shè)置textview的布局寬高并設(shè)置為weight屬性都為1
            radioButton.setLayoutParams(new LayoutParams(dip2px(mContext, 90),
                    LayoutParams.MATCH_PARENT, 1));

            radioButton.setBackgroundResource(R.drawable.selector_tv_corner20_guid);
            radioButton.setCompoundDrawables(null, null, line, null);
            radioButton.setTextColor(csl);
            radioButton.setText(titles[i]);
            radioButton.setGravity(Gravity.CENTER);
            radioButton.setPadding(0, 12, 0, 12);
            radioButton.setButtonDrawable(null);
            setSegmentTextSize(radioButton, textSize);
            radioButtons[i] = radioButton;
        }
        //處理最后一個radiobutton线罕,去掉右邊的線
        radioButtons[number - 1].setCompoundDrawables(null, null, null, null);
        // 加入textview
        this.removeAllViews();
        for (RadioButton rb : radioButtons) {
            this.addView(rb);
        }
        this.invalidate();//重新draw()

        //有時候會出現(xiàn)點擊了一次,再點擊其他的時候總是會出現(xiàn)兩個
        if (number > 1) {
            radioButtons[1].setChecked(true);
        }
        radioButtons[0].setChecked(true);

    }

在監(jiān)聽事件中般哼,每一次切狀態(tài)的時候吴汪,將所有的按鈕都恢復(fù)為未選中的狀態(tài)

   @Override
    public void onCheckedChanged(RadioGroup radioGroup, int checkId) {
        int index = checkId - START_ID; //當(dāng)前選中的按鈕序號
        if (null == radioButtons || number <= index)
            return;
        for (RadioButton button : radioButtons) { //恢復(fù)為默認的狀態(tài)
            button.setCompoundDrawables(null, null, line, null);
        }
        if (index > 0) {
            radioButtons[index - 1].setCompoundDrawables(null, null, null, null);
        }
        radioButtons[index].setCompoundDrawables(null, null, null, null);
        lastCheckIndex = index;
        //最后一個需要將右邊的分割線去掉
        radioButtons[number - 1].setCompoundDrawables(null, null, null, null);

        if (null != segmentListener) { //處理自定義接口事件
            segmentListener.onSegmentViewClick(this, index);
        }
    }

在按鈕選項狀態(tài)發(fā)生變化的時候,觸發(fā)自定義的一個接口

    // 定義一個接口接收點擊事件
    public interface onSegmentViewClickListener {
        public void onSegmentViewClick(View view, int postion);
    }

    public void setOnSegmentViewClickListener(onSegmentViewClickListener segmentListener) {
        this.segmentListener = segmentListener;
    }

最后附上完整的代碼鏈接完整項目demo

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蒸眠,一起剝皮案震驚了整個濱河市漾橙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌楞卡,老刑警劉巖霜运,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蒋腮,居然都是意外死亡淘捡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門池摧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來焦除,“玉大人,你說我怎么就攤上這事作彤”炱牵” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵竭讳,是天一觀的道長儡炼。 經(jīng)常有香客問我逢艘,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任驶拱,我火速辦了婚禮客蹋,結(jié)果婚禮上昨登,老公的妹妹穿的比我還像新娘壮虫。我一直安慰自己,他們只是感情好思瘟,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布荸百。 她就那樣靜靜地躺著,像睡著了一般滨攻。 火紅的嫁衣襯著肌膚如雪够话。 梳的紋絲不亂的頭發(fā)上蓝翰,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機與錄音女嘲,去河邊找鬼畜份。 笑死,一個胖子當(dāng)著我的面吹牛欣尼,可吹牛的內(nèi)容都是我干的爆雹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼愕鼓,長吁一口氣:“原來是場噩夢啊……” “哼钙态!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起菇晃,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤册倒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后磺送,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體驻子,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年估灿,在試婚紗的時候發(fā)現(xiàn)自己被綠了崇呵。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡馅袁,死狀恐怖域慷,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情司顿,我是刑警寧澤芒粹,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布兄纺,位于F島的核電站大溜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏估脆。R本人自食惡果不足惜钦奋,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望疙赠。 院中可真熱鬧付材,春花似錦、人聲如沸圃阳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捍岳。三九已至富寿,卻和暖如春睬隶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背页徐。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工苏潜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人变勇。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓恤左,卻偏偏與公主長得像,于是被迫代替她去往敵國和親搀绣。 傳聞我的和親對象是個殘疾皇子飞袋,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容