鸿洋AutoLayout代码分析(六):AutoAttr子类补充


回顾

上一张,简单说明了 AutoAttr类的方法, 以及子类的实现,以及子类实现分类和理解
这里再简单补充一下


回顾3个抽象方法

上一篇说明了下, 子类必须实现的3个抽象方法
int attrVal(), boolean defaultBaseWidth(),void execute(View view, int val)
大体回顾一下
int attrVal()
返回对应的Attrs中对应的类的 int值,也就是 有一位为1的二进制数值,之后会和 xml文件中配置的数字去对比位上的是否有相同的1

boolean defaultBaseWidth():
是否是以宽为主,在 AutoAttr的apply(View view)中,会用到这个判断,如果不是对应的设置的值,是按比例计算宽的大小,还是按比例计算高的大小

void execute(View view, int val):
最后按比例计算完值以后, 所需要做的事情


MarginAttr和PaddingAttr的特殊

因为我们配置对应属性的时候,例如MarginLeft等, 都只有一个值,
这时候,会去判断对应的值,是和宽相关的,还是和高相关的
最后按 对应 宽或者高 方向, 按比例去缩放,
最后达到适配的效果

而 Margin 和 Padding 的属性, 会涉及到4个方向
会根据宽高的方向,计算不同的比例
所以,这里对应的计算方式 和 AutoAttr的apply(View view) 中的实现有所区别
要么在 AutoAttr的apply(View view) 中添加判断 (这样,后期会修改比较多)
这里就在 子类中 Override
我们一起看一下代码

MarginAttr

--上面略--
@Override
public void apply(View view)
{
    if (!(view.getLayoutParams() instanceof ViewGroup.MarginLayoutParams))
    {
        return;
    }
    if (useDefault())
    {
        ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams) view.getLayoutParams();
        lp.leftMargin = lp.rightMargin = getPercentWidthSize();
        lp.topMargin = lp.bottomMargin = getPercentHeightSize();
        return;
    }
    super.apply(view);
}
--下面略--

这里判断useDefault()以后,不同方向不同计算后,
再统一设置 view.setPadding(l, t, r, b);
并且return,以免走父类的apply(view)
【主观认为,这里只设置一位1, 所以useDefault() 肯定是true】

PaddingAttr

--上面略--
@Override
public void apply(View view)
{
    int l, t, r, b;
    if (useDefault())
    {
        l = r = getPercentWidthSize();
        t = b = getPercentHeightSize();
        view.setPadding(l, t, r, b);
        return;
    }
    super.apply(view);
}
--下面略--

和上面类似,就不描述了

你可能感兴趣的:(鸿洋AutoLayout代码分析(六):AutoAttr子类补充)