Java 画布和位图变量设置为空
我正在为android开发一个简单的绘图应用程序。这个应用程序的结构很简单——它有一个包含文本的MainActivity类和一个按钮,该按钮用于扩展第二个类,一个包含图形的自定义视图 主类的代码如下所示:Java 画布和位图变量设置为空,java,android,canvas,bitmap,Java,Android,Canvas,Bitmap,我正在为android开发一个简单的绘图应用程序。这个应用程序的结构很简单——它有一个包含文本的MainActivity类和一个按钮,该按钮用于扩展第二个类,一个包含图形的自定义视图 主类的代码如下所示: public class MainActivity extends AppCompatActivity { DrawingView dv; ViewGroup parent; @Override protected void onCreate(Bundle savedInstanceSta
public class MainActivity extends AppCompatActivity {
DrawingView dv;
ViewGroup parent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
parent = (ViewGroup) findViewById(R.id.activity_main);
}
public void crossClass(View v) {
//setContentView(R.layout.sample_drawing_view);
dv = new DrawingView(getApplicationContext());
View viw = getLayoutInflater().inflate(R.layout.sample_drawing_view, parent);
System.out.println("Attempted to Inflate DV");
}
public void refreshCallback(View v){
dv.refresh();
}
}
该类最重要的部分是创建DrawingView的实例,以便稍后在按下按钮时调用该类中的方法
方法(dv.refresh())很简单
public void refresh(){
System.out.println("Refresh Command Sent");
drawCanvas.drawColor(Color.WHITE);
invalidate();
}
它所做的只是在画布上画白色
这给了我一个错误:
java.lang.NullPointerException: Attempt to invoke virtual method void android.graphics.Canvas.drawColor(int) on a null object reference
我使用调试器进行了一些检查,发现在调用该方法时,Canvas和Bitmap变量为null
但是,当我将断点设置为刚创建类之后,变量就不是null
我将把整个工程视图类代码放在下面,但我不知道是什么导致它们变为null
public class DrawingView extends View
{
//Constant
public int Colour = 0xFF000000;
public int width;
public int height;
//Drawing Var
public Canvas drawCanvas;
public Bitmap canvasBitmap;
public Path drawPath;
public Paint drawPaint;
public Paint canvasPaint;
public DrawingView(Context context){
super(context);
get_dim(context);
setupDrawing();
setupUI();
}
public DrawingView(Context context, AttributeSet attributeSet){
super(context, attributeSet);
setupDrawing();
setupUI();
}
public void get_dim(Context context){
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
Point size = new Point();
display.getSize(size);
width = size.x;
height = size.y;
}
public void setupUI() {
}
public void setupDrawing() {
drawPath = new Path();
drawPaint = new Paint();
drawPaint.setColor(Colour);
drawPaint.setAntiAlias(true);
drawPaint.setStrokeWidth(20);
drawPaint.setStyle(Paint.Style.STROKE);
drawPaint.setStrokeJoin(Paint.Join.ROUND);
drawPaint.setStrokeCap(Paint.Cap.ROUND);
canvasPaint = new Paint(Paint.DITHER_FLAG);
}
@Override
protected void onDraw(Canvas canvas){
canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
canvas.drawPath(drawPath, drawPaint);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh){
super.onSizeChanged(w, h, oldw, oldh);
System.out.println("ON SIZE CHANGED CALLED");
canvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
drawCanvas = new Canvas(canvasBitmap);
}
public void handelAction(int action, int x, int y){
switch(action) {
case 0:
drawPath.moveTo(x, y);
break;
case 2:
drawPath.lineTo(x, y);
break;
case 1:
drawCanvas.drawPath(drawPath, drawPaint);
break;
}
{
invalidate();
}
}
@Override
public boolean onTouchEvent(MotionEvent event){
float x = event.getX();
float y = event.getY();
System.out.println(event.getAction());
handelAction(event.getAction(), (int) x, (int) y);
return true;
}
public void refresh(){
System.out.println("Refresh Command Sent");
drawCanvas.drawColor(Color.WHITE);
invalidate();
}
}
在
crossClass()
中分配给dv
的DrawingView
从未真正使用过。您没有在任何地方将其添加到活动
的视图
层次结构中。另外,它与您在下一行中可能正在膨胀的DrawingView
实例不同。如果在示例图视图
布局中确实有一个,那么您需要从正在膨胀的视图
中获取对该视图的引用。啊,我想可能是这样的。这是一个问题已经有一段时间了,我对它的工作原理缺乏关键性的理解。可以有没有一种方法可以使我刚通过编程创建的DrawingView膨胀?我不确定你的意思。如果要使用通过new
实例化的一个,请删除inflate()
行,并使用addView()
方法将dv
添加到父级
。如果要使用已充气的,请删除new
行,然后以某种方式找到DrawingView
并将其分配给dv
;如果
元素具有id
,则可以使用findViewById()
,或者如果它是示例\u绘图\u视图
布局中唯一的视图
,则可以从充气()
调用中释放返回值。是。非常感谢。告诉我使用addView()正是我所需要的。如果你不介意的话,我还有一个简短的问题。当我使用addView()时,DrawingView工作得非常好,但是没有创建我在.xml文件中定义的按钮。如何手动创建此按钮?请在OnCreate()中使用