프로그래밍/Android

투명한 레이아웃 만들기

chance 2009. 11. 18. 18:29

투명 레이아웃이야 android:background="#80RRGGBB"

이렇게 설정하면 투명한 레이아웃 바탕이 만들어진다.

헌데, 요것만으론 좀 밋밋한 맛이~ ㅎㅎ -_-;;

 

요걸 커스텀한 모습으로 구현하려면 무얼 해야 하나?

 

레이아웃 구현 : 별다른 사항은 없으며 dispatchDraw() 메쏘드를 오버라이드해

구현해 주면 된다. 레이아웃은 onDraw를 호출하지 않으며 배경을 그리기위한 dispatchDraw를

호출한다. 따라서, 이 메쏘드를 오버라이드해서 별도의 처리를 더해주면 끝.

 

정확히 말하자면 레이아웃(ViewGroup)은 onDraw()를 호출하지 않도록 설정되어있다.

레이아웃에서 onDraw 메쏘드를 사용하려면 setWillNotDrawEnabled(false); 를 호출해 주면 된다.

레이아웃은 말 그대로 뷰들의 자리배치를 위한 레이아웃일 뿐이므로 기본값은 onDraw를 사용하지 않는

것이다.

 

 

아래 예제에서  내부를 칠할 Paint 객체의 알파값이 225 설정되었음을 알수있다.

 

public class Transparent extends LinearLayout {

private Paint inner, border;

 

// 생성자, 초기화 메쏘드만 추가한다.

public Transparent( Context context, AttributeSet attrs ) {

super( context, attrs );

init();

}

 

// 필요한 색상정보를 설정합니다.

private void init() {

inner = new Paint();

innner.setARGB( 225, 75, 75, 75);

inner.setAntiAlias(true);

 

border = new Paint();

border.setARGB( 255,255,255,255);

border.setAntiAlias(true);

border.setStyle(Style.STROKE);

border.setStrokeWidth(2);

}

 

// dispatchDraw  를 오버라이드한다.

protected void dispatchDraw(Canvas canvas ) {

RectF drawRect = new RectF();

drawRect.set(0, 0, getMeasuredWidth(), getMeasuredHeight());

 

canvas.drawRoundRect(drawRect, 5, 5, inner);

canvas.drawRoundRect(drawRect, 5,5, border);

 

super.dispatchDraw( canvas );

}

}

 

 

 

레이아웃 구성 : 원하는 레이웃을에 위 레이아웃을 끼워 넣으면 된다.

 

<my.package.Transparent

android:id="@+id/transparent"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

.

.

 

</my.package.tranparent>

 

이것만으로도 원하는 모습이 나타나는데, SurfaceView등과 함께 사용될 경우

약간의 문제가 발생된다. SurfaceView 아래로 숨어버리는 증상.

 

이런경우 이 레이아웃의 배경색을 0x00RRGGBB( 완전투명 ) 으로 설정하면 정상동작한다.

( android:background="#00000000" )