package org.commcare.views; import android.content.Context; import android.util.AttributeSet; import android.widget.FrameLayout; /** * A layout that will enforce a given aspect ratio. Layout should define the attributes ratio_width and ratio_height. * @author jschweers */ public class AspectRatioLayout extends FrameLayout { private float mRatioWidth; private float mRatioHeight; public AspectRatioLayout(Context context) { super(context); } public AspectRatioLayout(Context context, AttributeSet attrs) { super(context, attrs); initializeRatio(attrs); } public AspectRatioLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); initializeRatio(attrs); } /** * Set layout's aspect ratio. */ public void setRatio(float ratioWidth, float ratioHeight) { mRatioWidth = ratioWidth; mRatioHeight = ratioHeight; } private void initializeRatio(AttributeSet attrs) { if(!isInEditMode()) { String namespace = "http://schemas.android.com/apk/lib/" + this.getClass().getPackage().getName(); mRatioWidth = attrs.getAttributeFloatValue(namespace, "ratio_width", 1); mRatioHeight = attrs.getAttributeFloatValue(namespace, "ratio_height", 1); } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure( MeasureSpec.makeMeasureSpec(widthMeasureSpec, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec((int) (widthMeasureSpec * mRatioHeight / mRatioWidth), MeasureSpec.EXACTLY) ); } }