基于Java Swing的儀表盤實現
原文:https://segmentfault.com/a/1190000007683729
序言
夠幾個月沒有更新了,博客還透露著春招焦慮的氣息。最近code確實不多,而且缺乏原創性的內容,當然,關鍵點還是在于,對于最近看的東西,看的比較雜,沒能夠有一個非常透徹的理解,input后沒有進行很好的內化,導致output如難產的嬰兒,遲遲無法落地。轉到正題,這次寫的儀表盤,繼承JComponent實現一個儀表空間。支持直線性,弧形,圓形。同時支持對于表盤的顏色,大小的一些自定義操作。難點在于對于表盤刻度的繪制。涉及到數學公式的轉化,將我們的刻度線進行繪制。
實現思路
初次想到實現一個儀表盤,有點畏懼心理,但是想到了之前創業公司實現的一個扇形的RecyclerView控件,感覺有很多可以參考的算法在里面,所以決定來嘗試下。逐層剖析,同時在網上看到了一個實現,大體上看了下其實現,代碼寫的非常爛,閱讀難度非常大,對于后期想在其寄出上造個輪子來說是比較困難的。平時開發中,很多輪都不能完全match我們的需求,因此需要我們具備自身拆輪能力,而作為一個造輪者,除了完成需求,應該盡可能的使輪具備更好的泛化能力。
對于刻度盤的繪制,首先要知道的是,一個刻度盤包含哪些東西,哪些需要我們去繪制的,對刻度盤進行了一個拆分之后,然后逐個去繪制,此時就沒有這么難了。
刻度:刻度盤,首先要有的必然是刻度,如下圖中的所示,對于刻度,我們需要有長刻度和短刻度,長刻度也就是我們的大的單位。然后是其中的最小單位,也就是一個個的小刻度。
文字標量:刻度盤中的文字標量,對于刻度盤,我們需要文字來準確直觀的描述,每一個刻度所度量的大小,因此,我們需要在刻度上,對于大小進行一個標注。
指針:對于表示我們的當前值的大小,我們需要一個指針來指向我們的當前值,這個時候我們需要根據提供的數值的大小,繪制一個指針來表示當前的值,指向刻度盤上的當前位置。
因此,我們可以得出,對于一個刻度盤的繪制,需要對于三個部分的繪制綜合得到。以繪制弧形的舉例。
繪制弧形,首先是對于刻度的繪制,我們需要根據提供整個圓弧的角度和數值的范圍來將刻度盤進行分割,分割完成之后,對其進行繪制,這個時候,如何繪制呢?從什么地方開始繪制,畫刻度,無非是提供線的兩端,然后畫一條線,那么問題就是在于如何如何找到這條線的兩端的坐標,這個時候,需要我們運用一些數學知識,來進行計算,根據角度來計算。這個時候需要我們計算出起始角度,然后根據每當我們畫出一個刻度,就加上相應的角度值,最后得到每一個刻度所處的角度,然后根據余弦公式,表示當前的角度。
double x1 = Math.cos(startAngle - num * major * dunit) * r + width / 2;
double y1 = height - yOffset - Math.sin(startAngle - num * major * dunit) * r;
double x2 = Math.cos(startAngle - num * major * dunit) * r * 0.75 + width / 2;
double y2 = height - yOffset - Math.sin(startAngle - num * major * dunit) * r * 0.75;
具體代碼的實現可以參考本人github開源代碼。
實現效果
線性刻度盤
弧形刻度盤
半圓中心刻度盤
圓形刻度盤
開源實現
Github地址
Java 華為開源鏡像站 Mirrors
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。