美文网首页
Android 自定义可以设置 最大宽高和最小宽高的 Fram

Android 自定义可以设置 最大宽高和最小宽高的 Fram

作者: 河里的枇杷树 | 来源:发表于2019-07-19 09:41 被阅读0次

Android 提供的 FrameLayout 中只提供了 设置最小宽高的属性,在xml中使用的话就是
android:minHeight="335dp"
然而有时需求会要求我们控制最大宽高,这样就需要 我们自己实现了,其实很简单,就直接上代码了。

/**
 * Created by niluogege on 2019/5/16.
 * 
 * 可限制最大 最小 宽高的 FrameLayout
 */
public class LimitLayout extends FrameLayout {

    public static final float DEF_VALUE = -1f;

    private Context mContext;

    private float mMaxHeight = -1f;
    private float mMaxWidth = -1f;

    public LimitLayout(Context context) {
        this(context, null, 0);
    }

    public LimitLayout(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public LimitLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        mContext = context;
        initAttrs(attrs);
    }

    private void initAttrs(AttributeSet attrs) {
        TypedArray ta = mContext.obtainStyledAttributes(attrs, R.styleable.LimitLayout);
        mMaxHeight = ta.getDimension(R.styleable.LimitLayout_ml_maxheight, DEF_VALUE);
        mMaxWidth = ta.getDimension(R.styleable.LimitLayout_ml_maxWidth, DEF_VALUE);

        ta.recycle();
    }

    public void setMaxHeight(float maxHeight) {
        mMaxHeight = maxHeight;
    }

    public void setMaxWidth(float maxWidth) {
        mMaxWidth = maxWidth;
    }


    public float getMaxHeight() {
        return mMaxHeight;
    }

    public float getMaxWidth() {
        return mMaxWidth;
    }

    public void clearMaxWidthFlag() {
        mMaxWidth = -1f;
    }

    public void clearMaxHeightFlag() {
        mMaxHeight = -1f;
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        // 拿到原来宽度,高度的  size
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        int heightSize = MeasureSpec.getSize(heightMeasureSpec);

        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);


        widthSize = getWidth(widthSize);
        heightSize = getHeight(heightSize);

        int maxHeightMeasureSpec = MeasureSpec.makeMeasureSpec(heightSize, heightMode);
        int maxWidthMeasureSpec = MeasureSpec.makeMeasureSpec(widthSize, widthMode);

        super.onMeasure(maxWidthMeasureSpec, maxHeightMeasureSpec);

    }


    private int getWidth(int widthSize) {
        int minimumWidth = getMinimumWidth();

        if (mMaxWidth == DEF_VALUE) {//没有设置最大高度

            if (minimumWidth >= widthSize) {
                return minimumWidth;
            } else {
                return widthSize;
            }
        } else {
            if (widthSize >= mMaxWidth) {
                return (int) mMaxWidth;
            } else {
                if (minimumWidth >= widthSize) {
                    return minimumWidth;
                } else {
                    return widthSize;
                }
            }
        }
    }


    private int getHeight(int heightSize) {
        int minimumHeight = getMinimumHeight();

        if (mMaxHeight == DEF_VALUE) {//没有设置最大高度

            if (minimumHeight >= heightSize) {
                return minimumHeight;
            } else {
                return heightSize;
            }
        } else {
            if (heightSize >= mMaxHeight) {
                return (int) mMaxHeight;
            } else {
                if (minimumHeight >= heightSize) {
                    return minimumHeight;
                } else {
                    return heightSize;
                }
            }
        }
    }
}

因为有自定义属性,所以需要在attrs.xml中添加

 <declare-styleable name="LimitLayout">
        <!--最大宽度-->
        <attr name="ml_maxWidth" format="dimension" />
        <!--最大高度-->
        <attr name="ml_maxheight" format="dimension" />
    </declare-styleable>

这样就OK了,如果我们需要控制一个控件的 最大最小宽高,只需要 在外面包裹异一层LimitLayout

相关文章

  • Android 自定义可以设置 最大宽高和最小宽高的 Fram

    Android 提供的 FrameLayout 中只提供了 设置最小宽高的属性,在xml中使用的话就是androi...

  • iOS巅峰之解决隐藏tabbar后原位置无法响应点击事件的问题

    首先检查self.view.fram是否是宽高和屏幕的宽高一样

  • CSS相关-宽高设置和居中

    关于宽高设置: 1. 内联 从左到右 无法设置宽高 内联里可以有内联 高由文字决定 高可以用lineheight或...

  • 清除浮动

    给父元素设置宽高: 由于浮动后的元素脱离文档流,无法撑起父元素的宽高,可以设置父元素的宽高。 CSS的clear属...

  • table-cell设置宽高、居中

    table-cell默认宽高由内容决定 可以设置固定宽高: 直接设置宽高百分比是无效的,因为table没有显式声明...

  • CSS元素显示模式

    什么是块级元素,行内元素? 块级元素会独占一行可以设置宽高如果没有设置宽高,默认和父元素一样的宽高 行内元素不会独...

  • onMeasure

    自定义view时,如果不重写onMeasure方法,即使宽高设置为wrap_content,该view宽高也不为0...

  • 内联元素与块级元素的区别

    内联元素不会独占一行,块级元素会独占一行 内联元素设置宽高无效,宽高随内容的大小而决定 块级元素可以设置宽高,其宽...

  • canvas

    注意: 1、canvas不适用css设置宽高,使用自身的width和height设置宽高; 2、canvas和pr...

  • 盒模型

    标准盒模型:设置的宽高即为内容的宽高 IE盒模型:设置的宽高为content+padding+border的总长 ...

网友评论

      本文标题:Android 自定义可以设置 最大宽高和最小宽高的 Fram

      本文链接:https://www.haomeiwen.com/subject/muadlctx.html