自定义视图:onMeasure Height与Canvas.height

时间:2014-12-04 14:57:28

标签: android android-layout android-canvas

我有一个自定义视图,可以实现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:size:50(正确)
  • onDraw:画布高度:730px(===屏幕高度)

为什么 OnDraw的画布高度报告整个屏幕?是否可能因为层次结构中的较高层可能会有clipChildren(false)

注意:我的意思是"有时会发生这种情况"是这个视图是一个非常一般的视图(从头开始的自定义textview),我在非常不同的地方使用:内部scrollviews,内部适配器,深层嵌套等。

1 个答案:

答案 0 :(得分:1)

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