2010-03-31 5 views
7

Android 개발로 시작하고 있으며 JavaScript/HTML 월드에서 시작하고 있으므로 현재 Android SDK의 가능성을 조사 중입니다.Android 캔버스에서의 합성 작업

HTML 5 캔버스는 복합 작업을 지원합니다 (here 참조).

Android Canvas에서 가능합니까? Canvas 클래스의 API를 검사했지만 유용한 것을 찾을 수 없었습니다. 최소한 복합 연산 "원본 - 인"또는 (가능하지 않은 경우) "원본 - 상단"이 필요합니다.

답변

8

Canvas에서 Paint 인 그림은 PorterDuffXfermode을 사용합니다.

Paint p=new Paint(); 
p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DARKEN)); 
canvas.drawBitmap(bitmap, 0, 0, p); 

자세한 내용은 here을 참조하십시오. 또한 테마를 그리는 요소에이 컴포지션을 적용 할 수 있도록 onPaint을 재정의했습니다.

1

이전에는 그런 종류의 작업을 수행하지 않았지만 Rect 모양을 사용하여 작업을 수행하는 방법이 있다고 생각합니다. 사각형을 정의하여 캔바스로 그려야하는 영역이나 소스 이미지에서 가져올 영역을 표시 할 수 있으며 Rect 클래스에는 비교 기능이 내장되어 있습니다. 예를 들어 원본을 모방하려면 setIntersect(Rect boundingBoxOfSource, Rect boundingBoxOfDestination)을 사용하여 새 사각형에 두 이미지의 교차 영역 만 만들 수 있습니다. 그런 다음 해당 사각형을 Canvas의 draw 명령 중 하나에서 인수로 사용하여 해당 사각형 내부의 소스 이미지에서 픽셀 만 가져 오도록 지시 할 수 있습니다. 그런 다음 그리기 명령이 실행되는 순서에 따라 Z 축에서 도면을 제어합니다.

+0

간단한 직사각형으로 클리핑하는 것만으로는 충분하지 않습니다. 복잡한 알파 마스크가 필요합니다. – kayahr

+0

예제에서 소스 - 인과 소스 - 예제에서 알파 - 마스킹이없는 것처럼 보입니다. 그게 네가 한 일이라면, 내가 어떻게 해야할지 모르겠다. 캔버스는 이미 이미지에 이미 투명성이 내장되어있는 경우 그 위에 그려지는 이미지의 '레이어'사이의 투명도를 지원하지만 경험이 많은 사람은 자동으로 블렌딩을 할 수 있는지 여부를 알려야합니다. –

1

나 자신을 발견했습니다. PorterDuffXfermode는 이러한 모든 복합 모드를 구현합니다.