CustomView 的 "onDraw()"- 方法永远不会被调用
CustomView's "onDraw()"-Method never gets called
这是一个棘手的问题:
我正在写我的习惯 ImageView
:
public class CustomImageView extends View
要显示的图片是通过setImagePath(String path)
设置的,BitMap
从assets
文件夹中加载。效果很好,图像尺寸已验证。
在稍后的过程中,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)
这是一个棘手的问题:
我正在写我的习惯 ImageView
:
public class CustomImageView extends View
要显示的图片是通过setImagePath(String path)
设置的,BitMap
从assets
文件夹中加载。效果很好,图像尺寸已验证。
在稍后的过程中,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(位图宽度,位图高度);
}
尽管您应该使用
检查是否有足够的 spaceMeasureSpec.getSize(widthMeasureSpec)
和
MeasureSpec.getSize(heightMeasureSpec)