【问题标题】:Custom View: Tell children that parent has another size自定义视图:告诉孩子父母有另一个尺寸
【发布时间】:2013-07-07 22:08:05
【问题描述】:
我有一个自定义视图 (ViewGroup),它将从宽度 = 0dp 变为宽度 = 300dp。
我想在画出孩子之后操纵画布。为了实现这一点,我重写了 dispatchDraw(Canvas)。
但是,我希望孩子们在 300dp 的画布上呈现——即使自定义视图的大小更小。
当将更大的画布传递给 dispatchDraw(Canvas) 方法时,孩子们不会调整他们的位置和大小。
我的问题,我怎样才能“伪造”我的视图组的更大宽度,以便孩子们在更大的表面上呈现?
问候,
罗伯特
【问题讨论】:
标签:
android
android-custom-view
【解决方案1】:
每次视图(包括 ViewGroups)需要绘制自身时,都会调用 onMeasure 方法以获取其尺寸。之后调用 onLayout 以获得绘制位置。这不会在 draw 方法中发生,因为它们是在 onMeasure 和 onLayout 之后调用的,请参阅here。总结 onMeasure 计算尺寸,onLayout 设置位置,最后 onDraw 进行渲染。所以你最好的选择是使用 onMeasure 来设置你想要的尺寸。例如,这是一个 onMeasure 方法,它将告诉子视图它的尺寸应该是 300 x 150 像素:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthSpec;
int heightSpec;
widthSpec = MeasureSpec.makeMeasureSpec(300, MeasureSpec.EXACTLY);
heightSpec = MeasureSpec.makeMeasureSpec(150, MeasureSpec.EXACTLY);
llTopBar.measure(widthSpec, heightSpec); //<-- llTopBar is the child...
super.onMeasure(widthMeasureSpec, heightMeasureSpec); //<--This is important
}
如果您想使用下降而不是像素,您必须转换它们,请参阅here。
您可以测量尺寸大于可用空间的子级,但由于剪裁或其他因素(例如,如果您的 ViewGroup 位于另一个 ViewGroup 中),结果可能与您的预期不同。
从你的问题中我可以看出你正在构建它从左到右滑动的东西,也许slidingdrawer源代码会有所帮助,看看here。
希望这会有所帮助...