91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android?MPAndroidChart繪制原理是什么

發布時間:2022-08-25 10:06:08 來源:億速云 閱讀:128 作者:iii 欄目:開發技術

本篇內容主要講解“Android MPAndroidChart繪制原理是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Android MPAndroidChart繪制原理是什么”吧!

1. Chart整體結構

Chart下面包含有坐標系的BarLineChartBase,以及沒有坐標系的PieRandarBase.

Android?MPAndroidChart繪制原理是什么

 圖 1.0(Chart 整體結構)

筆者通常在工程中使用較多的是Bar、Line兩種圖表, 除此之外,還有很多其它的圖表類型(見示例圖1.1)

Android?MPAndroidChart繪制原理是什么

圖 1.1(坐標系Chart)

2.Chart 繪制參與的業務組件

本節從 具有坐標系的LineBarChartBase入手逐步拆解MPChart,查看Chart內部具體的繪制邏輯。

無論一個圖表怎么復雜,依舊沒有逃離View的整個繪制邏輯, 廣義上來說自定義View 分 自定義View,自定義ViewGroup, ViewGroup 涉及到parent 跟child , 各child 之間的擺放關系,需要處理layout相關的問題。而這里的MPChart圖表,絕大多數涉及到位置的擺放通過 屏幕像素坐標點去定位,然后依照坐標點去繪制,所以我們著重需要關注的是Chart (View) 的 onDraw()方法,這里是BarLineChartBase的onDraw() 方法,可以看到所有的繪制邏輯都在該方法內。

Android?MPAndroidChart繪制原理是什么

圖 1.3(chart的onDraw方法)

Render

可以從上面的圖1.3中可以看到,Chart的繪制分小組件逐個繪制的,每個組件定義自己的Render,在對應的drawXXX 方法里進行繪制,比如有專門繪制X軸的XAxisRender, 繪制Y軸的 YAxisRender, 繪制BarChart的BarChartRender, 以及繪制 Line chart的 LineChartRender, 繪制邊框 backGround等等,所以剖開整個Chart的繪制邏輯來看,我們會發現Chart的繪制就是通過各種Render去 drawLine、drawRect 、不規則的drawPath, 或者貝塞爾曲線drawCubicPath(其實也是屬于drawPath的范疇);以及部分輔助,坐標軸的label 所需的drawText, 這些各種的小部件的繪制最終完成了 Chart整個的繪制。

可以參考源碼 : BarChartRender 里的 drawData() , drawDataSet(DataSet dataSet,...) 方法。

圖1.5(Chart 圖表 柱子繪制)

那么問題來了,上邊介紹的Render的各種繪制,這些小部件背后對應的Pixel Point,比如簡單的BarChart 中的某一個 Item Chart,直接對應一個RectF (start, top, end, bottom), RectF包含四個坐標點; 又比如 簡單的LineChart,一條折線包含兩個端點,PointA(x1, y1), PointB(x2, y2), 多段折線累加就構成了我們所需的線性表, 它們是如何得來的?

在此, 我們以一個具體的實例著手來分析,比如繪制某一天的步數BarChart, 要求每半個小時一根柱子,所以一共48根柱子,每個柱子的高度對應的該時間段的步數sum,這些我們稱之為業務數據,如何將這里的業務數據轉化成Render 繪制 最終所需的Pixel Point呢?

Android?MPAndroidChart繪制原理是什么

圖1.6(24小時步行圖)

Buffer

從圖1.5的源碼里 可以看到Render里 canvas drawRect的數據來自 BarBuffer的數據結構,首先我們會將業務數據放置到一個Buffer 數組里,然后通過一個工具Transform, 將buffer里的數據轉化成 pixel point, 繼續保存在Buffer里, 然后繪制流程中從buffer 里獲取數據進行繪制。這個transform的流程,可以拿個專題來細講,自定義一種圖表樣式時繪制的時候,筆者通常也是修改buffer 里的相應的值,更甚者是自定義自己的一個Buffer來專門處理數據的轉換關系,影響這個transform的因素 1.數據源 BarBuffer 2.坐標系YAxis、XAxis 具體來說 Axis的min/max 值 3、觸摸時的縮放比例參數 phaseY. 4、Attribute屬性值(比如)

Entry、DataSet

再回到步數BarChart的繪制,我們知道了如何將業務數據轉化成pixel Point,現在48根柱子具體柱子坐標x,每根柱子對應的業務值設為y, 才兩個數據,如何對應成RectF所需的 4個 Point值呢,整個chart/48 就是每個item的相應的坐標范圍,但考慮item是緊挨的,真正的柱子Rectf 需要預留的Space,這個space的信息會定義在 Chart 的Attribute 屬性里,這里可以理解成自定義View 的自定義Arrtibute 值。

如何把這些業務的數據比較優雅、合適的方式給到Buffer?首先會將業務數據封裝成Entry, 它對應的是每個item, 基本數據包含 x, y 例如Entry的子類 BarEntry 用x、y 在配合Attribute里的space (每個Item里空白跟整個Item寬度的占比,通常給小于1的float型), 將分散的Entry封裝成整個的DataSet, 統一將這個DataSet交給 DataBuffer, 結合Attribute中的space屬性, 給到 Transformer, 最終transform 出 BarChart 所需要的RectF。

Attribute

對于一些裝飾性的屬性,比如一些設計需求的顏色、大小、尺寸、以及上面提到的space等控制每個組件具體繪制成啥樣的,可以通過Attribute給到Render,至于每個item 具體的需求變化,比如不同的值范圍,柱子的顏色要求不一樣,可以通過擴展Entry的屬性,進行具體的繪制邏輯, Entry 除了可以跟坐標轉化相關的x、y 的信息之外,可以包含其它繪制的附屬信息。

3. 整體Chart繪制流程

通過上面的示例,參見圖 進行梳理一下:首先第一步 獲取業務數據(對應坐標軸數據), 創建Entry保存每個Item值,將這些值保存統一的DataSet, 然后交于Buffer存儲,TransFormer 拿到 buffer,最終轉化為Render繪制所需的 Pixel Point, 通常會是Point構成的具象的RectF, Line, Path等。

Android?MPAndroidChart繪制原理是什么

圖1.7(Chart繪制流程圖)

到此,相信大家對“Android MPAndroidChart繪制原理是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

肥乡县| 西宁市| 夏河县| 银川市| 蒙城县| 敦煌市| 苏尼特右旗| 维西| 宿州市| 永新县| 蓬溪县| 双桥区| 陇川县| 麻城市| 喜德县| 开平市| 揭西县| 桓台县| 若羌县| 长泰县| 广东省| 石棉县| 集安市| 绥江县| 台州市| 塔城市| 农安县| 庆城县| 襄汾县| 武夷山市| 龙胜| 万安县| 罗山县| 台中县| 乌兰浩特市| 青川县| 安多县| 壶关县| 浮梁县| 古蔺县| 东阳市|