自定義 View 循環滾動刻度控件

LoopScaleView

先看效果圖:

enter description here

LoopScaleView 是一個自定義的刻度尺風格的選值控件,從上面的動圖大家可以看到 LoopScaleView 的運行效果.可以設置屏幕內顯示的刻度數,也可以設置每一個刻度代表的值得大小。

LoopScaleView.class

Nested class

OnValueChangeListener刻度取值監聽接口

Public methods

方法名返回值類型說明
getItemsCount()int獲取總的刻度數
setCursorColor(int color)void設置游標顏色(游標不采用圖片時)
setCursorWidth(int width)void設置游標寬度(同上)
setCursorMap(Bitmap map)void設置圖片作為游標
setScaleWidth(int scaleWidth)void設置刻度寬度
setShowItemSize(int showItemSize)void設置屏幕內可見的大刻度數
setScaleHeight(float scaleHeight)void設置刻度的高度
setLineColor(int lineColor)void設置底部直線的顏色
setScaleTextColor(int scaleTextColor)void設置刻度標值的顏色
setScaleTextSize(int scaleTextSize)void設置刻度標值的文字大小
setMaxValue(int maxValue)void設置最大值
setOneItemValue(int oneItemValue)void設置一個刻度表示的值的大小
setCurrentValue(int currValue)void設置當前的值

