上一张,简单说明了 AutoAttr类的方法, 以及子类的实现,以及子类实现分类和理解 这里再简单补充一下
上一篇说明了下, 子类必须实现的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): 最后按比例计算完值以后, 所需要做的事情
因为我们配置对应属性的时候,例如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);
}
--下面略--
和上面类似,就不描述了