Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 自定义视图:onMeasure Height vs.Canvas.Height_Android_Android Layout_Android Canvas - Fatal编程技术网

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(==屏幕高度)
为什么OnDraw的画布高度报告整个屏幕?可能是因为层次结构中较高的位置可能有一个
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)