안드로이드 개발 질문/답변
(글 수 45,052)
public class RelativeLayoutEx extends RelativeLayout {
private CONTROL_DEFINE m_Define;
int m_vGravity;
int m_hGravity;
ImageView m_Icon;
TextView m_Text;
Bitmap m_Image;
public final static int CTRLSTATE_NORMAL = 1;
public final static int CTRLSTATE_TOUCH = 2;
public final static int CTRLSTATE_ACTIVE = 3;
public final static int CTRLSTATE_DIM = 4;
int m_usActionState;
public void recycle()
{
m_Define = null;
if(m_Icon.getBackground() != null)
{
((BitmapDrawable)m_Icon.getBackground()).getBitmap().recycle();
m_Icon.getBackground().setCallback(null);
}
if(getBackground() != null)
{
((BitmapDrawable)getBackground()).getBitmap().recycle();
getBackground().setCallback(null);
}
}
private void BitmapRecycle()
{
if(m_Icon.getBackground() != null)
{
((BitmapDrawable)m_Icon.getBackground()).getBitmap().recycle();
m_Icon.getBackground().setCallback(null);
}
if(getBackground() != null)
{
((BitmapDrawable)getBackground()).getBitmap().recycle();
getBackground().setCallback(null);
}
}
public RelativeLayoutEx(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
init();
}
public RelativeLayoutEx(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
init();
}
public RelativeLayoutEx(Context context) {
super(context);
// TODO Auto-generated constructor stub
init();
}
private void init()
{
m_usActionState = CTRLSTATE_NORMAL;
m_Icon = new ImageView(getContext());
addView(m_Icon);
m_Text = new TextView(getContext());
addView(m_Text);
String tag = getTag().toString();
m_Define = new CONTROL_DEFINE();
m_Define.Parsing(tag);
SetDisplay(m_Define.TYPE_N);
}
private void SetDisplay(CONTROL_TYPE_DEFINE Type)
{
if((Type.ALIGN & CONTROL_DEFINE.DT_BOTTOM) != 0)
m_vGravity = Gravity.BOTTOM;
else if((Type.ALIGN & CONTROL_DEFINE.DT_VCENTER) != 0)
m_vGravity = Gravity.CENTER_VERTICAL;
else
m_vGravity = Gravity.TOP;
if((Type.ALIGN & CONTROL_DEFINE.DT_RIGHT) != 0)
m_hGravity = Gravity.RIGHT;
else if((Type.ALIGN & CONTROL_DEFINE.DT_CENTER) != 0)
m_hGravity = Gravity.CENTER_HORIZONTAL;
else
m_hGravity = Gravity.LEFT;
setGravity(m_vGravity|m_hGravity);
int paddingLeft = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, Type.TEXT_X, getContext().getResources().getDisplayMetrics());
int paddingTop = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, Type.TEXT_Y, getContext().getResources().getDisplayMetrics());
((MarginLayoutParams)m_Text.getLayoutParams()).leftMargin = paddingLeft;
((MarginLayoutParams)m_Text.getLayoutParams()).topMargin = paddingTop;
m_Text.setTextColor(Color.argb(255, Type.R, Type.G, Type.B));
m_Text.setTextSize(Type.SIZE);
if(Type.equals(m_Define.TYPE_T))
{
BitmapRecycle();
setBackgroundDrawable(ResourceLoader.getInstance().GetDrawableImage(Type.RSC));
if((m_Define.KIND_ATTR1 & CONTROL_DEFINE.RSC_ICON1_TOUCH) != 0)
{
Drawable m_ICON1 = ResourceLoader.getInstance().GetDrawableImage(m_Define.ICON1.ICON);
int icon_x = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, m_Define.ICON1.ICON_X, getContext().getResources().getDisplayMetrics());
int icon_y = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, m_Define.ICON1.ICON_Y, getContext().getResources().getDisplayMetrics());
if(m_ICON1 != null)
{
((MarginLayoutParams)m_Icon.getLayoutParams()).leftMargin = icon_x;
((MarginLayoutParams)m_Icon.getLayoutParams()).topMargin = icon_y;
m_Icon.getLayoutParams().width = (int)(m_ICON1.getIntrinsicWidth()*1.5);
m_Icon.getLayoutParams().height = (int)(m_ICON1.getIntrinsicHeight()*1.5);
}
m_Icon.setBackgroundDrawable(m_ICON1);
}
if((m_Define.KIND_ATTR1 & CONTROL_DEFINE.RSC_ICON2_TOUCH) != 0)
{
Drawable m_ICON2 = ResourceLoader.getInstance().GetDrawableImage(m_Define.ICON2.ICON);
int icon_x = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, m_Define.ICON2.ICON_X, getContext().getResources().getDisplayMetrics());
int icon_y = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, m_Define.ICON2.ICON_Y, getContext().getResources().getDisplayMetrics());
if(m_ICON2 != null)
{
((MarginLayoutParams)m_Icon.getLayoutParams()).leftMargin = icon_x;
((MarginLayoutParams)m_Icon.getLayoutParams()).topMargin = icon_y;
m_Icon.getLayoutParams().width = (int)(m_ICON2.getIntrinsicWidth()*1.5);
m_Icon.getLayoutParams().height = (int)(m_ICON2.getIntrinsicHeight()*1.5);
}
m_Icon.setBackgroundDrawable(m_ICON2);
}
}
else if(Type.equals(m_Define.TYPE_C))
{
BitmapRecycle();
setBackgroundDrawable(ResourceLoader.getInstance().GetDrawableImage(Type.RSC));
if((m_Define.KIND_ATTR1 & CONTROL_DEFINE.RSC_ICON1_ACTIVE) != 0)
{
Drawable m_ICON1 = ResourceLoader.getInstance().GetDrawableImage(m_Define.ICON1.ICON);
int icon_x = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, m_Define.ICON1.ICON_X, getContext().getResources().getDisplayMetrics());
int icon_y = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, m_Define.ICON1.ICON_Y, getContext().getResources().getDisplayMetrics());
if(m_ICON1 != null)
{
((MarginLayoutParams)m_Icon.getLayoutParams()).leftMargin = icon_x;
((MarginLayoutParams)m_Icon.getLayoutParams()).topMargin = icon_y;
m_Icon.getLayoutParams().width = (int)(m_ICON1.getIntrinsicWidth()*1.5);
m_Icon.getLayoutParams().height = (int)(m_ICON1.getIntrinsicHeight()*1.5);
}
m_Icon.setBackgroundDrawable(m_ICON1);
}
if((m_Define.KIND_ATTR1 & CONTROL_DEFINE.RSC_ICON2_ACTIVE) != 0)
{
Drawable m_ICON2 = ResourceLoader.getInstance().GetDrawableImage(m_Define.ICON2.ICON);
int icon_x = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, m_Define.ICON2.ICON_X, getContext().getResources().getDisplayMetrics());
int icon_y = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, m_Define.ICON2.ICON_Y, getContext().getResources().getDisplayMetrics());
if(m_ICON2 != null)
{
((MarginLayoutParams)m_Icon.getLayoutParams()).leftMargin = icon_x;
((MarginLayoutParams)m_Icon.getLayoutParams()).topMargin = icon_y;
m_Icon.getLayoutParams().width = (int)(m_ICON2.getIntrinsicWidth()*1.5);
m_Icon.getLayoutParams().height = (int)(m_ICON2.getIntrinsicHeight()*1.5);
}
m_Icon.setBackgroundDrawable(m_ICON2);
}
}
else if(Type.equals(m_Define.TYPE_D))
{
BitmapRecycle();
setBackgroundDrawable(ResourceLoader.getInstance().GetDrawableImage(Type.RSC));
if((m_Define.KIND_ATTR1 & CONTROL_DEFINE.RSC_ICON1_DIM) != 0)
{
Drawable m_ICON1 = ResourceLoader.getInstance().GetDrawableImage(m_Define.ICON1.ICON);
int icon_x = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, m_Define.ICON1.ICON_X, getContext().getResources().getDisplayMetrics());
int icon_y = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, m_Define.ICON1.ICON_Y, getContext().getResources().getDisplayMetrics());
if(m_ICON1 != null)
{
((MarginLayoutParams)m_Icon.getLayoutParams()).leftMargin = icon_x;
((MarginLayoutParams)m_Icon.getLayoutParams()).topMargin = icon_y;
m_Icon.getLayoutParams().width = (int)(m_ICON1.getIntrinsicWidth()*1.5);
m_Icon.getLayoutParams().height = (int)(m_ICON1.getIntrinsicHeight()*1.5);
}
m_Icon.setBackgroundDrawable(m_ICON1);
}
if((m_Define.KIND_ATTR1 & CONTROL_DEFINE.RSC_ICON2_DIM) != 0)
{
Drawable m_ICON2 = ResourceLoader.getInstance().GetDrawableImage(m_Define.ICON2.ICON);
int icon_x = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, m_Define.ICON2.ICON_X, getContext().getResources().getDisplayMetrics());
int icon_y = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, m_Define.ICON2.ICON_Y, getContext().getResources().getDisplayMetrics());
if(m_ICON2 != null)
{
((MarginLayoutParams)m_Icon.getLayoutParams()).leftMargin = icon_x;
((MarginLayoutParams)m_Icon.getLayoutParams()).topMargin = icon_y;
m_Icon.getLayoutParams().width = (int)(m_ICON2.getIntrinsicWidth()*1.5);
m_Icon.getLayoutParams().height = (int)(m_ICON2.getIntrinsicHeight()*1.5);
}
m_Icon.setBackgroundDrawable(m_ICON2);
}
}
else
{
BitmapRecycle();
setBackgroundDrawable(ResourceLoader.getInstance().GetDrawableImage(Type.RSC));
if((m_Define.KIND_ATTR1 & CONTROL_DEFINE.RSC_ICON1_NORMAL) != 0)
{
Drawable m_ICON1 = ResourceLoader.getInstance().GetDrawableImage(m_Define.ICON1.ICON);
int icon_x = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, m_Define.ICON1.ICON_X, getContext().getResources().getDisplayMetrics());
int icon_y = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, m_Define.ICON1.ICON_Y, getContext().getResources().getDisplayMetrics());
if(m_ICON1 != null)
{
m_Icon.getLayoutParams().width = (int)(m_ICON1.getIntrinsicWidth()*1.5);
m_Icon.getLayoutParams().height = (int)(m_ICON1.getIntrinsicHeight()*1.5);
((MarginLayoutParams)m_Icon.getLayoutParams()).leftMargin = icon_x;
((MarginLayoutParams)m_Icon.getLayoutParams()).topMargin = icon_y;
}
m_Icon.setBackgroundDrawable(m_ICON1);
}
if((m_Define.KIND_ATTR1 & CONTROL_DEFINE.RSC_ICON2_NORMAL) != 0)
{
Drawable m_ICON2 = ResourceLoader.getInstance().GetDrawableImage(m_Define.ICON2.ICON);
int icon_x = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, m_Define.ICON2.ICON_X, getContext().getResources().getDisplayMetrics());
int icon_y = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, m_Define.ICON2.ICON_Y, getContext().getResources().getDisplayMetrics());
if(m_ICON2 != null)
{
((MarginLayoutParams)m_Icon.getLayoutParams()).leftMargin = icon_x;
((MarginLayoutParams)m_Icon.getLayoutParams()).topMargin = icon_y;
m_Icon.getLayoutParams().width = (int)(m_ICON2.getIntrinsicWidth()*1.5);
m_Icon.getLayoutParams().height = (int)(m_ICON2.getIntrinsicHeight()*1.5);
}
m_Icon.setBackgroundDrawable(m_ICON2);
}
}
if(m_Image != null)
setBackgroundDrawable(new BitmapDrawable(m_Image));
}
대충 위와 같은 커스텀 레이아웃이 있습니다.
RelativeLayout을 상속 받았고, SetGravity로 내부 뷰들의 위치를 지정해주려고 하는데,
레이아웃의 속성은 변경되나 화면에 보여지는 View 들이 제 위치를 못찾아가고 있습니다.
Vertical 속성은 어느정도 움직여주는듯 하나, Horizontal 속성이 전혀 반영되고 있지 않습니다.
밖에서 따로 처리해주는 부분은 없고, 저 상태로만 그려지는건데 제가 혹 잘못 넣은 부분이라도 있는걸까요??
고수님들의 답변을 기다리겠습니다.



