/**
* galaxy inc.
* meetup client for android
*/
package com.galaxy.meetup.client.android.ui.view;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.Display;
import android.view.View;
import android.view.WindowManager;
import android.widget.RelativeLayout;
import com.galaxy.meetup.client.android.R;
/**
*
* @author sihai
*
*/
public class ScaledLayout extends RelativeLayout {
private final Rect mDispSize;
private final Display mDisplay;
private MarginMode mMarginMode;
private float mScaleHeight;
private float mScaleMarginBottom;
private float mScaleMarginLeft;
private float mScaleMarginRight;
private float mScaleMarginTop;
private float mScaleWidth;
public ScaledLayout(Context context)
{
this(context, null);
}
public ScaledLayout(Context context, AttributeSet attributeset)
{
this(context, attributeset, 0);
}
public ScaledLayout(Context context, AttributeSet attributeset, int i)
{
super(context, attributeset, i);
mScaleWidth = 1.0F;
mScaleHeight = 1.0F;
mScaleMarginLeft = 0.0F;
mScaleMarginRight = 0.0F;
mScaleMarginTop = 0.0F;
mScaleMarginBottom = 0.0F;
mMarginMode = MarginMode.SCALE_MARGIN_NONE;
if(attributeset != null)
{
TypedArray typedarray = context.obtainStyledAttributes(attributeset, R.styleable.ScaledLayout, i, 0);
if(typedarray != null)
{
int j;
if(typedarray.hasValue(0))
{
float f1 = typedarray.getFloat(0, 1.0F);
mScaleWidth = f1;
mScaleHeight = f1;
} else
{
mScaleWidth = typedarray.getFloat(2, 1.0F);
mScaleHeight = typedarray.getFloat(1, 1.0F);
}
if(typedarray.hasValue(3))
{
float f = typedarray.getFloat(3, 0.0F);
mScaleMarginLeft = f;
mScaleMarginRight = f;
mScaleMarginTop = f;
mScaleMarginBottom = f;
} else
{
mScaleMarginLeft = typedarray.getFloat(6, 0.0F);
mScaleMarginRight = typedarray.getFloat(7, 0.0F);
mScaleMarginTop = typedarray.getFloat(4, 0.0F);
mScaleMarginBottom = typedarray.getFloat(5, 0.0F);
}
j = typedarray.getInt(8, 0);
if(j == 1)
mMarginMode = MarginMode.SCALE_MARGIN_INDEPENDENT;
else
if(j == 2)
mMarginMode = MarginMode.SCALE_MARGIN_LONG_EDGE;
else
if(j == 3)
mMarginMode = MarginMode.SCALE_MARGIN_SHORT_EDGE;
else
mMarginMode = MarginMode.SCALE_MARGIN_NONE;
typedarray.recycle();
}
}
mDisplay = ((WindowManager)getContext().getSystemService("window")).getDefaultDisplay();
mDispSize = new Rect();
}
protected void onMeasure(int i, int j)
{
android.view.ViewGroup.MarginLayoutParams marginlayoutparams;
int k = android.view.View.MeasureSpec.getMode(i);
int l = android.view.View.MeasureSpec.getSize(i);
int i1 = android.view.View.MeasureSpec.getMode(j);
int j1 = android.view.View.MeasureSpec.getSize(j);
marginlayoutparams = (android.view.ViewGroup.MarginLayoutParams)getLayoutParams();
boolean flag;
int k1;
int l1;
int i2;
int j2;
if(mMarginMode == MarginMode.SCALE_MARGIN_INDEPENDENT || mMarginMode == MarginMode.SCALE_MARGIN_LONG_EDGE || mMarginMode == MarginMode.SCALE_MARGIN_SHORT_EDGE)
flag = true;
else
flag = false;
k1 = l;
l1 = getMeasuredWidth();
if(k == 0x80000000 && mScaleWidth > 0.0F)
{
int l3 = marginlayoutparams.leftMargin + marginlayoutparams.rightMargin;
if(flag && l == l1 + l3)
k1 = l1;
else
k1 = (int)((float)(l + l3) * mScaleWidth);
k = 0x40000000;
} else
if(k == 0 && l <= 0)
k1 = l1;
i2 = j1;
j2 = getMeasuredHeight();
if(i1 == 0x80000000 && mScaleHeight > 0.0F)
{
int k3 = marginlayoutparams.topMargin + marginlayoutparams.bottomMargin;
if(flag && j1 == j2 + k3)
i2 = j2;
else
i2 = (int)((float)(j1 + k3) * mScaleHeight);
i1 = 0x40000000;
} else
if(i1 == 0 && j1 <= 0)
i2 = j2;
setMeasuredDimension(k1, i2);
super.onMeasure(android.view.View.MeasureSpec.makeMeasureSpec(k1, k), android.view.View.MeasureSpec.makeMeasureSpec(i2, i1));
if(!flag) {
return;
}
int k2;
int l2;
int i3;
int j3;
android.view.ViewParent viewparent;
do
viewparent = getParent();
while(viewparent != null && !(viewparent instanceof View));
if(viewparent != null)
{
View view = (View)viewparent;
k2 = view.getMeasuredWidth();
l2 = view.getMeasuredHeight();
} else
{
mDisplay.getRectSize(mDispSize);
k2 = mDispSize.width();
l2 = mDispSize.height();
}
if(k2 < l2)
{
i3 = k2;
j3 = l2;
} else
{
i3 = l2;
j3 = k2;
}
if(MarginMode.SCALE_MARGIN_INDEPENDENT == mMarginMode) {
} else if(MarginMode.SCALE_MARGIN_LONG_EDGE == mMarginMode) {
marginlayoutparams.topMargin = (int)((float)j3 * mScaleMarginTop);
marginlayoutparams.bottomMargin = (int)((float)j3 * mScaleMarginBottom);
marginlayoutparams.leftMargin = (int)((float)j3 * mScaleMarginLeft);
marginlayoutparams.rightMargin = (int)((float)j3 * mScaleMarginRight);
} else if (MarginMode.SCALE_MARGIN_SHORT_EDGE == mMarginMode) {
marginlayoutparams.topMargin = (int)((float)i3 * mScaleMarginTop);
marginlayoutparams.bottomMargin = (int)((float)i3 * mScaleMarginBottom);
marginlayoutparams.leftMargin = (int)((float)i3 * mScaleMarginLeft);
marginlayoutparams.rightMargin = (int)((float)i3 * mScaleMarginRight);
}
setLayoutParams(marginlayoutparams);
}
public void setScale(float f)
{
mScaleWidth = f;
mScaleHeight = f;
}
public void setScaleHeight(float f)
{
mScaleHeight = f;
}
public void setScaleMargin(float f)
{
mScaleMarginBottom = f;
mScaleMarginRight = f;
mScaleMarginLeft = f;
mScaleMarginTop = f;
}
public void setScaleMarginBottom(float f)
{
mScaleMarginBottom = f;
}
public void setScaleMarginLeft(float f)
{
mScaleMarginLeft = f;
}
public void setScaleMarginMode(MarginMode marginmode)
{
mMarginMode = marginmode;
}
public void setScaleMarginRight(float f)
{
mScaleMarginRight = f;
}
public void setScaleMarginTop(float f)
{
mScaleMarginTop = f;
}
public void setScaleWidth(float f)
{
mScaleWidth = f;
}
//==================================================================================================================
// Inner class
//==================================================================================================================
public static enum MarginMode {
SCALE_MARGIN_NONE,
SCALE_MARGIN_INDEPENDENT,
SCALE_MARGIN_LONG_EDGE,
SCALE_MARGIN_SHORT_EDGE;
}
}