IndicatorSeekBar Android自定義SeekBar,滑動時彈出氣泡指示器顯示進度

本文項目地址:https://github.com/warkiz/IndicatorSeekBar

控件使用姿勢:http://www.reibang.com/p/beb19f770e68

overview.png

之前在網(wǎng)上看到了當Slider控件在滑動時會彈出氣泡指示器,覺得很有趣,于是就進行拓展毕贼,就有了下面介紹的一個安卓控件:IndicatorSeekBar笛洛。先附上IndicatorSeekBar項目地址: GitHub: https://github.com/warkiz/IndicatorSeekBar

1:先分享給我編寫這個組件靈感的網(wǎng)址畅蹂,感謝這個網(wǎng)站讓我看到有趣的新東西:
滑動彈出氣泡的slider組件:https://material.io/guidelines/components/sliders.html#sliders-continuous-slider
附圖:

image.png

  1. 對于IndicatorSeekBar,雖然做不了和上面網(wǎng)站的一模一樣端圈,但是基本功能還是具備的焦读。先上筆者實現(xiàn)的效果圖:


    indicator_normal.gif

    indicator_custom.gif
  2. SeekBar實現(xiàn)的功能有哪些:

    • 可以自定義尺寸和顏色
    • 可以隱藏刻度
    • SeekBar選擇圓角/方角
    • 滑塊下顯示進度
    • 自定義刻度下的文字
    • 自定義滑塊的圖片
    • 自定義刻度的圖片
    • 自定義氣泡指示器
    • 支持進度監(jiān)聽
    • ......
  1. 實現(xiàn)思路: 筆者將Slider分為2大部分:上半部分的指示器和下半部分的SeekBar主體 , 如圖 :


    image.png

Part1:SeekBar主體:細分為5個小部分:

  • 背景條 track_background_bar
  • 進度條 track_progress_bar
  • 滑塊 thumb
  • 刻度 tick
  • 刻度的文字 text

Part2: 指示器:彈出PopouWindow舱权。

實現(xiàn) : 當點擊seekbar時, 彈出PopouWindow 仑嗅; 當滑動seekbar時宴倍, 不斷更新
PopouWindow 的位置张症, 達到指示器移動的效果;當點擊結(jié)束時鸵贬,將指示器的PopouWindow dismiss掉俗他。

5.主要代碼

5.1. 主體

5.1.1 背景條:使用繪制線條的方式繪制。

//繪制主體背景
mStockPaint.setStrokeWidth(p.mBackgroundTrackSize);
mStockPaint.setColor(p.mBackgroundTrackColor);
canvas.drawLine(thumbX, mTrackY, mSeekEnd, mTrackY, mStockPaint);

5.1.2 進度條:繪制同背景條阔逼。

//繪制主體進度
mStockPaint.setStrokeWidth(p.mProgressTrackSize);
canvas.drawLine(mSeekStart, mTrackY, thumbX, mTrackY, mStockPaint);

5.1.3 滑塊:繪制圓兆衅。

//繪制滑塊
canvas.drawCircle(thumbX + p.mBackgroundTrackSize / 2.0f, mTrackY, mIsTouching ? mThumbRadius : (2 * mThumbRadius / 3f), mStockPaint);

5.1.4 刻度:繪制圓或者長方形。

//繪制刻度
canvas.drawCircle(locationX, mTrackY, mTickRadius, mStockPaint);
or
canvas.drawRect(locationX - IndicatorUtils.dp2px(mContext, 1), mTrackY - rectTickHeightRange / 2.0f, locationX + IndicatorUtils.dp2px(mContext, 1), mTrackY + rectTickHeightRange / 2.0f + .5f, mStockPaint);

5.1.5 刻度文字:繪制文本嗜浮。

//繪制刻度文字
canvas.drawText(text, mTextLocationList.get(i), mPaddingTop + mThumbRadius * 2 + mRect.height() + IndicatorUtils.dp2px(mContext, 3), mTextPaint);

5.2.指示器:創(chuàng)建PopouWindow

5.2.1 創(chuàng)建

    mIndicator = new PopupWindow(mIndicatorView, WindowManager.LayoutParams.WRAP_CONTENT, WindowManager.LayoutParams.WRAP_CONTENT, false);

