我有一个自定义视图(ViewGroup),它将从width = 0dp动画到width = 300dp。 我想在绘制孩子后操纵画布。要实现这一点,我将重写dispatchDraw(Canvas)。 但是,我希望孩子们能够在300dp的画布上渲染 - 即使自定义视图的大小较小。 将较大的画布传递给dispatchDraw(Canvas)方法时,子项不会调整其位置和大小。
我的问题是,如何“伪造”我的视图组的更大宽度,以便让孩子们在更大的表面上渲染?
此致 罗伯特
答案 0 :(得分:0)
每次视图(包括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
}
如果您想使用dips而不是像素,则必须转换它们,请参阅here。
您可以测量维度大于可用空间的子项,但结果可能与剪辑或其他因素(如果您的ViewGroup位于另一个ViewGroup中)的结果可能不符合预期。
我可以从你的问题中看到你正在构建一个从左到右滑动的东西,也许抽取源代码会有用看看here。
希望这会有所帮助......