通过onMeasure方法修改布局高跟宽的比例

来源:互联网 发布:linux开源社区 编辑:程序博客网 时间:2024/04/28 14:53


试用于轮播图的屏幕宽跟高的固定比例


自己定义布局继承重写onMeasure方法

<com.sanwn.ddmb.view.AppBarLayoutViewandroid:id="@+id/app_bar"android:layout_width="match_parent"android:layout_height="wrap_content"app:ratio="2">


<declare-styleable name="RatioLayout"><attr name="ratio" format="float" /></declare-styleable>

重写类是实例


public class AppBarLayoutView extends AppBarLayout {private static final String TAG = "RatioLayout";// 宽和高的比例private float ratio = 0.0f;public AppBarLayoutView(Context context) {super(context);}public AppBarLayoutView(Context context, AttributeSet attrs) {super(context, attrs);TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.RatioLayout);ratio = a.getFloat(R.styleable.RatioLayout_ratio, 0.0f);a.recycle();}public void setRatio(float f) {ratio = f;}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int widthMode = MeasureSpec.getMode(widthMeasureSpec);int heightMode = MeasureSpec.getMode(heightMeasureSpec);int width = MeasureSpec.getSize(widthMeasureSpec) - getPaddingLeft() - getPaddingRight();int height = MeasureSpec.getSize(heightMeasureSpec) - getPaddingTop() - getPaddingBottom();if (widthMode == MeasureSpec.EXACTLY && heightMode != MeasureSpec.EXACTLY && ratio != 0.0f) {height = (int) (width / ratio + 0.5f);heightMeasureSpec = MeasureSpec.makeMeasureSpec(height + getPaddingTop() + getPaddingBottom(),MeasureSpec.EXACTLY);} else if (widthMode != MeasureSpec.EXACTLY && heightMode == MeasureSpec.EXACTLY && ratio != 0.0f) {width = (int) (height * ratio + 0.5f);widthMeasureSpec = MeasureSpec.makeMeasureSpec(width + getPaddingLeft() + getPaddingRight(),MeasureSpec.EXACTLY);}Log.d(TAG, "onMeasure: ==="+height+"==="+width);super.onMeasure(widthMeasureSpec, heightMeasureSpec);}}


原创粉丝点击