2011-08-10 12 views
5

Mam małą aplikację do rysowania i chcę użyć "złożonych" kształtów jako pędzli, czyli gwiazdy. Rysowanie za pomocą prostego pędzla już działa z tym kodem:Jak narysować ścieżkę z bitmapą?

remotePath.reset(); 
remotePath.moveTo(start_x, start_y); 

float dx = Math.abs(end_x - start_x); 
float dy = Math.abs(end_y - start_y); 
if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) { 
     remotePath.quadTo(start_x, start_y, (end_x + start_x)/2, (end_y + start_y)/2); 
} 

remotePath.lineTo(end_x, end_y); 
// commit the path to our offscreen 
mCanvas.drawPath(remotePath, remotePaint); 
// kill this so we don't double draw 
remotePath.reset(); 
invalidate(); 

I w zasadzie ma tę samą funkcjonalność przy użyciu tej bitmapy:

Bitmap myBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.brush_star); 

Moje rozwiązanie jest obecnie za pomocą listy punktów (współrzędne) do rysowania bitmapa. Problem z tym rozwiązaniem polega na tym, że rysuje tylko bitmapy w danych punktach, co powoduje przerwy pomiędzy każdą narysowaną bitmapą. Raczej chciałbym uzyskać gładką linię podczas rysowania jak za pomocą prostego pędzla bez żadnych przerw pomiędzy.

Aktualny kod na rysunku bitmapy:

 protected void onDraw(Canvas canvas) { 

     // Make canvas white 
     canvas.drawColor(Color.WHITE); 

     // Paintable area 
     canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); 

     canvas.drawPath(mPath, mPaint); 

     for (Point point : points) { 
      canvas.drawBitmap(complexBrush, point.x, point.y, p); 
     } 
    } 

Jaki jest najlepszy sposób, aby to zrobić? Dzięki za pomoc!

Odpowiedz

3

Używam tego Punktu Klasa:

public class Point implements Serializable { 
float x, y; 
float dx, dy; 
} 

obiekt Farba:

Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 
paint.setStyle(Paint.Style.STROKE); 
paint.setStrokeWidth(5); 
paint.setColor(Color.RED); 
paint.setAntiAlias(true); 

rysować na płótnie:

private void drawCanvas(Canvas canvas, List<Point> pts){ 
    if (pts.size() > 1){ 
     Path path = new Path(); 
     final int SMOOTH_VAL = 6; 
     for(int i = pts.size() - 2; i < pts.size(); i++){ 
      if(i >= 0){ 
       Point point = pts.get(i); 

       if(i == 0){ 
        Point next = pts.get(i + 1); 
        point.dx = ((next.x - point.x)/SMOOTH_VAL); 
        point.dy = ((next.y - point.y)/SMOOTH_VAL); 
       } 
       else if(i == pts.size() - 1){ 
        Point prev = pts.get(i - 1); 
        point.dx = ((point.x - prev.x)/SMOOTH_VAL); 
        point.dy = ((point.y - prev.y)/SMOOTH_VAL); 
       } 
       else{ 
        Point next = pts.get(i + 1); 
        Point prev = pts.get(i - 1); 
        point.dx = ((next.x - prev.x)/SMOOTH_VAL); 
        point.dy = ((next.y - prev.y)/SMOOTH_VAL); 
       } 
      } 
     } 

     boolean first = true; 
     for(int i = 0; i < pts.size(); i++){ 
      Point point = pts.get(i); 
      if(first){ 
       first = false; 
       path.moveTo(point.x, point.y); 
      } 
      else{ 
       Point prev = pts.get(i - 1); 
       path.cubicTo(prev.x + prev.dx, prev.y + prev.dy, point.x - point.dx, point.y - point.dy, point.x, point.y); 
      } 
     } 
     canvas.drawPath(path, paint); 
    } else { 
     if (pts.size() == 1) { 
      Point point = pts.get(0); 
      canvas.drawCircle(point.x, point.y, 2, paint); 
     } 
    } 
} 

Draw na płótnie bitmap:

private void drawBitmap(Bitmap bmp, List<Point> pts) { 
    Canvas c = new Canvas(bmp); 
    drawCanvas(c, pts); 
} 
+0

Jak rysować za pomocą wielu bitmap - tak jak zmieniamy kolor i rysujemy wiele ścieżek –

Powiązane problemy