며칠을 고심 끝에, 찾아냈다고 해야하나 당연하다고 해야 하나…ㅡ,.ㅡa
이전 STB(셋탑박스)에 들어갈 미들웨어의 일부분이 될 application 인 SETUP 프로그램을 개발 중이었다.
TV STB인 관계로 프로그램을 시청하는 중에 “메뉴”버튼을 클릭하면 SETUP 메뉴가 나타나야 한다.
그러다 보니, SETUP 프로그램이 화면 전체를 가리지 않는 이상, SETUP 프로그램 뒤 배경에 영상이 나오게 된다.
디자인적인 미적 효과를 넣게 되면, 뒤 배경 영상 위로 알파값(alpha)을 적용해서 뿌옇게 처리한다던가 등의 왜곡(?)을 줄 수 있겠다.
그 알파값 적용을,
Color c = new Color(r,g,b,a);
g.setColor(c);
g.fillRect(x, y, width, height);
메소드를 통해 화면 구현을 했다.
이 내용을 더블버퍼링으로 변경하면,
Dimension d = getSize();
if ((offGraphics == null) || (d.width != offDimension.width) || (d.height != offDimension.height)) {
offDimension = d;
offImage = createImage(d.width, d.height);
offGraphics = offImage.getGraphics();
}
// (1) offGraphics.clearRect(0, 0, d.width, d.height);
// (2) 최초 배경색으로 채운다. 알파값 적용.
offGraphics.setColor(getBackground());
offGraphics.fillRect(0, 0, d.width, d.height);
// (3) 원하는 알파값을 채운다.
offGraphics.setColor(new java.awt.Color(255, 0, 0, 45));
offGraphics.fillRect(0, 0, 500, 100);
//화면 개체를 그린다.
paintUI(offGraphics);
//실제 화면에 출력한다.
if (offImage != null)
g.drawImage(offImage, 0, 0, null);
위와 같이 구현할 수 있다.
그런데, 알파값을 적용할 경우, 고려 사항이 있는데, 더블 버퍼링을 구현 함에 있어, 내부 버퍼에서 그림을 그리는 Graphics context를 초기화-clear- 를 하지 않으면, 실제 화면 출력시에 알파값 적용 부분이 처음부터 중첩이 되어 나타나게 된다. 즉, 알파값 적용 부분이 점점 진해져서 알파값 적용이 없어지게 된다.
이때에는, 필히 내부 버퍼의 Graphics context를 clear 해 주도록 하자.
위 코드에서 (1) 부분의 주석을 풀어주면 된다.
물론, 보이지않는 내부 버퍼이긴하나 영역 크기만큼 clear 시키는 거라 시간이 지연되긴 한다.