分解剖析

  • onMeasure 方法中初始化一個刻度的像素寬度,整個視圖的寬度
      @Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);viewHeight = MeasureSpec.getSize(heightMeasureSpec);//一個小刻度的寬度(十進制,每5個小刻度為一個大刻度)scaleDistance = getMeasuredWidth() / (showItemSize * 5);//尺子長度總的個數*一個的寬度viewWidth = maxValue / oneItemValue * scaleDistance;maxX = getItemsCount() * scaleDistance;minX = -maxX;}復制代碼
  • onDraw() 方法重寫繪制 ScaleView 的視圖
      @Overrideprotected void onDraw(Canvas canvas) {canvas.clipRect(getPaddingStart(), getPaddingTop(), getWidth() - getPaddingRight(), viewHeight - getPaddingBottom());// 繪制底部線條drawLine(canvas);// 繪制游標drawCursor(canvas);paint = new Paint(Paint.ANTI_ALIAS_FLAG);paint.setStrokeWidth(scaleWidth);// 繪制反向的一個刻度尺for (int i = 0; i < maxValue / oneItemValue; i++) {//drawScale 為繪制刻度線的方法drawScale(canvas, i, -1);}//繪制正向的一個刻度尺for (int i = 0; i < maxValue / oneItemValue; i++) {//drawScale 為繪制刻度線的方法drawScale(canvas, i, 1);}}復制代碼
    可以看出上面的繪制過程,實際上是繪制出了兩個刻度尺。經過上面的步驟,靜止狀態下的 ScaleView 已經繪制完成,接下來就是要讓他動起來了
  • 手勢識別來處理滑動
    在 onTouchEvent() 方法中將觸摸事件交給手勢識別 GestureDetector.SimpleOnGestureListener 來處理:

      /*** 滑動手勢處理*/private GestureDetector.SimpleOnGestureListener gestureListener = new GestureDetector.SimpleOnGestureListener() {@Overridepublic boolean onDown(MotionEvent e) {return true;}//滾動事件public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {scrollView(distanceX);return true;}//快速滑動時間public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {if (!mScroller.computeScrollOffset()) {mScroller.fling((int) currLocation, 0, (int) (-velocityX / 1.5), 0, minX, maxX, 0, 0);setNextMessage(0);}return true;}@Overridepublic boolean onSingleTapUp(MotionEvent e) {return super.onSingleTapUp(e);}};復制代碼

    上述代碼主要注意兩個地方:onScroll() 和 onFling()。當正常左右滑動時,觸發 onScroll 方法調用 srcollView(float distance) 對整個視圖進行重繪。當快速慣性滑動時通過 Scroller 讓慣性滑動變得流暢,慣性滑動的狀態更新是通過 Handler 進行不斷的查詢 Scroller 的執行狀態得到的,當 Scroller 執行完慣性滑動的動畫到達目的地時,停止 Handler 的查詢任務,當 onFling 多次觸發時只會執行第一次的狀態。

  • 循環滾動的實現
    開始說到的繪制了正向反向兩個方向的刻度尺即是為了實現循環滾動而設定的,在 drawScale() 方法中有如下代碼:
          if (currLocation + showItemSize / 2 * 5 * scaleDistance >= viewWidth) {currLocation = -showItemSize / 2 * 5 * scaleDistance;float speed = mScroller.getCurrVelocity();mScroller.fling((int) currLocation, 0, (int) speed, 0, minX, maxX, 0, 0);setNextMessage(0);} else if (currLocation - showItemSize / 2 * 5 * scaleDistance <= -viewWidth) {currLocation = showItemSize / 2 * 5 * scaleDistance;float speed = mScroller.getCurrVelocity();mScroller.fling((int) currLocation, 0, (int) speed, 0, minX, maxX, 0, 0);setNextMessage(0);}復制代碼
    當 currLocation 加上可視視圖一半的距離大于刻度尺的寬度 viewWidth 或者 currLocation 減去可視視圖一半的距離小于 -viewWidth 時(即正向或者反向滑到最大/最小值時)通過為 currLocation 重新賦值將刻度值重置,來達到循環滾動的目的.如果到達臨界點時是在 Scroller 執行快速滑動的過程則重置之后需要再為 Scroller 重新設置初速度來達到流暢的滑動.
    基本思路就是上面所說的這樣了,詳細操作大家自己查看 LoopScaleView 的源碼。

    接入使用

    project's build.gradle (工程的 build.gradle)
    allprojects {repositories {jcenter()maven{url  "http://dl.bintray.com/huxinyu/maven"}}
    }復制代碼
    module's build.gradle (模塊的build.gradle)
    dependencies {compile 'com.pandaq:loopscale:1.0.1'
    }復制代碼
  • xml 文件中進行屬性配置,這些屬性也可以通過 Java 代碼進行修改
      <com.pandaq.loopscaleview.LoopScaleViewandroid:id="@+id/lsv_4"android:layout_width="match_parent"android:layout_height="50dp"android:layout_margin="8dp"android:background="@drawable/loopscaleview_bg"android:padding="8dp"app:cursorColor="@color/colorAccent"app:maxShowItem="4"app:maxValue="1000"app:oneItemValue="5"app:scaleTextColor="@color/colorPrimary"/>復制代碼

    最后

    覺得本文對你有幫助
    簡書PandaQ404
    掘金PandaQ
    GithubPandaQAQ
    持續分享中,歡迎關注和 star。。。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/396756.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/396756.shtml
英文地址,請注明出處:http://en.pswp.cn/news/396756.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

go 類型斷言_(57)接口的類型斷言

GO提供了一個方法&#xff0c;用來判斷接口的底層值是什么類型類型斷言 提供了訪問接口值底層具體值的方式。t : i.(T)該語句斷言接口值 i 保存了具體類型 T&#xff0c;并將其底層類型為 T 的值賦予變量 t。若 i 并未保存 T 類型的值&#xff0c;該語句就會觸發一個panic。為了…

使用web3j構建以太坊錢包

創建一個以太坊錢包有多種方式&#xff0c;一般情況下可以通過geth、EtherumWallet等客戶端。對于前端&#xff0c;可以使用插件MetaMask進行創建。這幾種方式技術實現雖然不同&#xff0c;但底層原理是一致的。本文主要介紹如何通過web3j架構創建一個以太坊的冷錢包&#xff0…

Html、CSS、JavaScript 實時效果在線編輯器 - 學習的好工具,算不算?!

關于 二維碼 與 NFC 之間的出身貧賤說太陽火神的漂亮人生 (http://blog.csdn.net/opengl_es)本文遵循“署名-非商業用途-保持一致”創作公用協議轉載請保留此句&#xff1a;太陽火神的漂亮人生 - 本博客專注于 敏捷開發及移動和物聯設備研究&#xff1a;iOS、Android、Html5、…

android自定義更新,Android 完美解決自定義preference與ActivityGroup UI更新的問題

之前發過一篇有關于自定義preference 在ActivityGroup 的包容下出現UI不能更新的問題&#xff0c;當時還以為是Android 的一個BUG 現在想想真可笑 。其實是自己對機制的理解不夠深刻&#xff0c;看來以后要多看看源碼才行。本篇講述內容大致為如何自定義preference 開始到與Act…

vxlan 資料及其在 neutron中的應用

2019獨角獸企業重金招聘Python工程師標準>>> VXLAN 是一個新興的SDN 標準&#xff0c;它定義了一種新的 overlay 網絡&#xff0c;它主要的創造者是 VMware, Cisco 和 Arista。它被設計來消除虛擬化網絡世界中的 VLAN 數目的限制。VXLAN 本身是一個多播標準&#xf…

橫流式冷卻塔計算風量_研討丨卓展標準高效制冷機房技術之影響冷卻塔效率的幾個因素...

集中制冷用空調系統中&#xff0c;單臺冷卻塔的冷卻水量基本上都小于1,000m/h&#xff0c;且裝有淋水填料的橫流機械通風開式居多。本文將已橫流開式冷卻塔為對象&#xff0c;探討影響其效率的幾個因素。橫流開式冷卻塔示意圖如下所示&#xff1a;橫流開式冷卻塔示意圖 Fig 01說…

我是培訓出來的我怕誰

引子: 江小峰是我帶過的徒弟中跟我最久&#xff0c;也是最聰明的一個。 他一個高中生&#xff0c;沒上過大學&#xff0c;高中畢業后在老家賣了三年電腦&#xff0c;天天給人裝操作系統&#xff0c;有天他在網上看到某培訓機構招生簡介&#xff0c;一時沖動揣上三年血汗錢&…

android平臺gallery2應用分析,Android5.1圖庫Gallery2代碼分析數據加載流程

圖片數據加載流程。Gallery---->GalleryActivity------>AlbumSetPage------->AlbumPage--------->PhotoPage相冊集 照片集 某張圖片1,AlbumSetPage.javaprivate void initializeData(Bundle data) {String mediaPath data…

python開課吧1980課程_開課吧的課程怎么樣?

就那那些編程開發課來說。現在網絡上充斥著大量的編程開發課程&#xff0c;什么python的&#xff0c;java的&#xff0c;c的&#xff0c;而且名字一個比一個夸張&#xff0c;21天精通c&#xff0c;7天熟練運用java&#xff0c;3天掌握python核心代碼&#xff0c;這些課程標題簡…

專業概念

1.JDBC: java數據庫連接&#xff08;JDBC&#xff09;用于在java程序中實現數據庫的操作功能&#xff0c;它提供了執行sql語句&#xff0c;訪問各種數據庫的方法&#xff0c;并為各種不同的數據庫提供統一的操作接口&#xff0c;java.sql包中 包含了jdbc操作數據庫的所有類 2.…

前端解決跨域問題的8種方案

2019獨角獸企業重金招聘Python工程師標準>>> 1.同源策略如下&#xff1a; URL說明是否允許通信http://www.a.com/a.js http://www.a.com/b.js同一域名下允許http://www.a.com/lab/a.js http://www.a.com/script/b.js同一域名下不同文件夾允許http://www.a.com:8000/…

k歌的錄音伴奏合成技術如何實現_K歌神器,用唱吧麥克風攀登天籟高峰

自從喜歡上了手機K歌&#xff0c;經常會上傳一些自己的作品&#xff0c;起初無論音質如何都是樂在其中&#xff0c;可時間久了發現回放效果確實不如那榜單上的高手&#xff0c;究其原因想到了麥克風&#xff0c;網上一搜果然有各種K歌輔助工具&#xff0c;多番對比之下&#xf…

淺談內存開辟問題和Block內存問題

我們知道&#xff0c;內存分為棧&#xff0c;堆&#xff0c;塊。 棧中的內存由系統自己釋放&#xff0c;堆是存對象初始化的地方&#xff0c;塊是CPU與內存連接的緩沖器&#xff0c;運行速度比內存快&#xff0c;比CPU慢。 例如&#xff0c;我們NSMutableArray *array [NSMuta…

vue render函數_Vue原理解析(一):Vue到底是什么?

Vue&#xff0c;現在前端的當紅炸子雞&#xff0c;隨著熱度指數上升&#xff0c;實在是有必要從源碼的角度&#xff0c;對它功能的實現原理一窺究竟。個人覺得看源碼主要是看兩樣東西&#xff0c;從宏觀上來說是它的設計思想和實現原理&#xff1b;微觀上來說就是編程技巧&…

scrapy爬蟲-setting.py

# Obey robots.txt rulesROBOTSTXT_OBEY False  不遵從網站的robots.txt法則 # See also autothrottle settings and docsDOWNLOAD_DELAY 3  每次下載延遲3秒&#xff0c;防止造成網站攻擊 # Override the default request headers:DEFAULT_REQUEST_HEADERS { Accept:…

android點擊左上角劃出,使用Android中的Path和RectF在左上角右上角左下角繪制圓角...

有一個Path#addRoundRect()重載,它接受一個包含八個值的float數組,其中我們可以為四個角中的每一個指定x和y半徑.這些值為[x,y]對,從左上角開始,順時針繞其余部分.對于我們想要舍入的那些角,我們將該對的兩個值都設置為半徑值,并將它們保留為零,而不是那些.作為一個說明性示例,…

Nodejs微信開發

因為使用了Bot Framework開發了一個小功能&#xff0c;它目前支持了Skype\Teams\Slack等&#xff0c;但在國內來講&#xff0c;微信還是一個比較流行的軟件&#xff0c;所以需要接上微信 原來開發Bot的時候使用的是.Net開發的&#xff0c;這次我決定使用Nodejs開發一個簡單的后…

性別有什么用_為啥不讓男孩玩布娃娃?別讓你的“性別偏見”,給孩子的人生設限...

在養育孩子的過程中&#xff0c;父母總是會犯許多錯誤&#xff0c;更是有一些錯誤會直接使孩子毀掉一生&#xff0c;而性別偏見正是很多家長都會去犯的錯誤&#xff0c;對男孩和女孩有著刻板印象&#xff0c;也正是因為這一點使孩子的潛力和天賦被壓制。前幾天我帶著孩子去逛商…

android的時間代碼怎么寫,Android 日期和時間的使用實例詳解

Android 日期和時間的使用日期和時間的使用&#xff1b;1&#xff1a;彈出框TimePickerDialog,DatePickerDialog2&#xff1a;組件TimePicker,DatePickerTimePickerDialog的使用&#xff1a;通過點擊button顯示圖一&#xff0c;然后用戶可以設置時間DatePickerDialog的使用只需…

andriod studio 查看項目依賴_Intellij IDEA 中如何查看maven項目中所有jar包的依賴關系圖...

Maven 組件界面介紹如上圖標注 1 所示&#xff0c;為常用的 Maven 工具欄&#xff0c;其中最常用的有&#xff1a;第一個按鈕&#xff1a;Reimport All Maven Projects 表示根據 pom.xml 重新載入項目。一般單我們在 pom.xml 添加了依賴包或是插件的時候&#xff0c;發現標注 4…