안드로이드 비트맵 알파 마스크 적용 예제
SurfaceView.onDraw(Canvas canvas) 안에서 알파 마스킹을 적용하는 예
소스코드
사용된 배경 이미지(mountain.jpg) 알파 마스킹 이미지(alpha_mask.png, 흰색 타원은 투명하게 처리된 영역)
Canvas에 배경 이미지를 먼저 그리고 그 위에 마스킹 이미지를 그린다.
마스킹 이미지를 그릴 때 모드 설정은 다양하게 할 수 있지만 여기서는 2가지를 테스트한다.PorterDuff 모드 설정을 PorterDuff.Mode.DST_OUT, PorterDuff.Mode.DST_IN으로 적용해보면 다음과 같은 차이점을 확인할 수 있다.
PorterDuff.Mode.DST_OUT 으로 설정한 경우 출력화면 PorterDuff.Mode.DST_IN 으로 설정한 경우 출력화면
위의 결과를 게임 등에서도 응용할 수 있을 것이다. 예를 들어, DST_IN으로 설정한 효과는 이미지의 일부 영역을 투명하게 하여 먼 곳에 있는 배경을 볼 수 있게 되므로 포탄 등에 의해 일부가 파괴된 지형지물을 표현할 때 유용하게 사용할 수 있을 것이다.
SurfaceView.onDraw()
@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(Color.CYAN);
Canvas c = new Canvas();
Bitmap mainImage = BitmapFactory.decodeResource(getResources(),R.drawable.mountain);
Bitmap mask = BitmapFactory.decodeResource(getResources(), R.drawable.alpha_mask);
Bitmap result = Bitmap.createBitmap(mainImage .getWidth(), mainImage .getHeight(), Bitmap.Config.ARGB_8888);
c.setBitmap(result);
c.drawBitmap(mainImage, 0, 0, null);
Paint paint = new Paint();
paint.setFilterBitmap(false);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN) ); // DST_OUT
c.drawBitmap(mask, 0, 0, paint);
paint.setXfermode(null);
canvas.drawBitmap(result, 0, 0, null);
}