![](/img/trans.png)
[英]How to create a custom Java Swing GUI Component with a shape and gradient
[英]How to create custom shape in java
我正在做一些Java游戲,我認為如果制作游戲時不導入圖像會很酷。 因此,我需要創建自定義形狀並將其交給Graphics對象進行繪制。 我游戲中的主要角色將是一個像粘液一樣的團子,由一個不完美的圓圈和兩條垂直線組成。 我應該能夠通過給定一個指示大小的參數來構造dango。 另外,如果我可以修改眼睛的位置或底部曲線以呈現與地板的交互作用,那會更好。 更進一步,如果能夠為它填充顏色並為其賦予一些質感或其他功能,我將感到非常高興。 但是,所有事物都從一個圓和兩條直線開始。
我檢查了一些API,包括Shape
, GeneralPath
, PathIterator
, Area
, Ellipse
和一些源代碼。 我學習了如何使用GeneralPath繪制直線,二次曲線和貝塞爾曲線。 但是我仍然不知道如何實現自定義形狀。 我在stackoverflow中發現了這個問題 ,但沒有給出好的答案。
如果有人只是讀了標題而跳過了該問題的內容,我將強調該問題與創建自定義形狀有關,這意味着實現“形狀”界面。 不只是畫一個形狀。
因此,經過一天的研究,我終於做到了。 對於與我有相同問題的任何人,我建議您做我所做的事情。
首先,參考java api源代碼,在這里我選擇了Ellipse2D.class的源代碼。 在源代碼之后,您可以忽略2個內部靜態類Ellipse2D.Double
, Ellipse2D.Float
,它們在這一點上並不重要。
要實現Shape
接口,最重要的方法是
public PathIterator getPathIterator(AffineTransform at) {
return new EllipseIterator(this, at);
}
paintComponent調用此方法以獲取要繪制的PathIterator
。 因此,就像源代碼一樣,您可以創建自己的ShapeIterator
。
然后是EllipseIterator的源代碼。 如您所見,有4種方法(不包括構造函數和重復方法)。 您可以將getWindingRule()
研究。 雖然isDone()
和next()
很容易理解。
然后,讓我們集中討論public int currentSegment(float[] args)
。
返回值是int,應該是靜態的final int字段: SEG_CLOSE
, SEG_CUBICTO
等。它們提供繪制形狀的說明。 SEG_MOVE
將移動起點, SEG_LINETO
將繪制一條從起點到終點的直線。 還有更多類似二次曲線和貝塞爾曲線的曲線,您可以在Java api上查看詳細信息。
參數float[] args
也應視為返回值語句。 它提供上述說明的參數。 對於SEG_MOVETO
, SEG_LINETO
,您需要2個參數,因此請修改args [0]和args [1](x和y)。 對於SEG_QUADTO
,您需要4個參數,而SEG_CUBICTO
需要6個參數。
認真遵循源代碼,創建形狀並不難。 我還沒有完成Shape接口中的所有方法,但是g2d實例已經可以繪制形狀了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.