網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
曲線圖標(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的回彈的控制邏輯。
原文鏈接:https://juejin.cn/post/7179283220473577509
相關(guān)推薦
- 2022-07-12 Docker-swarm快速搭建redis集群的方法步驟_docker
- 2022-12-10 Android入門之日歷選擇與時(shí)間選擇組件的使用_Android
- 2023-07-25 npm login 時(shí)報(bào)錯(cuò)npm ERR! code E403
- 2022-05-26 Python?if?else語(yǔ)句對(duì)縮進(jìn)的要求_python
- 2023-01-23 oracle數(shù)據(jù)排序后獲取前幾行數(shù)據(jù)的寫法(rownum、fetch方式)_oracle
- 2022-09-07 解析react?函數(shù)組件輸入卡頓問(wèn)題?usecallback?react.memo_React
- 2022-08-16 C++超詳細(xì)梳理基礎(chǔ)知識(shí)_C 語(yǔ)言
- 2022-10-18 shell腳本實(shí)現(xiàn)定時(shí)刪除文件或文件夾_linux shell
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支