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