2011-08-10 3 views
5

J'ai une petite application de dessin et je veux utiliser des formes "complexes" comme des brosses, c'est-à-dire une étoile. Dessin avec une brosse simple fonctionne déjà avec ce code:Comment dessiner un chemin avec un 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(); 

Je veux essentiellement les mêmes fonctionnalités en utilisant ce bitmap:

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

Ma solution actuellement à l'aide d'une liste de points (coordonnées) pour dessiner le bitmap. Le problème avec cette solution est qu'elle dessine seulement des bitmaps aux points donnés ayant pour résultat des intervalles entre chaque bitmap dessiné. Je préférerais obtenir une ligne lisse tout en dessinant comme avec un pinceau simple sans aucun intervalle entre les deux.

code actuel pour le dessin bitmap:

 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); 
     } 
    } 

Quelle est la meilleure façon de le faire? Merci pour toute aide!

Répondre

3

J'utilise cette classe de Point:

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

objet Peinture:

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

tirage sur toile:

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); 
     } 
    } 
} 

Tirage sur toile bitmap:

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

Comment pouvons-nous dessiner avec plusieurs bitmaps? Tout comme nous changeons de couleur et dessinons plusieurs chemins –

Questions connexes