RecyclerBezierChart曲線圖表繪制
曲線圖標(biāo)RecyclerBezierChart 的繪制
本篇介紹曲線圖標(biāo)RecyclerBezierChart 的繪制, 同樣圖表的公共部分的繪制這里不再做介紹,主體圖表的繪制邏輯在BezierChartRender類中,其中包含主體曲線的繪制以及底部fill部分的漸變色的繪制。
三階貝塞爾曲線
曲線的繪制用的三階貝塞爾曲線,關(guān)于貝塞爾曲線相關(guān)的知識(shí)讀者可自行Google,Android中的三階貝塞爾曲線的繪制API接口,以下為Path構(gòu)建三階曲線,其中包含兩個(gè)Control Points.
這里的繪制邏輯主要參考了MPAndroidChart中的曲線繪制.
首先將Entry的 Y值轉(zhuǎn)換成對(duì)應(yīng)的PointF,這個(gè)之前圖表都有同樣的操作,存入originPointFList, 然后通過(guò)originPointFList計(jì)算對(duì)應(yīng)的 Control Points List, 存入 controList, 其中ControlPoint 這個(gè)類筆者自定義的包含了兩個(gè)Control Point 點(diǎn),緊接著Control Point的計(jì)算再介紹。
得到originPointFList, controList后,每次迭代套用Path.cubicTo(controlPoint1, controlPoint2, endPoint) API即可,最終得到 cubicPath.
cubicPath
曲線圖底部是漸變Color區(qū)域,這里構(gòu)建了封閉的Path cubicFillPath, 其中包含了cubicPath。
private void drawCubicFill(RecyclerView parent, Canvas c, List<PointF> pointFList, Path spline, float bottom) { spline.lineTo(pointFList.get(pointFList.size() - 1).x, bottom); spline.lineTo(pointFList.get(0).x, bottom); spline.close(); drawFilledPath(parent, c, spline); }
整個(gè)主體圖表的繪制邏輯大致如上,非常簡(jiǎn)單。
下面是剛提到的關(guān)于 Control Point 的計(jì)算, 這里定義了一個(gè)類 ControlPoint, 包含兩個(gè)Control Point點(diǎn)。上面計(jì)算controList 方法也就作為 它的static 方法放在ControlPoint 中了。
List<ControlPoint> controlList = ControlPoint.getControlPointList(originPointFList, mBarChartAttrs.bezierIntensity);
其中 bezierIntensity 表示控制貝塞爾曲線曲率強(qiáng)度的一個(gè)參數(shù)系數(shù)。
對(duì)于不是第一個(gè),最后點(diǎn), 計(jì)算公式:
controlPoint.x = cur.x + (next.x - pre.x) * bezierIntensity; Y值同理。
兩個(gè)邊界位置Index 邊界的原因稍作變動(dòng),具體如下:
至此曲線圖的繪制結(jié)束,非常簡(jiǎn)單,最后附上一張RecyclerBezierChart的gif 圖。
本專欄到這里幾個(gè)常用的圖表的純繪制介紹完了,接下來(lái)大致兩到三章節(jié)介紹圖表動(dòng)態(tài)相關(guān)的邏輯,選中高亮的控制,長(zhǎng)按選中滑動(dòng)跟RecyclerView本身滑動(dòng)的一個(gè)沖突上的解決;控制同一天顯示在一屏?xí)r的回彈的控制邏輯。
以上就是RecyclerBezierChart曲線圖表繪制的詳細(xì)內(nèi)容,更多關(guān)于RecyclerBezierChart圖表繪制的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android實(shí)現(xiàn)長(zhǎng)按back鍵退出應(yīng)用程序的方法
這篇文章主要介紹了Android實(shí)現(xiàn)長(zhǎng)按back鍵退出應(yīng)用程序的方法,實(shí)例分析了Android按鈕事件的操作技巧,需要的朋友可以參考下2015-05-05Android如何優(yōu)雅的處理重復(fù)點(diǎn)擊
這篇文章主要介紹了Android如何優(yōu)雅的處理重復(fù)點(diǎn)擊,幫助大家更好的理解和學(xué)習(xí)使用Android開(kāi)發(fā),感興趣的朋友可以了解下2021-03-03Android中獲取資源 id 及資源 id 的動(dòng)態(tài)獲取
這篇文章主要介紹了 Android中獲取資源 id 及資源 id 的動(dòng)態(tài)獲取的相關(guān)資料,需要的朋友可以參考下2017-01-01Android開(kāi)發(fā)基礎(chǔ)簡(jiǎn)化Toast調(diào)用方法詳解
這篇文章主要為大家介紹了Android開(kāi)發(fā)基礎(chǔ)簡(jiǎn)化Toast調(diào)用方法的相關(guān)資料,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02Flutter開(kāi)發(fā)技巧RadialGradient中radius計(jì)算詳解
這篇文章主要為大家介紹了Flutter小技巧RadialGradient?中?radius?的計(jì)算詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01Android實(shí)現(xiàn)底部導(dǎo)航欄功能(選項(xiàng)卡)
這篇文章主要介紹了Android實(shí)現(xiàn)底部導(dǎo)航欄功能,可以隨意切換不同的頁(yè)面,實(shí)現(xiàn)選項(xiàng)卡功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-12-12Android實(shí)現(xiàn)音樂(lè)播放器歌詞顯示效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)音樂(lè)播放器歌詞顯示效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06Android利用ContentProvider讀取短信內(nèi)容
這篇文章主要為大家詳細(xì)介紹了Android利用ContentProvider讀取短信內(nèi)容,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11Android Internet應(yīng)用實(shí)現(xiàn)獲取天氣預(yù)報(bào)的示例代碼
這篇文章主要介紹了Android網(wǎng)絡(luò)編程及Internet應(yīng)用-獲取天氣,小編覺(jué)得挺不錯(cuò)的,一起跟隨小編過(guò)來(lái)看看吧2018-05-05