2016-10-20 2 views
0

Ich entwickle eine Android-Anwendung, muss ich eine Funktion implementieren, die mir erlauben, verschiedene Punkte in einer Aktivität zu zeichnen.Wie zeichne ich verschiedene Punkte mit Leinwand in Android

Dies ist mein Code:

public class MainActivity extends AppCompatActivity { 
    public Paint paint; 
    public List<Point> coords; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(new DrawingView(this)); 

     paint = new Paint(); 
     coords = new ArrayList(); 

     ImageView iv = new ImageView(getApplicationContext()); 
     iv.setImageResource(R.drawable.car); 
     iv.setScaleType(ImageView.ScaleType.CENTER_INSIDE); 
     LinearLayout.LayoutParams parms = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.MATCH_PARENT); 
     iv.setLayoutParams(parms); 
    } 

    class DrawingView extends SurfaceView { 

     private final SurfaceHolder surfaceHolder; 
     private final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 

     public DrawingView(Context context) { 
      super(context); 
      surfaceHolder = getHolder(); 
      paint.setColor(Color.BLACK); 
      paint.setStyle(Paint.Style.FILL); 
     } 

     @Override 
     public boolean onTouchEvent(MotionEvent event) { 
      if(event.getAction() == MotionEvent.ACTION_DOWN) { 
       addpoint(event.getX(), event.getY()); 
      } 
      return false; 
     } 

     public void addpoint(float x, float y){ 

      Point point = new Point(); 
      point.x = Math.round(x); 
      point.y = Math.round(y); 
      coords.add(point); 

      for(int i = 0; i< coords.size(); i++) { 
       Canvas canvas = surfaceHolder.lockCanvas(); 
       canvas.drawColor(Color.WHITE); 
       canvas.drawCircle(coords.get(i).x, coords.get(i).y, 20, paint); 
       surfaceHolder.unlockCanvasAndPost(canvas); 
      } 
     } 
    } 
} 

Jedesmal, dass ich den Bildschirm berühren, ich und die Koordinaten in einer Liste speichern, dann versuche ich die Liste des Punktes zu ziehen, aber nur ein Punkt bleibt auf dem Bildschirm Ich verstehe nicht warum.

Also, wie kann ich verschiedene Punkte auf dem Bildschirm zeichnen (und speichern)?

Eine andere Frage: Wie kann ich ein Hintergrundbild zeigen?

Antwort

1

von den offiziellen Javadocs:

DrawColor (int Farbe) Füllen Sie die gesamte Leinwand Bitmap (beschränkt auf den aktuellen Clip) mit der angegebenen Farbe, srcover porterduff Modus.

Also jedes Mal, wenn Sie einen Kreis zeichnen, löschen Sie zuerst die gesamte Leinwand mit weißer Farbe. Nach einer Auslosung wird der zuvor gezeichnete Kreis gelöscht.

So ist eine Option, den aktuellen Zustand des Hintergrunds zu speichern, und es ist immer oben auf dem weißen zu ziehen, oder versuchen Sie nicht drawColor

+0

Ok, ein weiteres Problem: wenn ich einen Punkt zeichne, wenn ich mein Telefon die Ausrichtung drehen Veränderung und der Punkt verschwindet, wie kann ich den Punkt halten? –

+0

Gut hat meine Antwort Ihr Problem gelöst? Kannst du es akzeptieren? Dann erstellen Sie bitte eine andere Frage für ein anderes Problem, und ich werde versuchen, es zu beantworten. – abbath

+0

Ich löste dieses Problem in einem Teil, Löschen der Zeile relativ zur Zeichenfarbe, jetzt erscheinen mehr Punkte, aber nicht alle. –

0
for(int i = 0; i< coords.size(); i++) { 
     Canvas canvas = surfaceHolder.lockCanvas(); 
     canvas.drawColor(Color.WHITE); 
     canvas.drawCircle(coords.get(i).x, coords.get(i).y, 20, paint); 
     surfaceHolder.unlockCanvasAndPost(canvas); 
} 

verwenden, sollten

Canvas canvas = surfaceHolder.lockCanvas(); 
canvas.drawColor(Color.WHITE); 
for(int i = 0; i< coords.size(); i++) { 
      canvas.drawCircle(coords.get(i).x, coords.get(i).y, 20, paint); 
} 
surfaceHolder.unlockCanvasAndPost(canvas); 

canvas.drawColor(Color.WHITE); Jedesmal sein Erzeugt alle Leinwand und surfaceHolder.unlockCanvasAndPost(canvas); zeigt nur die zuletzt hinzugefügten Circle

Verwandte Themen