Просто начинаю с Android, canvas, работ. У меня есть существующий код Java, который может рисовать фигуры на графическом объекте. Я пытаюсь использовать этот код в приложении для Android с Canvas. По сути, я пытаюсь избежать рефакторинга всего моего Java-кода для явного использования Canvas. Итак, я нахожусь в процессе создания своего собственного объекта «Графика». Все, что нужно сделать, это вызвать соответствующие методы Canvas для рисования указанной фигуры.
Я прочитал несколько постов о невозможности использования объекта canvas вне метода onDraw()
. Насколько я понимаю, вы не можете передать объект canvas другому классу и ожидать, что он будет работать правильно. Но у меня также нет полного понимания того, как все это работает.
Приложение вылетает в классе Graphics в методе drawOval. Я прочитал журнал обо всем этом, но я не нашел хорошего ответа относительно того, почему это конкретно не работает.
Я не смог найти способ получить журналы сбоев дружественным для Java способом (он же трассировка стека). Это просто бросает Fatal signal 11 (SIGSEGV), code 1, fault addr 0x130 in tid 1520
.
Спасибо! Дайте мне знать, если нужно больше деталей. Вот мой код:
MainActivity
public class MainActivity extends AppCompatActivity {
MyCanvas canvas;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
canvas = new MyCanvas(this);
setContentView(canvas);
}
}
MyCanvas View
public class MyCanvas extends View {
Graphics graphics;
List<Shape> shapes;
public MyCanvas(Context context) {
super(context);
graphics = new Graphics();
shapes = new ArrayList<>();
}
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
graphics.setCanvas(canvas); //Sets the canvas object in the graphics class
for (Shape shape : shapes) {
try { //this is in a try/catch block for custom exception handling
//This just calls the specific shapes render method,
//in this case, a circle from the makeShape Method
//The graphics object then calls the specific shape to
//render on the canvas
shape.render(graphics, 0, 0);
} catch (ShapeException e) {
e.printStackTrace();
}
}
invalidate();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
int x = (int) event.getX();
int y = (int) event.getY();
try { //this is in a try/catch block for custom exception handling
makeShape(x, y);
} catch (ShapeException e) {
e.printStackTrace();
}
invalidate();
case MotionEvent.ACTION_MOVE:
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL: {
break;
}
}
invalidate();
return true;
}
public void makeShape(int x, int y) throws ShapeException{
Point p = new Point(x, y);
Shape shape = new Circle(p, 50, 50);
shapes.add(shape);
}
}
Graphics
public class Graphics {
private Canvas canvas = null;
public Graphics() {
}
public void setCanvas(Canvas canvas) {
if (this.canvas == null) {
this.canvas = canvas;
}
}
public void drawOval(int x, int y, int width, int height) {
Paint paint1 = new Paint();
paint.setColor(Color.BLACK);
canvas.drawCircle(500, 500, 50, paint1); //App crashes here
}
}