【问题标题】:Custom View: onMeasure Height vs Canvas.height自定义视图:onMeasure Height 与 Canvas.height
【发布时间】:2015-02-02 12:21:19
【问题描述】:

我有一个实现onMeasureonSizeChangedonDraw 的自定义视图。

@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


【解决方案1】:

使用canvas.getClipBounds() 应该给出适当的尺寸,即使画布的宽度和高度实际上更大。

【讨论】:

    猜你喜欢
    • 2023-03-15
    • 2012-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 2014-02-06
    • 2015-02-01
    相关资源
    最近更新 更多