我有一个自定义视图(ViewGroup),它将从宽度 = 0dp 到宽度 = 300dp 进行动画处理。我想在画出孩子之后操纵画布。为了实现这一点,我重写了 dispatchDraw(Canvas)。但是,我希望孩子们在 300dp 的画布上呈现——即使自定义视图的大小更小。当将更大的画布传递给 dispatchDraw(Canvas) 方法时,孩子们不会调整他们的位置和大小。
我的问题,我怎样才能“伪造”我的视图组的更大宽度,以便孩子们在更大的表面上呈现?
问候,罗伯特
我有一个自定义视图(ViewGroup),它将从宽度 = 0dp 到宽度 = 300dp 进行动画处理。我想在画出孩子之后操纵画布。为了实现这一点,我重写了 dispatchDraw(Canvas)。但是,我希望孩子们在 300dp 的画布上呈现——即使自定义视图的大小更小。当将更大的画布传递给 dispatchDraw(Canvas) 方法时,孩子们不会调整他们的位置和大小。
我的问题,我怎样才能“伪造”我的视图组的更大宽度,以便孩子们在更大的表面上呈现?
问候,罗伯特
每次视图(包括 ViewGroups)需要绘制自身时,都会调用 onMeasure 方法以获取其尺寸。之后调用 onLayout 以获得绘制位置。这不会在 draw 方法中发生,因为它们是在 onMeasure 和 onLayout 之后调用的,请参见此处。总结 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 而不是像素,您必须转换它们,请参见此处。
您可以测量尺寸大于可用空间的子级,但由于剪裁或其他因素(例如,如果您的 ViewGroup 在另一个 ViewGroup 中),结果可能不是您所期望的。
我可以从您的问题中看到您正在构建从左到右滑动的东西,也许slidingdrawer 源代码将有助于查看here。
希望这可以帮助...