我试图在Android中制作自定义视图。在调用r
时,似乎没有初始化类成员onDraw()
。但是paint
仍然成功初始化(如果我从构造函数中删除该行,则app force关闭)。在最后一行,我有画布绘制r1
,它成功并绘制一个蓝色矩形。如果我将r1
替换为r
,则它只是白色。
这是我的问题的简化版本。我一直在为构造函数中初始化的数组成员获取空指针异常。但无论如何,问题似乎都是一样的。为什么它不能保持实例化?
public class ColorListView extends View {
Paint paint;
Rect r;
public ColorListView (Context context, AttributeSet attrs){
super(context, attrs);
paint = new Paint();
r = new Rect(0,0,getWidth(),getHeight());
}
protected void onDraw (Canvas canvas){
paint.setColor(Color.BLUE);
Rect r1 = new Rect(0,0,getWidth(),getHeight());
canvas.drawRect(r1, paint); // doesn't work if r is passed to drawRect?
}}
答案 0 :(得分:1)
做这样的事情怎么样: 在你调用构造函数的地方
ColorListView myView = new ColorListView(context, attrs);
myView.createRectangle();
myView.invalidate();
在课堂上
public class ColorListView extends View {
Paint paint;
Rect r;
public ColorListView (Context context, AttributeSet attrs){
super(context, attrs);
paint = new Paint();
}
protected void onDraw (Canvas canvas){
paint.setColor(Color.BLUE);
canvas.drawRect(r, paint);
}
public void CreateRectangle() {
Rect r = new Rect(0,0,getWidth(),getHeight());
}
}
或者查找实际创建视图的时间。以上是我刚才提出的一种快速方法。我不记得视图何时被创建/测量。
PS - 我刚看到答案onMeasure(),我不好意思:P
答案 1 :(得分:0)
在测量View之前初始化Rect r,因此getWidth和getHeight为0。
尝试在视图的onMeasure之后初始化它。
此外,这是一个不好的做法
Rect r1 = new Rect(0,0,getWidth(),getHeight());
中的
onDraw (Canvas canvas)
你应该避免在那里分配对象。
答案 2 :(得分:0)
在最后一行,我有画布绘制r1,成功和蓝色 绘制矩形。如果我用r替换r1,它只是白色。
r = new Rect(0,0,getWidth(),getHeight());
您可以在构造函数上执行此操作,因为此时getWidth()
和getHeight()
返回0.您必须等到实际测量视图。在documenation上,您可以找到有关onMeasure回调