【发布时间】:2015-02-02 12:21:19
【问题描述】:
我有一个实现onMeasure、onSizeChanged 和onDraw 的自定义视图。
@Override
protected void onSizeChanged(int xNew, int yNew, int xOld, int yOld){
super.onSizeChanged(xNew, yNew, xOld, yOld);
Log.v(TAG, "Measures arrived "+xNew+","+yNew);
}
@Override
protected void onDraw(Canvas canvas) {
Log.v(TAG, "Time to draw, canvas size "+canvas.getWidth()+","+canvas.getHeight());
}
我将它添加到容器中:
container.addView(customView, new LayoutParams(LayoutParams.MATCH_PARENT, 50)); // fixed height, 50px
我的问题是,我不明白为什么有时 Canvas 的尺寸与我在 onSizeChanged 中得到的尺寸不匹配,一旦视图确定为最终尺寸。
具体来说,在提出的用例中,只关注高度,我得到:
- onMeasure:模式:完全正确,尺寸 50(正确)
- onSizeChanged:大小:50(正确)
- onDraw:画布高度:730px(===屏幕高度)
为什么OnDraw 的画布高度报告整个屏幕? 是不是因为层次较高可能有clipChildren(false)?
注意:我所说的“有时会发生这种情况”的意思是,这个视图是一个非常通用的视图(从头开始的自定义 textview),我在非常不同的地方使用它:在滚动视图内部、适配器内部、深层-嵌套等。
【问题讨论】:
-
我记得在某处读到
canvas.getBounds()有时是合适的调用方法,但我没有在某些父视图有clipChildren="false"的地方尝试过。您可以考虑存储传递给onSizeChanged()的值并使用onDraw()中的值。 -
@Karakuri 是的,这就是我目前正在做的事情,无论视图放置在哪里,它们似乎总是正确的,但是我对 canvas.height 的东西很好奇。我很欣赏 Canvas.getBounds() 上的提示,这可能是正确的答案,考虑一下,如果剪辑区域已被 ie 更改,这一切都是有道理的。 setClipChildren,通过的画布将覆盖所有高度,但真正的高度是 getBounds() :) 将进行测试!
-
@karakuri 宾果游戏! canvas.getClipBounds() 中确实提供了正确的尺寸。如果您将其发布为答案,我很乐意接受。
canvas_height=729, onSizeChanged_height=50, bounds Rect(0, 50 - 0, 50)。 (有趣的是,如果宽度为 MATCH_PARENT,则剪辑区域宽度为 0)
标签: android android-layout android-canvas