Android自定义View——可以设置最大宽高的FrameLayout
生活随笔
收集整理的這篇文章主要介紹了
Android自定义View——可以设置最大宽高的FrameLayout
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
可以設(shè)置最大寬高的FrameLayout
支持相對父控件的半分比設(shè)置
默認(rèn)優(yōu)先比例設(shè)置
不支持參數(shù)小于零
MaxLayout.java?
import android.util.DisplayMetrics; import android.view.ViewGroup; import android.widget.FrameLayout; import android.content.Context; import android.content.res.TypedArray; import android.util.AttributeSet; import android.view.WindowManager;/*** Created by wangxingsheng on 2018/6/8.** 可以設(shè)置最大寬高的FrameLayout* 默認(rèn)優(yōu)先比例設(shè)置* 不支持參數(shù)小于零**/ public class MaxLayout extends FrameLayout {private float mMaxHeightRatio = -1f;// 優(yōu)先級高private float mMaxHeight = -1f;// 優(yōu)先級低private float mMaxWidthRatio = -1f;// 優(yōu)先級高private float mMaxWidth = -1f;// 優(yōu)先級低private int parentWidth;private int parentHeight;private boolean firstHeightRatio = true;//高默認(rèn)優(yōu)先比例設(shè)置private boolean firstWidthRatio = true;//寬默認(rèn)優(yōu)先比例設(shè)置public MaxLayout(Context context) {super(context);}public MaxLayout(Context context, AttributeSet attrs) {super(context, attrs);initAttrs(context, attrs);}public MaxLayout(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);initAttrs(context, attrs);}private void initAttrs(Context context, AttributeSet attrs) {TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.MaxLayout);if(a!=null){firstHeightRatio = a.getBoolean(R.styleable.MaxLayout_first_ratio_height,true);firstWidthRatio = a.getBoolean(R.styleable.MaxLayout_first_ratio_width,true);mMaxHeightRatio = a.getFloat(R.styleable.MaxLayout_max_height_ratio, -1f);mMaxHeight = a.getDimension(R.styleable.MaxLayout_max_height, -1f);mMaxWidthRatio = a.getFloat(R.styleable.MaxLayout_max_width_ratio, -1f);mMaxWidth = a.getDimension(R.styleable.MaxLayout_max_width, -1f);a.recycle();}}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {initParentWH();initWH();int heightMode = MeasureSpec.getMode(heightMeasureSpec);int heightSize = MeasureSpec.getSize(heightMeasureSpec);int maxHeightMeasureSpec = MeasureSpec.makeMeasureSpec(heightSize <= mMaxHeight ? heightSize : (int) mMaxHeight, heightMode);int widthMode = MeasureSpec.getMode(widthMeasureSpec);int widthSize = MeasureSpec.getSize(widthMeasureSpec);int maxWidthMeasureSpec = MeasureSpec.makeMeasureSpec(widthSize <= mMaxWidth ? widthSize : (int) mMaxWidth, widthMode);super.onMeasure(maxWidthMeasureSpec, maxHeightMeasureSpec);}/*** 計(jì)算需要設(shè)置的寬高*/private void initWH() {if((firstHeightRatio && mMaxHeightRatio > 0)|| (!firstHeightRatio && mMaxHeight < 0)){mMaxHeight = mMaxHeightRatio * parentHeight;}if((firstWidthRatio && mMaxWidthRatio > 0)|| (!firstWidthRatio && mMaxWidth < 0)){mMaxWidth = mMaxWidthRatio * parentWidth;}}/*** 獲取父控件的寬高*/private void initParentWH() {ViewGroup parent = (ViewGroup) getParent();if(null != parent){parentWidth = parent.getWidth();parentHeight = parent.getHeight();}else {WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);DisplayMetrics dm = new DisplayMetrics();if (wm != null) {wm.getDefaultDisplay().getMetrics(dm);parentWidth = dm.widthPixels;parentHeight = dm.heightPixels;}}} }?attrs.xml
<declare-styleable name="MaxLayout"><attr name="max_height_ratio" format="float"/><attr name="max_height" format="dimension"/><attr name="max_width_ratio" format="float"/><attr name="max_width" format="dimension"/><attr name="first_ratio_height" format="boolean"/><attr name="first_ratio_width" format="boolean"/></declare-styleable>?
轉(zhuǎn)載于:https://my.oschina.net/reone/blog/1826781
總結(jié)
以上是生活随笔為你收集整理的Android自定义View——可以设置最大宽高的FrameLayout的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: NASA:波音 Starliner 有望
- 下一篇: iPhone 15 Pro Max渲染图