CustomView 的 "onDraw()"- 方法永远不会被调用

CustomView's "onDraw()"-Method never gets called

这是一个棘手的问题:

我正在写我的习惯 ImageView:

public class CustomImageView extends View

要显示的图片是通过setImagePath(String path) 设置的,BitMapassets 文件夹中加载。效果很好,图像尺寸已验证。

在稍后的过程中,CustomImageView-对象通过 addView(View v) 添加到 LinearLayout(匹配父项)。覆盖的方法

@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom)

被调用并计算一些疯狂的值,此时不重要。

奇怪的是底值总是!我认为这就是为什么 onDraw(Canvas c) 永远不会被调用的原因。

E/CIView﹕ onLayout - changed: true, left: 0, top: 0, right: 1080, bottom: 0
E/CIView﹕ bitmap - bitmapWidth: 735, bitmapHeight: 490
E/CIView﹕ onLayout - changed: false, left: 0, top: 0, right: 1080, bottom: 0
E/CIView﹕ bitmap - bitmapWidth: 735, bitmapHeight: 490

任何人都可以向我解释为什么 onLayout 永远不会得到正确的底值吗? invalidate()requestLayout() 之类的方法没有改变任何东西,也许我错过了一些特殊的部分..?

如果您重写 View,您需要提供它的大小 - 这就是您获得零高度界限的原因。所以实现 onMeasure() 并在那个调用里面 setMeasuredDimension().

例如

@Override protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) {<br> setMeasuredDimension(位图宽度,位图高度); }

尽管您应该使用

检查是否有足够的 space

MeasureSpec.getSize(widthMeasureSpec)

MeasureSpec.getSize(heightMeasureSpec)