2009-08-13 71 views
3

我想用Graphics.fillRoundRect()來填充一個區域,但是我想在它的中間有一個矩形來填充而不是有什麼辦法可以在Java中繪製一個「反轉」剪輯區域?

本質上說,鑑於100x30一個組成部分,我想設置剪輯是在大小80x10的10,10的長方形,但有填充只畫面積是80x10的矩形。原因是我想要繪製一個彎曲輪廓的n像素的邊框,而不影響內部組件區域。

目前爲止我看到的最好的方法是剪切到10,10 90x10,然後做fillRoundRect(),然後剪裁到90,10 10x10,然後做一個fillRect()來填充右邊的下面和在角落之上。

如果我簡單地重畫一個單線矩形,那麼我最終會在角上出現「斑點」,因爲曲線不完全相鄰(和/或因爲AA會影響周圍的像素)。

編輯:警告 - 我需要一種方法來執行它將與J2ME AWT(CDC與個人配置文件1.1)以及J2SE一起工作。


編輯:另一個similar questionan answer我能夠適應。對我的情況正確工作的代碼將作爲自我回答發佈。

+0

不要k現在爲什麼這有一個「objective-c」標籤... – 2009-08-13 19:00:07

+0

@ QUINN:感謝您的更正 - 我在標籤字段中鍵入了*「J2ME」,但我懷疑將標籤字段中的標籤按下切換到編輯摘要標籤,我沒有注意到!我發現標籤字段的標籤行爲非常煩人/違反直覺。 – 2009-08-13 22:26:45

回答

2

對於另一個問題,我也有一個similar answer,也就是使用多邊形作爲AWT剪輯。也許這在J2ME中得到支持?您需要知道要排除的矩形邊界以及繪圖區域的外邊界。

 
+-------------------+ 
| clip drawing area | 
+---+-----------+ | 
| | excluded | | 
| | area | | 
| +-----------+ | 
|     | 
+-------------------+ 

編輯從OP。

這個答案適用於我,並且API在J2ME上受支持。另一個問題的答案似乎有一個錯誤 - 一組座標需要在外部左側和內部頂部開始點以創建一個封閉的多邊形。我的這些工作最終的代碼如下:

創建剪裁形狀,我用這個方法:

static public Shape getOutsideEdge(Graphics gc, Rectangle bb, int top, int lft, int btm, int rgt) { 
    int         ot=bb.y   , it=(ot+top); 
    int         ol=bb.x   , il=(ol+lft); 
    int         ob=(bb.y+bb.height), ib=(ob-btm); 
    int         or=(bb.x+bb.width), ir=(or-rgt); 

    return new Polygon(
    new int[]{ ol, ol, or, or, ol, ol, il, ir, ir, il, il }, 
    new int[]{ it, ot, ot, ob, ob, it, it, it, ib, ib, it }, 
    11 
    ); 
    } 

我設置到圖形上下文,然後充滿了我的矩形:

Rectangle tmp=new Rectangle(px,py,pw,ph); 
gc.setClip(getOutsideEdge(gc,tmp,thickness,thickness,thickness,thickness)); 
gc.fillRoundRect(px,py,pw,ph,RADIUS,RADIUS); 

和然後我通過在每個角落畫一個點創建了圓角內角的錯覺:

gc.setClip(px,py,pw,ph); 
gc.drawLine((px +thickness ),(py +thickness ),(px +thickness ),(py +thickness )); 
gc.drawLine((px+pw-thickness-1),(py +thickness ),(px+pw-thickness-1),(py +thickness )); 
gc.drawLine((px +thickness ),(py+ph-thickness-1),(px +thickness ),(py+ph-thickness-1)); 
gc.drawLine((px+pw-thickness-1),(py+ph-thickness-1),(px+pw-thickness-1),(py+ph-thickness-1)); 
1

請檢查我對this問題的回答。它非常相似。

編輯:你可能想檢查AlphaComposite是否可用j2me。在Java中,您可以通過更改alpha複合模式(我不記得是哪個,我認爲它的srcIn),並通過在具有黑色和白色區域的圖像上繪製來模擬剪輯。你可能想看看它。

+0

是的,它看起來可以用於J2SE,但該解決方案也需要適用於J2ME(該要求本來不包括在內,對不起)。 J2ME PP 1.1沒有java.awt.geom包。人!這是一個必須支持手持設備的痛苦! – 2009-08-13 18:38:48

+0

是的,你應該改變標籤和標題。在我提供的問題中,不是由我來檢查答案。也許這對你有用。 – 2009-08-13 18:42:57

+0

+1指向我一個類似的問題,我有一個答案,我能夠適應一個工作的解決方案。 – 2009-08-13 22:46:38

相關問題