Question

Je veux remplir une région en utilisant Graphics.fillRoundRect (), mais je veux un rectangle au milieu de celui-ci à pas remplir.

Pour l'essentiel, étant donné un élément de 100x30, je veux mettre clipping être le rectangle à 10,10 de taille 80x10, mais ont le remplissage de la peinture que la zone à l'extérieur ce rectangle de 80x10. La raison en est que je veux une frontière de n pixels avec un contour courbe peint sans affecter la zone de composant à l'intérieur.

La meilleure façon que je peux voir si loin de clipser à 10,10 90X10 et faire le remplir du côté droit fillRoundRect () puis clip pour 90,10 10x10 et faire un fillRect (), au-dessous et au-dessus les coins.

Si je repeindre un rectangle simple, une seule ligne, puis je finis par « spotting » sur les coins parce que les courbes ne sont pas tout buter (et / ou parce que AA affecte les pixels environnants).

EDIT: caveat - je besoin d'une façon de le faire qui travaillera avec J2ME AWT (CDC avec Personal Profile 1.1), ainsi que J2SE

.

Edit: Une autre question similaire a un an répondre j'ai pu adapter. Le code qui fonctionne correctement pour ma situation est affichée comme une auto-réponse.

Était-ce utile?

La solution

Je même réponse autre question aussi, qui consiste à utiliser un polygone en tant que clip AWT. Peut-être cela est pris en charge J2ME? Vous aurez besoin de connaître les limites du rectangle que vous voulez exclure, et les limites extérieures de votre zone de dessin.

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

EDIT DE OP.

Cette réponse a fonctionné pour moi et les années API sont pris en charge sur J2ME. La réponse de l'autre question semble avoir une erreur - l'ensemble des coordonnées doit commencer un point sur la partie supérieure externe gauche et intérieur afin de créer un polygone fermé. Mon code final qui a travaillé suit:

Pour créer une forme de découpage, j'utilisé cette méthode:

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
     );
    }

que je mets dans le contexte graphique, puis rempli mon rectangle:

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);

et puis je crée l'illusion d'arrondi des angles rentrants en peignant un seul point dans chaque coin:

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));

Autres conseils

S'il vous plaît vérifier ma réponse sur cette question . Il est très similaire.

EDIT: vous pouvez vérifier si AlphaComposite est disponible en J2ME. En Java, vous pouvez simuler le clip en changeant le mode alpha composite (je ne me souviens que je pense exactement son srcIn) et en peignant sur une image avec des zones en noir et blanc. Vous pouvez le vérifier.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top