万能适配,百分比布局,支持padding

来源:互联网 发布:python smtplib 安装 编辑:程序博客网 时间:2024/06/05 07:12

本文是基于http://blog.csdn.net/lmj623565791/article/details/46767825的修改,介绍及使用,请按左侧链接参拜鸿洋大神。

因自己使用中,发现不支持padding,所以自己谢了几行代码,非常简单,但肯定有人懒得写,想直接拿来用,OK,请直接下载来用,包名改改就可以了

https://github.com/zhengvince/PersentLayout


如果有大神乐意优化和修改,请不要客气,可以直接在gitHub叉一份,若大神想在自己的github上优化

请优化了在下面或鸿洋大神博客下面留个地址,大家一起优化的更好用


如下细节请注意:

1. 如果所有子控件,全部是百分比布局,可能因为四舍五入,有1dp的空白,暂时凑合的办法:至少有一个控件,设为mach_parent

2. 比例设置20%h,是参考其父级容器,而非根容器

3. 只支持paddingLeft,paddingRight,paddingBottom,paddingTop,不支持paddingStart,paddingEnd,原谅我吧,新手,实在不明白start和end是干什么用的。

4. 本人新手,刚接触android1个月,代码如有各种低级错误,请看在我直接提供源码的份儿上,直接留言,不要客气,谢谢。


原理也很简单:


1. 在attrs.xml中添加自定义属性

        <attr name="layout_paddingPercent" format="string"/>        <attr name="layout_paddingLeftPercent" format="string"/>        <attr name="layout_paddingTopPercent" format="string"/>        <attr name="layout_paddingRightPercent" format="string"/>        <attr name="layout_paddingBottomPercent" format="string"/>


2. 在  PercentLayoutHelper 中的PercentLayoutInfo添加变量名

     //1.0.5 those attr for some views' set percent layout_padding  method        public PercentVal leftPaddingPercent;        public PercentVal topPaddingPercent;        public PercentVal rightPaddingPercent;        public PercentVal bottomPaddingPercent;
3. 在  PercentLayoutHelper 中的  getPercentLayoutInfo  获取自定义属性的值


       //paddingPercent        sizeStr = array.getString(R.styleable.PercentLayout_Layout_layout_paddingPercent);        percentVal = getPercentVal(sizeStr, false);        if (percentVal != null) {            if (Log.isLoggable(TAG, Log.VERBOSE)) {                Log.v(TAG, "percent padding: " + percentVal.percent);            }            info = checkForInfoExists(info);            info.leftPaddingPercent = getPercentVal(sizeStr, true);            info.topPaddingPercent = getPercentVal(sizeStr, false);            info.rightPaddingPercent = getPercentVal(sizeStr, true);            info.bottomPaddingPercent = getPercentVal(sizeStr, false);        }        sizeStr = array.getString(R.styleable.PercentLayout_Layout_layout_paddingLeftPercent);        percentVal = getPercentVal(sizeStr, true);        if (percentVal != null) {            if (Log.isLoggable(TAG, Log.VERBOSE)) {                Log.v(TAG, "percent left padding: " + percentVal.percent);            }            info = checkForInfoExists(info);            info.leftPaddingPercent = percentVal;        }        //  value = array.getFraction(R.styleable.PercentLayout_Layout_layout_paddingTopPercent, 1, 1,        //        -1f);        sizeStr = array.getString(R.styleable.PercentLayout_Layout_layout_paddingTopPercent);        percentVal = getPercentVal(sizeStr, false);        if (percentVal != null) {            if (Log.isLoggable(TAG, Log.VERBOSE)) {                Log.v(TAG, "percent top padding: " + percentVal.percent);            }            info = checkForInfoExists(info);            info.topPaddingPercent = percentVal;        }        // value = array.getFraction(R.styleable.PercentLayout_Layout_layout_paddingRightPercent, 1, 1,        //       -1f);        sizeStr = array.getString(R.styleable.PercentLayout_Layout_layout_paddingRightPercent);        percentVal = getPercentVal(sizeStr, true);        if (percentVal != null) {            if (Log.isLoggable(TAG, Log.VERBOSE)) {                Log.v(TAG, "percent right padding: " + percentVal.percent);            }            info = checkForInfoExists(info);            info.rightPaddingPercent = percentVal;        }        //value = array.getFraction(R.styleable.PercentLayout_Layout_layout_paddingBottomPercent, 1, 1,        //  -1f);        sizeStr = array.getString(R.styleable.PercentLayout_Layout_layout_paddingBottomPercent);        percentVal = getPercentVal(sizeStr, false);        if (percentVal != null) {            if (Log.isLoggable(TAG, Log.VERBOSE)) {                Log.v(TAG, "percent bottom padding: " + percentVal.percent);            }            info = checkForInfoExists(info);            info.bottomPaddingPercent = percentVal;        }

4. 在  PercentLayoutHelper 自定义方法supportPadding,设置view的padding;


  /**     * 支持padding     */    private void supportPadding(int widthHint, int heightHint, View view, PercentLayoutInfo info) {        int leftPadding = view.getPaddingLeft();        int rightPadding = view.getPaddingRight();        int topPadding = view.getPaddingTop();        int bottomPadding = view.getPaddingBottom();        PercentLayoutInfo.PercentVal leftPaddingPercent = info.leftPaddingPercent;        PercentLayoutInfo.PercentVal topPaddingPercent = info.topPaddingPercent;        PercentLayoutInfo.PercentVal rightPaddingPercent = info.rightPaddingPercent;        PercentLayoutInfo.PercentVal bottomPaddingPercent = info.bottomPaddingPercent;        Log.d("percentPadding","----------"+view+"----------------");        Log.d("percentPadding", "  widthHint = " + widthHint + "  ");        Log.d("percentPadding", "  heightHint = " + heightHint + "  ");        if (leftPaddingPercent != null) {            int base = leftPaddingPercent.isBaseWidth ? widthHint : heightHint;            leftPadding = (int) (base * leftPaddingPercent.percent);            Log.d( "percentPadding","  leftPaddingPercent = " + leftPaddingPercent.percent + "  ");        }        if (topPaddingPercent != null) {            int base = topPaddingPercent.isBaseWidth ? widthHint : heightHint;            topPadding = (int) (base * topPaddingPercent.percent);            Log.d("percentPadding","  topPaddingPercent = " + topPaddingPercent.percent + "  ");        }        if (rightPaddingPercent != null) {            int base = rightPaddingPercent.isBaseWidth ? widthHint : heightHint;            rightPadding = (int) (base * rightPaddingPercent.percent);            Log.d("percentPadding","  rightPaddingPercent = " + rightPaddingPercent.percent + "  ");        }        if (bottomPaddingPercent != null) {            int base = bottomPaddingPercent.isBaseWidth ? widthHint : heightHint;            bottomPadding = (int) (base * bottomPaddingPercent.percent);            Log.d("percentPadding", "  bottomPaddingPercent = " + bottomPaddingPercent.percent + "  ");        }        if (leftPaddingPercent != null || topPaddingPercent != null || rightPaddingPercent != null || bottomPaddingPercent != null) {            view.setPadding(leftPadding, topPadding, rightPadding, bottomPadding);            Log.d( "percentPadding","  leftPadding = " + leftPadding + "  ");            Log.d("percentPadding","  topPadding = " + topPadding + "  ");            Log.d("percentPadding","  rightPadding = " + rightPadding + "  ");            Log.d("percentPadding","  bottomPadding = " + bottomPadding + "  ");        }    }



5. 在  PercentLayoutHelper 中的  adjustChildren 调用上面的自定义方法;




2 0