Android 自定义视图:onMeasure Height vs.Canvas.Height
我有一个自定义视图,它实现了Android 自定义视图:onMeasure Height vs.Canvas.Height,android,android-layout,android-canvas,Android,Android Layout,Android Canvas,我有一个自定义视图,它实现了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 vo
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
中获得的维度不匹配,因为视图已设置为最终大小
具体来说,在提出的用例中,仅关注高度,我得到:
- 测量:模式:精确,尺寸50(正确)
- onSizeChanged:大小:50(正确)
- onDraw:画布高度:730px(==屏幕高度)
clipChildren(false)
注意:我所说的“有时会发生这种情况”的意思是,这个视图是一个非常通用的视图(从零开始的自定义
textview
),我在非常不同的地方使用它:内部滚动视图、内部适配器、深嵌套视图等等 使用canvas.getClipBounds()
应该给出适当的大小,即使画布的宽度和高度实际上更大。我记得在某个地方读到过canvas.getBounds()
有时是合适的调用方法,但我没有在某些父视图有clipChildren=“false”
的地方尝试过。您可能会考虑将传递给<代码> OnsiZeXeDeD()/<代码>的值存储在<代码> OnDRAW()/代码> @ Kalkuri是的,这就是我现在正在做的,它们是看起来总是正确的,不管视图放在哪里,但是我对Cavas.Head东西感到好奇。我很欣赏Canvas.getBounds()上的提示,这可能是正确的答案,仔细想想,如果剪辑区域被ie.setClipChildren更改,通过的画布将覆盖所有高度,但实际高度是getBounds():)将进行测试@卡拉库里宾果!canvas.getClipBounds()中确实提供了正确的大小。如果你把它作为答案贴出来,我很乐意接受<代码>画布高度=729,尺寸变化高度=50,边界矩形(0,50-0,50)。(有趣的是,如果宽度为MATCH_PARENT,则剪辑区域宽度为0)