Hi,
das eine Problem mit dem Drawingcache gelöst, steh ich auch schon vor dem nächsten Ich zeichne in meiner App auf einen Canvas. Man kann normal Zeichnen mit verschiedenen Brushes, man kann aber auch Kreis- und Rechtecke via Multitouch auf den Canvas legen. Das funzt auch prima. Jetzt hab ich allerdings ein Problem mit der Reihenfolge wie der Canvas gezeichnet wird. Wenn man ein neues Kreis- oder Rechteckobjekt gezeichnet hat und dann normal mit den Brushes weiterzeichnen will sollen diese natürlich über den alten Objekten im Canvas gezeichnet werden und nicht dahinter...
Ich dachte ich bin schlau und führe für jedes Objekt (FreeHand, Circle o. Square) eine layerId und speichere dieser nacheinander in einer Liste, um die Reihenfolge der gezeichneten Objekte zu speichern. Diese wollte ich dann beim zeichnen des Canvas prüfen, so dass er weiss welches Objekt wohin gehört... nur leider krieg ichs nicht hin Habt ihr ne Idee wie ich das entweder mit den layerId's hinbekomme oder vielleicht auch ganz anders... eleganter?
die Objektklassen:
//Innere Klasse Circle, wird gebraucht um eine Liste mit Kreisobjekten anzulegen, um diese im Canvas zu speichern
public class Circle {
int id;
float x;
float y;
float r;
Paint p;
public Circle(int id, float x, float y, float r, Paint p) {
this.id = id;
this.x = x;
this.y = y;
this.r = r;
this.p = p;
}
public int getId() {
return this.id;
}
}
//Innere Klasse Square, wird gebraucht um eine Liste mit Rechteckobjekten anzulegen, um diese im Canvas zu speichern
public class Square {
int id;
int x1;
int y1;
int x2;
int y2;
Paint p;
public Square(int id, int x1, int y1, int x2, int y2, Paint p) {
this.id = id;
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
this.p = p;
}
public int getId() {
return this.id;
}
}
//Innere Klasse FreeHand, wird gebraucht um eine Liste mit Freehandobjekten anzulegen, um diese im Canvas zu speichern
public class FreeHand {
int id;
Path path;
Paint paint;
public FreeHand(int id, Path path, Paint paint) {
this.id = id;
this.path = path;
this.paint = paint;
}
public int getId() {
return this.id;
}
public Path getPath() {
return this.path;
}
public Paint getPaint() {
return this.paint;
}
}
Alles anzeigen
onDraw():
public void onDraw(Canvas canvas)
{
//Lädt das Bild aus dem Galleryintent (Menu->Load) als BG in den Canvas
if(imageLoaded) {
loadedImage.setBounds(canvas.getClipBounds());
loadedImage.draw(canvas);
}
//Prüft ob im Hintergrund gezeichnet wird oder nicht
if(drawMode)
{
for (int i=0; i < freehandList.size(); i++) {
canvas.drawPath(freehandList.get(i).getPath(), freehandList.get(i).getPaint());
}
canvas.drawPath(path, paint);
}
else
{
canvas.drawPath(path, paint);
for (int i=0; i < freehandList.size(); i++) {
canvas.drawPath(freehandList.get(i).getPath(), freehandList.get(i).getPaint());
}
}
//Zeichnet alle Kreise die gemacht wurden ins Canvas
for (int i=0; i < circleList.size(); i++) {
setBrushStyle(Paint.Join.ROUND, Paint.Cap.ROUND, Paint.Style.FILL);
canvas.drawCircle(circleList.get(i).x, circleList.get(i).y, circleList.get(i).r, circleList.get(i).p);
}
//Zeichnet alle Rechtecke die gemacht wurden ins Canvas
for (int i=0; i < squareList.size(); i++) {
setBrushStyle(Paint.Join.BEVEL, Paint.Cap.SQUARE, Paint.Style.FILL);
canvas.drawRect(squareList.get(i).x1, squareList.get(i).y1, squareList.get(i).x2, squareList.get(i).y2, squareList.get(i).p);
}
//Falls Kreis gezeichnet wird, sieht man den Kreis während des zeichnens auch
if(drawCircle) {
float x1 = (x[0] + x[1]) / 2.0f;
float y1 = (y[0] + y[1]) / 2.0f;
float r = (float) Math.sqrt(Math.pow(x[1] - x[0], 2.0f) + Math.pow(y[1] - y[0], 2.0f) / 2.0f);
int lbs = getBrushSize();
int lbc = getBrushColor();
setBrushSize(1);
setBrushStyle(Paint.Join.ROUND, Paint.Cap.ROUND, Paint.Style.FILL);
Paint newPaint = new Paint();
newPaint.set(paint);
Circle actualCircle = new Circle(layerId, x1, y1, r, newPaint);
canvas.drawCircle(x1, y1, r, newPaint); //Ist quasi das was man während des Kreissetzens sieht, wenn man die Finger noch drauf hat
if(isTouch[0] == false && isTouch[1] == false) { //Wenn Finger Weg sind wird der letzte Zustand des Kreises als Kreisobjekt gespeichert
circleList.addLast(actualCircle);
drawCircle = false;
undoId.addLast(2);
}
setBrushStyle(Paint.Join.ROUND, Paint.Cap.ROUND, Paint.Style.STROKE);
setBrushSize(lbs);
setBrushColor(lbc);
}
//Falls Rechteck gezeichnet wird, sieht man das Rechteck während des zeichnens auch
if(drawSquare) {
int lbs = getBrushSize();
int lbc = getBrushColor();
setBrushSize(1);
setBrushStyle(Paint.Join.BEVEL, Paint.Cap.SQUARE, Paint.Style.FILL);
Paint newPaint = new Paint();
newPaint.set(paint);
Square actualSquare = new Square(layerId, (int)x[0], (int)y[0], (int)x[1], (int)y[1], newPaint);
canvas.drawRect(x[0], y[0], x[1], y[1], newPaint); //Ist quasi das was man während des Rechtecksetzens sieht, wenn man die Finger noch drauf hat
if(isTouch[0] == false && isTouch[1] == false) { //Wenn Finger Weg sind wird der letzte Zustand des Rechtecks als Objekt gespeichert
squareList.addLast(actualSquare);
drawSquare = false;
undoId.addLast(3);
layerIdList.addLast(layerId);
layerId++;
}
setBrushStyle(Paint.Join.ROUND, Paint.Cap.ROUND, Paint.Style.STROKE);
setBrushSize(lbs);
setBrushColor(lbc);
}
//Setzt nach dem Zeichnen von Kreisen oder Rechtecken wieder den richtigen Pinsel zum zeichnen
if(brushForm)
setBrushStyle(Paint.Join.ROUND, Paint.Cap.ROUND, Paint.Style.STROKE);
else
setBrushStyle(Paint.Join.BEVEL, Paint.Cap.SQUARE, Paint.Style.STROKE);
canvas.drawPath(cursorPath, cursorPaint); //Cursor vom Brush
}
Alles anzeigen