Problem mit Canvas

S

SoSchautsAus

Ambitioniertes Mitglied
8
Hallo.

Dieser nichtssagende Threadtitel tut mir Leid aber ich wusste nicht, wie ich das Problem in nur ein paar Worten beschreiben sollte.

Vorne weg:
Wir vor ein paar Wochen in der Schule angefangen für Android zu programmieren. Inzwischen bin ich gerade dabei, eine kleine App zu schreiben. Jetzt bin ich aber an einem Punkt angekommen, an dem ich nicht mehr weiter weiß. Deswegen habe ich mich hier angemeldet. Ich hoffe ihr könnt mir helfen.

Hintergrund ist folgender:
Meine App soll, sobald sie mal fertig ist, linien zeichnen. In der Mittel soll ein kleiner Punkt zu sehen sein. Berühre ich nun den Bildschirm an einer Stelle, soll sich der Punkt langsam zu dem Punkt bewegen, an dem ich den Bildschirm berührt hab. Dabei soll aber eine Linie entstehen. So in etwa wie beim Programm "Paint", wenn man die Maustaste drückt und dann den Pinsel bewegt.

Mein Problem:
Mein Punkt bewegt sich zwar und wird auch neu gezeichnet aber die "alten" Punkte, also die mit den vorherigen Koordinaten verschwinden, sobald der Punkt neu gezeichnet wird. Das sieht dann wie bei Pong aus. Einfach nur ein Punkt, der sich bewegt. Ich will aber, dass sich eine Linie hinter dem Punkt bildet.

Ich hoffe, dass war einigermaßen verständlich. Falls nicht versuch ichs nochmal zu erklären.

Ich habe dazu eine neue Klasse erstellt, in der ich den Punkt mit canvas.drawCircle... zeichnen lasse.
Das was relevant ist sieht so aus:

public class Panel extends View {
public Panel(Context context) {
super(context);

ball = new Paint();
ball.setColor(Color.WHITE);
ball.setAntiAlias(true);

}


@Override
protected void onDraw(Canvas canvas) {
canvas.drawCircle(x, y, Radius, ball);
invalidate();
}

}
Alles unwichtige, wie irgendwelche Berechnungen hab ich jetzt mal rausgelöscht.

Meine Activity sieht derweil so aus:
public class ADKActivity extends Activity implements OnTouchListener{

Panel p;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

p = new Panel(this);

p.setOnTouchListener(this);

setContentView(R.layout.main);

LinearLayout layout = (LinearLayout) findViewById(R.id.Panel);
layout.addView(p);

}
}
Auch hier hab ich alles unwichtige entfernt. Der Übersicht halber.

Hat da jemand eine Ahnung wie ich das hinkrieg, dass ich die Linie gezeichnet krieg? Google spuckt dazu nix mehr aus und was nützliches hab ich bisher auch nicht gefunden. Hoffe ihr könnt mir helfen.

MfG
 
Hallo,

du musst Dir die Positionen der Punkte auch merken!

z.B:
PHP:
private ArrayList<MeinPunktObjekt> arPo = new ArrayList<MeinPunktObjekt>();
...

public Panel(Context context, MeinPunktObjekt mpo) {
  super(context);
 
  arPo.add(mpo); 
  ball = new Paint();
  ball.setColor(Color.WHITE);
  ball.setAntiAlias(true);
 
    }
...

@Override
protected void onDraw(Canvas canvas) {
  canvas.drawCircle(x, y, Radius, ball);
  foreach(MeinPunktObjekt mpo : arPo) {
     canvas.drawCircle(mpo.getX(), mpo.getY(), Radius, ball); 
  }

  invalidate();
}
...
So in etwa, Du musst natürlich das fertig schreiben. Auch brauchst du ein MeinPunktObjekt.

Grüße Bobert
 
Danke erstmal für die Antwort.

Ich find die Lösung aber recht umständlich. Wenn ich das in "normalen" Java machen wollte wäre das kein Problem. Wenn ich da zwei Punkte zeichne verschwindet der, den ich als erstes Zeichne nicht, sobald ich den zweiten Zeichne. Ich hab so den Eindruck, dass das ganze im Moment (also Android) so abläuft:
Punkt wird gezeichnet.
Komplettes Fenster wird mit schwarz übermalt.
Punkt mit neuen Koordinaten wird gezeichnet.
Komplettes Fenster wird mit schwarz übermalt.
Punkt mit neuen Koordinaten wird gezeichnet usw.
...
 
Du kannst es auch gerne einfacher machen :)
 
Ne so war das nicht gemeint ^^
Ich seh das so:
ich hab ein Layout. Mit canvas.draw... mal ich auf diesem Layout einen Kreis. Nach einer bestimmten Zeit male ich auf diesem Layout nochmal ein Kreis. Und ich versteh nicht, warum der erste Kreis, den ich gezeichnet habe verschwindet, sobald ich den zweite Kreis zeichne.
 
Also gibts ehrlich keine Möglichkeit zu verhindern, dass er mir meinen Kreis immer übermalt? Außer halt alles abzuspeichern.
 
manchmal ist es besser mit der 2 besten Lösung in 5 Minuten fertig zu sein.
Als 2 Tage über die beste Lösung zu Grübeln ....
 
das hab ich aus meinem programm kopiert:

Code:
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		if (event.getAction() == MotionEvent.ACTION_DOWN) {
			drawPoint(event.getX(), event.getY(), event.getPressure());
			return true;
		}
		else if (event.getAction() == MotionEvent.ACTION_UP) {
			drawing = false;
			return true;
		}
		else if (event.getAction() == MotionEvent.ACTION_MOVE) {
			drawing = true;
			drawPoint(event.getX(), event.getY(), event.getPressure());
			return true;			
		}
		
		return false;
	}
	
	private void drawPoint(float x, float y, float pressure) {
		if (bitmap != null) {			
			paint.setColor(Color.BLACK);
			paint.setStrokeWidth(thickness);
            if (drawing) {
            	canvas.drawLine(lastX, lastY, x, y, paint);
            }
            else {
            	canvas.drawPoint(x, y, paint);
            }

        	lastX = x;
        	lastY = y;

        	isChanged = true;
        	
            invalidate();
        }
	}
 

Ähnliche Themen

S
Antworten
4
Aufrufe
991
Sempervivum
S
B
Antworten
4
Aufrufe
472
bb321
B
R
Antworten
3
Aufrufe
1.615
Ritartet
R
Zurück
Oben Unten