Android 中 實現柱狀圖自定義控件

一、基本思路

  • 創建自定義控件的數據模型;
  • 創建一個自定義 View 類,繼承自 View;
  • 在初始化方法中獲取自定義屬性的值。
  • 創建設置數據方法,將數據模型列表轉換成自定義繪制時的數據;
  • 重寫 onDraw 方法,以實現自定義的繪制邏輯。

二、主要繪制方法

1、drawLine 繪制直線

public void drawLine(float startX, float startY, float stopX, float stopY, Paint paint)
  • startX 和 startY:起點的 x 和 y 坐標。
  • stopX 和 stopY:終點的 x 和 y 坐標。
  • 線條的樣式是 Paint.Style.STROKE

2、 drawLines 繪制一系列直線

public void drawLines(@Size(multiple = 4) @NonNull float[] pts, int offset, int count, @NonNull Paint paint)
public void drawLines(@Size(multiple = 4) @NonNull float[] pts, @NonNull Paint paint)
  • pts:包含點坐標的數組。每條線由數組中的 4 個連續值定義,例如 pts[0] 和 pts[1] 是起點,pts[2] 和 pts[3] 是終點。因此,數組的長度必須是 4 的倍數。
  • offset:從數組中跳過的值的數量。
  • count:在跳過 offset 個值后要處理的值的數量。由于每條線需要 4 個值,因此實際繪制的線條數量為 count / 4,也說明 count 值必須是 4 的倍數。
  • 應用場景:drawLines 方法適用于繪制簡單的直線,例如:繪制網格線,繪制坐標軸,繪制界線,在游戲或圖表中繪制路徑。

3、drawText 繪制文本

public void drawText(@NonNull String text, float x, float y, @NonNull Paint paint)
  • text:要繪制的字符串。
  • x 和 y:文本的起始點坐標(y 是基線的坐標)。
  • paint:用于繪制文本的 Paint 對象。繪制文本時,可通過設置 paint 屬性來配置文本的顏色、大小、樣式(粗體、斜體、下劃線)等屬性。

4、drawRect 繪制矩形

public void drawRect(float left, float top, float right, float bottom, @NonNull Paint paint)
public void drawRect(@NonNull RectF rect, @NonNull Paint paint)
  • left:矩形的左邊界(x 坐標)。
  • top:矩形的上邊界(y 坐標)。
  • right:矩形的右邊界(x 坐標)。
  • bottom:矩形的下邊界(y 坐標)。
  • paint:用于繪制矩形的 Paint 對象,可以設置顏色、填充方式(Paint.Style.FILL 或 Paint.Style.STROKE)、筆觸寬度(strokeWidth)、邊框樣式等。
  • rect:RectF 對象,表示矩形的四個邊界。
  • 坐標系:Android 的坐標系以屏幕左上角為原點,x 軸向右為正,y 軸向下為正。
  • 矩形邊界:left 必須小于 right,top 必須小于 bottom,否則不會繪制任何內容。
  • 性能優化:如果需要頻繁繪制矩形,建議在 onDraw 方法中盡量減少對象創建(如 RectF),以避免內存分配和垃圾回收。

5、Matrix 實現圖形變換

  • 在 Android 中,Matrix 類是一個強大的工具,用于處理 2D 圖形變換,包括平移、縮放、旋轉和傾斜等操作。Matrix 是一個 3×3 的浮點數矩陣,主要用于圖像和視圖的變換。

(1)縮放(Scale)

public void setScale(float sx, float sy)
  • 基于原點縮放:對圖像在 X 軸和 Y 軸方向進行縮放。
  • 例如,setScale(2F, 0.5F) 表示在 X 軸方向放大 2 倍,在 Y 軸方向縮小為原來的一半。
public void setScale(float sx, float sy, float px, float py)
  • 基于指定點縮放:可以指定縮放的中心點。
  • 例如,setScale(2F, 0.5F, 600, 600) 表示以點 (600, 600) 為中心進行縮放。