5.2.2 彈出

//監(jiān)聽SeekbBar的onTouch方法 羡亩;當開始點擊滑動時,彈出PopouWindow危融;
mIndicator.showAsDropDown(mSeekBar, (int) (touchX - mIndicator.getContentView().getMeasuredWidth() / 2f), -(mSeekBar.getMeasuredHeight() + mIndicator.getContentView().getMeasuredHeight() + mSeekBar.getPaddingTop() +  IndicatorUtils.dp2px(mContext, 2)));

5.2.3 更新位置

//監(jiān)聽seekbar的onTouch方法 畏铆;當滑動時,根據(jù)滑動的坐標更新PopouWindow的彈出位置吉殃;
 mIndicator.update(mSeekBar, (int) (touchX - mIndicator.getContentView().getMeasuredWidth() / 2), -(mSeekBar.getMeasuredHeight() + mIndicator.getContentView().getMeasuredHeight() + mSeekBar.getPaddingTop() +  IndicatorUtils.dp2px(mContext, 2)), -1, -1);

5.2.4 消失

//監(jiān)聽SeekBar的onTouch方法 辞居;當觸摸取消時,dismiss PopouWindow蛋勺;
 mIndicator.dismiss();

上面的代碼都不難瓦灶,復雜的是內(nèi)部的相互位置,不斷加減計算出相關(guān)的坐標位置是指示器正確顯示的關(guān)鍵:通過獲得屏幕的寬度減去兩邊的padding來獲得seekbar的寬度抱完,再通過塊數(shù)繪制獲得一塊block的長度贼陶,然后繪制刻度和刻度文字,根據(jù)觸摸的坐標計算PopouWindow的位置乾蛤,當進度改變時每界,更新其位置。

文字不能對一些細節(jié)進行詳細的描述家卖,如果對此項目感興趣眨层,歡迎review代碼交流。

GitHub地址 https://github.com/warkiz/IndicatorSeekBar

IndicatorSeekBar的實現(xiàn)思路已經(jīng)介紹完了上荡,如果想了解其使用場景與方式趴樱,請關(guān)注下一篇文章。

IndicatorSeekBar的使用方式:http://www.reibang.com/p/beb19f770e68

感謝

material.io-slider.

MaterialDesignLibrary.

PointerPopupWindow.

SeekBarCompat.

BubbleSeekBar.

NumberProgressBar.

android-slidr.

RangeSeekBar.

BubblePopupWindow.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末酪捡,一起剝皮案震驚了整個濱河市叁征,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌逛薇,老刑警劉巖捺疼,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異永罚,居然都是意外死亡啤呼,警方通過查閱死者的電腦和手機卧秘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來官扣,“玉大人翅敌,你說我怎么就攤上這事√杼悖” “怎么了蚯涮?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長卖陵。 經(jīng)常有香客問我遭顶,道長,這世上最難降的妖魔是什么赶促? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任液肌,我火速辦了婚禮,結(jié)果婚禮上鸥滨,老公的妹妹穿的比我還像新娘嗦哆。我一直安慰自己,他們只是感情好婿滓,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布老速。 她就那樣靜靜地躺著,像睡著了一般凸主。 火紅的嫁衣襯著肌膚如雪橘券。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天卿吐,我揣著相機與錄音旁舰,去河邊找鬼。 笑死嗡官,一個胖子當著我的面吹牛箭窜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播衍腥,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼磺樱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了婆咸?” 一聲冷哼從身側(cè)響起竹捉,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎尚骄,沒想到半個月后块差,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年憾儒,在試婚紗的時候發(fā)現(xiàn)自己被綠了询兴。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乃沙。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡起趾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出警儒,到底是詐尸還是另有隱情训裆,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布蜀铲,位于F島的核電站边琉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏记劝。R本人自食惡果不足惜变姨,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望厌丑。 院中可真熱鬧定欧,春花似錦、人聲如沸怒竿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽耕驰。三九已至爷辱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間朦肘,已是汗流浹背饭弓。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留媒抠,地道東北人弟断。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像领舰,于是被迫代替她去往敵國和親夫嗓。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

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