背景
我正在尝试创建一个扩展LinearLayout
的自定义视图。简而言之,此视图通过覆盖View.onDraw()
方法来绘制自己的背景。背景周围有一个阴影(很像CardView
)。
目标
由于背景就像带有阴影的卡片视图,因此不应允许子视图填充整个视图。应该为卡周围的阴影留下固定的填充。此填充不应受xml填充属性或setPadding()
方法设置的填充的影响。它类似于CardView
的{{1}}方法。
方法
我尝试通过覆盖setContentPadding()
的{{1}}方法来实现此目的。官方文件说:
当此视图应为其每个子项指定大小和位置时,从布局调用。带子项的派生类应该覆盖此方法并在每个子项上调用布局。
onLayout()
LinearLayout
的实施效果很好。所以不想重写整个实现。因此,我尝试通过覆盖自定义类中的LinearLayout
方法并更改传递给super的参数来解决阴影,如下所示:
onLayout()
问题
但问题是,这对onLayout()
的孩子没有影响。无论我传给超级的是什么价值观,孩子的观点都是一样的。
问题
为什么这不起作用?或者更确切地说,为已经有@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(
changed,
left + shadowSize,
top + shadowSize,
right - shadowSize,
bottom - shadowSize
);
}
实现的LinearLayout
类实现内容插入/填充的最佳方法是什么?我不想修改或重写?
答案 0 :(得分:1)
它不起作用,因为width和height是为View的父级提供信息的属性。任何以layout_开头的东西都是对父母的指令。 在您的情况下,onLayout您应该布局ViewGroup的子项,而不是更改当前视图的维度。在onMeasure中,您可以测量孩子。而onLayout就是你定位他们的地方。如果你想要onLayout,你可以缩进所有孩子,但是如果你打电话给父母,你就不能这样做。 This post may help understand build custom ViewGroup 我建议您扩展ViewGroup并在自定义ViewGroup中只有一个子项,然后在调整阴影时将子项布局为与自定义视图组相同的大小。这将允许您在自定义ViewGroup上设置阴影,同时避免在边界外绘制的问题。这是最简单的方法。你可以根据需要布置每个孩子。此外,如果使用新的ConstraintsLayout是一个选项,这可能有助于防止必须使用自定义ViewGroup。