(2)旋轉(Rotate)

public void setRotate(float degrees)
  • 圍繞原點旋轉:可以圍繞原點進行旋轉。
  • degrees: 旋轉的度數。正數表示順時針旋轉,負數表示逆時針旋轉。
public void setRotate(float degrees, float px, float py)
  • 圍繞指定點旋轉:可以指定旋轉的中心點。
  • 例如,setRotate(-30F, 600, 600) 表示以點 (600, 600) 為中心逆時針旋轉 30 度。

(3)平移(Translate)

public void setTranslate(float dx, float dy)
  • 平移:可以對圖像進行平移操作。
  • 例如,setTranslate(100, 50) 表示將圖像向右平移 100 像素,向下平移 50 像素。

(4)傾斜(Skew)

public void setSkew(float kx, float ky) 
  • 基于原點傾斜:可以對圖像進行傾斜操作。
  • kx 和 ky:kx 表示在 X 軸方向的傾斜,ky 表示在 Y 軸方向的傾斜。
  • 例如,setSkew(30, 0, 600, 600) 表示以點(600, 600)為中心向 X 軸方向傾斜 30 度。
public void setSkew(float kx, float ky, float px, float py)
  • 基于指定點的傾斜:可以指定傾斜的中心點。
  • 例如,setSkew(30, 0, ) 表示在 X 軸方向傾斜 30 度。

(5)組合變換

  • Matrix 類還支持組合變換,即在一個矩陣中應用多個變換操作。
	val matrix = Matrix()// 縮放matrix.postScale(1.5F, 0.5F)// 旋轉matrix.postRotate(30F)// 平移matrix.postTranslate(500F, 200F)
  • setRotate:當你需要從頭開始設置一個旋轉,且不關心之前的變換狀態時,使用 setRotate。
  • postRotate:當你需要在現有變換的基礎上追加一個旋轉操作時,使用 postRotate。

三、demo 示例

1、數據模型定義

data class ChartModel(val label: String, val value: Int)

2、res/values/attrs.xml 中自定義屬性

    <declare-styleable name="BarChartView"><attr name="android:max" format="integer"/><attr name="android:textSize" format="dimension" /><attr name="android:textColor" format="color" /><!-- 0-傾斜日期模式 1-簡便日期模式 --><attr name="mode" format="integer"/></declare-styleable>

3、自定義柱狀圖控件

package com.android.androidfunctiondemo.customviewimport android.animation.ValueAnimator
import android.annotation.SuppressLint
import android.content.Context
import android.graphics.Canvas
import android.graphics.LinearGradient
import android

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

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

相關文章

Netty 核心原理與實戰:從 DiscardServer 看透 Reactor 模式與組件協作

目錄 Netty 是什么&#xff1f; Netty 的目標 Netty 實戰案例 DiscardServer 服務端程序 NettyDiscardServer 業務處理器 NettyDiscardHandler 配置類 NettyDemoConfig 回顧 Reactor 模式中的 IO 事件處理流程 Netty 中的 Channel Netty 中的 Reactor Netty 中的 Han…

關于“LoggerFactory is not a Logback LoggerContext but Logback is on ......“的解決方案

? ?重磅&#xff01;盹貓的個人小站正式上線啦&#xff5e;誠邀各位技術大佬前來探秘&#xff01;? 這里有&#xff1a; 硬核技術干貨&#xff1a;編程技巧、開發經驗、踩坑指南&#xff0c;帶你解鎖技術新姿勢&#xff01;趣味開發日常&#xff1a;代碼背后的腦洞故事、工具…

2025年6月電子學會青少年軟件編程(C語言)等級考試試卷(三級)

