回顾
上一张,简单说明了 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);
}
--下面略--
和上面类似,就不描述了