1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Problem mit Canvas

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von SoSchautsAus, 14.01.2012.

  1. SoSchautsAus, 14.01.2012 #1
    SoSchautsAus

    SoSchautsAus Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    90
    Erhaltene Danke:
    7
    Registriert seit:
    14.01.2012
    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:

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

    Meine Activity sieht derweil so aus:
    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
     
  2. Bobert, 14.01.2012 #2
    Bobert

    Bobert Erfahrener Benutzer

    Beiträge:
    161
    Erhaltene Danke:
    15
    Registriert seit:
    21.11.2010
    Phone:
    Nexus S
    Hallo,

    du musst Dir die Positionen der Punkte auch merken!

    z.B:
    PHP:

    private ArrayList<MeinPunktObjektarPo = new ArrayList<MeinPunktObjekt>();
    ...

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

    @
    Override
    protected void onDraw(Canvas canvas) {
      
    canvas.drawCircle(xyRadiusball);
      foreach(
    MeinPunktObjekt mpo arPo) {
         
    canvas.drawCircle(mpo.getX(), mpo.getY(), Radiusball); 
      }

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

    Grüße Bobert
     
  3. SoSchautsAus, 14.01.2012 #3
    SoSchautsAus

    SoSchautsAus Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    90
    Erhaltene Danke:
    7
    Registriert seit:
    14.01.2012
    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.
    ...
     
  4. Bobert, 14.01.2012 #4
    Bobert

    Bobert Erfahrener Benutzer

    Beiträge:
    161
    Erhaltene Danke:
    15
    Registriert seit:
    21.11.2010
    Phone:
    Nexus S
    Du kannst es auch gerne einfacher machen :)
     
  5. SoSchautsAus, 14.01.2012 #5
    SoSchautsAus

    SoSchautsAus Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    90
    Erhaltene Danke:
    7
    Registriert seit:
    14.01.2012
    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.
     
  6. Bobert, 14.01.2012 #6
    Bobert

    Bobert Erfahrener Benutzer

    Beiträge:
    161
    Erhaltene Danke:
    15
    Registriert seit:
    21.11.2010
    Phone:
    Nexus S
    Du siehst ja das es nicht so ist,
    wie Du es siehst .... :)
     
  7. SoSchautsAus, 14.01.2012 #7
    SoSchautsAus

    SoSchautsAus Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    90
    Erhaltene Danke:
    7
    Registriert seit:
    14.01.2012
    Also gibts ehrlich keine Möglichkeit zu verhindern, dass er mir meinen Kreis immer übermalt? Außer halt alles abzuspeichern.
     
  8. Bobert, 14.01.2012 #8
    Bobert

    Bobert Erfahrener Benutzer

    Beiträge:
    161
    Erhaltene Danke:
    15
    Registriert seit:
    21.11.2010
    Phone:
    Nexus S
    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 ....
     
  9. Tom299, 16.01.2012 #9
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    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();
            }
    	}
    
     

Diese Seite empfehlen