答案和更多內容請查看網站&#xff1a;【試卷中心 -----> 電子學會 ----> C/C ---->三級】 網站鏈接 青少年軟件編程歷年真題模擬題實時更新 編程題 第 1 題 打印城門 題目描述 給定一個正整數 n&#xff0c;輸出如下的星號城門。具體格式請見樣例。 輸入格…

跨平臺直播美顏SDK開發指南:兼顧性能與美型效果的最佳實踐

面對iOS、Android乃至Web等多端應用需求&#xff0c;如何開發一款真正跨平臺、兼顧性能與美型效果的美顏SDK&#xff0c;成為眾多開發團隊和產品經理的一道必答題。 今天筆者這篇文章&#xff0c;就從架構設計、性能優化、視覺效果調校三個關鍵維度&#xff0c;帶你深入解析跨平…

2025數字藏品安全保衛戰:高防CDN如何成為NFT應用的“隱形護甲”?

副標題&#xff1a; 從DDoS防御到全球加速&#xff0c;拆解數字資產平臺的生死防線&#x1f310; 引言&#xff1a;當數字藏品成為黑客的“頭號靶場”2025年全球數字藏品市場突破$1000億&#xff0c;但安全事件同步激增230%——某頭部NFT平臺因3.2Tbps DDoS攻擊癱瘓&#xff0c…

linux 執行sh腳本,提示$‘\r‘: command not found

1、在Linux下執行某個腳本文件卻提示$\r: command not found&#xff0c;如下圖:2、錯誤原因:a、 Windows 風格的換行符&#xff1a;Windows 系統使用 \r\n 作為行結束符&#xff0c;而 Linux 和 Unix 系統使用 \n。當你從 Windows 環境中復制文本到 Linux 環境時&#xff0c;可…

使用HaiSnap做了一款取件碼App(一鍵生成)

你是否懷揣著奇思妙想&#xff0c;卻因不懂代碼而對開發應用望而卻步&#xff1f;現在&#xff0c;有一個神奇AI Agent&#xff08;響指HaiSnap&#xff09;&#xff0c;一個響指就能實現&#xff0c;你說神奇不&#xff1f;只需要一句話就可以生成你想要的應用&#xff01;讓你…

容器與虛擬機的本質差異:從資源隔離到網絡存儲機制

目錄 專欄介紹 作者與平臺 您將學到什么&#xff1f; 學習特色 容器與虛擬機的本質差異&#xff1a;從資源隔離到網絡存儲機制 一、容器與虛擬機的本質區別 1.1 資源抽象層次差異 1.2 資源消耗與性能對比 1.3 隔離性深度差異 二、容器網絡基礎架構 2.1 Docker網絡模型…

ros2 launch文件編寫詳解

一個完整的簡單的launch文件配置過程1.編寫launch文件2.配置package.xml3.配置setup.py&#xff08;python包&#xff09;4.配置CMakeList(C包)5.編譯運行# 在 ROS 2 的 Python 啟動文件中&#xff0c;這些導入語句用于引入各類啟動模塊&#xff0c;以構建和配置節點啟動流程 f…

QT中QTableView+Model+Delegate實現一個demo

一、概述功能: 實現一個查詢學生信息的表格&#xff0c;有學號、性別、年齡、班級和分數共5列&#xff0c;針對最后一列分數實現委托代理&#xff0c;要求能編輯和查看該分數列。QTableView實現視圖展示uiModel負責數據的構造Delegate是委托&#xff0c;可針對某列數據做自定義…

用latex+vscode寫論文

文章目錄 前言 一、下載texlive安裝包 二、安裝texlive 1.安裝 2.配置環境變量 3.檢查是否安裝成功 三、安裝vscode 四、vscode中安裝latex workshop插件 五、創建latex文檔 六、撰寫+編譯+預覽 七、latex workshop常用設置 1.打開設置頁面 2.設置自動保存代碼 3.設置自動編譯代…

監測預警系統:讓園區更高效、更安全、更智能

