본문 바로가기

프로그래밍/Android

투명한 레이아웃 만들기

투명 레이아웃이야 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" )

'프로그래밍 > Android' 카테고리의 다른 글

커스텀속성과 R.styleable  (0) 2009.11.25
Splash window 보이기  (0) 2009.11.24
TextButton 만들기  (0) 2009.11.22
버튼 상태에 따른 배경변경  (0) 2009.11.22
에니메이션 처리하기  (0) 2009.11.19
메시지 핸들러 사용하기  (0) 2009.11.16
리시버를 통한 sms데이터 가져오기  (0) 2009.11.16
Broadcast/BroadcastReceiver  (0) 2009.11.11
AlarmManger 사용  (0) 2009.11.10
AsyncTask 이해하기  (0) 2009.11.09