Java에서 그림을 그리기위한 "반전 된"클립 영역을 가질 수있는 방법이 있습니까?

StackOverflow https://stackoverflow.com/questions/1273688

  •  16-09-2019
  •  | 
  •  

문제

Graphics.fillRoundRect ()를 사용하여 영역을 채우고 싶지만 그 중간에 사각형을 원합니다. ~ 아니다 채워집니다.

기본적으로 100x30의 구성 요소가 주어지면 클리핑을 크기 80x10의 10,10에서 사각형으로 설정하고 싶지만 채우기 만 영역을 페인트 할 수 있습니다. 밖의 그 80x10 사각형. 그 이유는 내부 구성 요소 영역에 영향을 미치지 않고 곡선 윤곽선이 페인트 된 N 픽셀 경계를 원하기 때문입니다.

지금까지 볼 수있는 가장 좋은 방법은 10,10 90x10으로 클립하고 FillRoundRect ()를 수행 한 다음 90,10 10x10으로 클립하고 오른쪽 아래, 모서리 위와 위를 채우기 위해 FillRect ()를 수행하는 것입니다.

한 줄의 사각형을 간단하게 다시 칠한 경우 곡선이 상당히 인접하지 않기 때문에 코너에서 "스팟 팅"으로 끝납니다 (및/또는 AA가 주변 픽셀에 영향을 미치기 때문입니다).

편집 : 경고 - J2ME AWT (개인 프로필이 포함 된 CDC) 및 J2SE와 함께 작동하는 방법이 필요합니다.


편집 : 또 다른 비슷한 질문 있습니다 답변 나는 적응할 수 있었다. 내 상황에 대해 올바르게 작동하는 코드는 자체 답변으로 게시됩니다.

도움이 되었습니까?

해결책

나는있다 비슷한 대답 다른 질문에서도 다각형을 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));

다른 팁

내 답변을 확인하십시오 이것 의문. 매우 비슷합니다.

편집 : Alphacomposite를 J2ME에서 사용할 수 있는지 확인할 수 있습니다. Java에서는 Alpha Composite 모드를 변경하여 클립을 시뮬레이션 할 수 있으며 (SRCIN이 정확히 생각하는지 기억할 수 없습니다)와 흑백 영역이있는 이미지에 그림을 그렸습니다. 확인하고 싶을 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top