隨著城市化進程的加快和產業集聚效應的凸顯&#xff0c;園區作為經濟發展的重要載體&#xff0c;其規模不斷擴大&#xff0c;功能日益復雜。在這一背景下&#xff0c;傳統的園區管理模式已難以滿足現代園區高效、安全、智能的運營需求。園區監測預警系統作為一種集成了物聯網、…

分享一個AutoOff定時動作軟件

我們平時在使用電腦的時候有很多需求的功能&#xff0c;比如定時打開程序、定時關閉程序、定時休眠、定時關機等等。如果你也有這樣的需求&#xff0c;那么就需要今天這款軟件。AutoOff定時動作軟件AutoOff這個軟件是一款定時的軟件&#xff0c;軟件大小只有1.1M&#xff0c;而…

RPA軟件推薦:提升企業自動化效率

在數字化轉型浪潮中&#xff0c;機器人流程自動化&#xff08;RPA&#xff09;已成為企業降本增效的核心工具。它通過模擬人類操作&#xff0c;自動化重復性任務&#xff0c;如數據錄入、報表生成和系統集成&#xff0c;顯著提升運營效率。面對眾多RPA軟件&#xff0c;如何選擇…

【Qt】QTime::toString(“hh:mm:ss.zzz“) 顯示亂碼的原因與解決方案

在使用 Qt 編寫計時器程序時&#xff0c;我遇到一個很奇怪的問題&#xff1a;使用 QTime::toString("hh:mm:ss.zzz") 格式化時間后&#xff0c;顯示出來的是一串亂碼&#xff0c;如下所示&#xff1a;本來應該是&#xff1a;但卻顯示了一堆“〇”或奇怪的符號。問題表…

MSVC編譯KDChart過程

MSVC編譯KDChart過程 一、下載KDChart源文件 GitHub源文件 查看文件夾里的INSTALL.txt&#xff0c;可以看到需要CMake編譯。 中文版 以下是使用 CMake 構建系統安裝 KD Chart 的說明。 需要 CMake 3.3 或更高版本。Qt 版本支持&#xff1a;* KD Chart 2.5.0 及以下版本需要…

AI Agent管理后臺原型設計全拆解(附3套可復用素材)

最近在做AI方向的產品&#xff0c;越來越能感受到“智能體”這個概念正在從技術圈走向應用層。無論是內部探索項目&#xff0c;還是外部合作需求&#xff0c;很多場景都會提到Agent、助手、知識庫這些關鍵詞。我們經常討論如何打造一個有用的AI Agent&#xff0c;但實際上&…

ABP VNext + Elastic APM:微服務性能監控

ABP VNext Elastic APM&#xff1a;微服務性能監控 &#x1f680; &#x1f4da;目錄ABP VNext Elastic APM&#xff1a;微服務性能監控 &#x1f680;一、引言 ?架構全景圖 &#x1f3d7;?二、環境與依賴 &#x1f4e6;三、APM 服務器與 Kibana 快速部署 &#x1f433;Doc…

單片機學習筆記.AD/DA(略含有SPI,用的是普中開發板上的XPT2046芯片)

AD/DA基礎知識 硬件電路&#xff1a; 模電運放知識回顧&#xff1a; 虛短&#xff08;Virtual Short&#xff09;定義&#xff1a;運放同相輸入端&#xff08;&#xff09;和反相輸入端&#xff08;-&#xff09;的電位近似相等&#xff0c;即V V-&#xff0c;仿佛兩個輸入端短…

避坑指南:VMware安裝CentOS常見錯誤及完美解決方案

1. 引言 虛擬機允許在同一臺機子上有不同的操作系統&#xff0c;還可以用于搭建實驗環境、軟件測試和兼容性測試等。我是主攻大數據方向的會用到Linux操作系統&#xff0c;所以虛擬機對我來說是很有必要的。我把之前的筆記和安裝包整理了一下&#xff0c;就有了現在這個教程。…