2011-08-10 38 views
5

Tôi có một ứng dụng vẽ nhỏ và muốn sử dụng các hình dạng "phức tạp" làm bàn chải, tức là một ngôi sao. Vẽ với một bàn chải đơn giản đã làm việc với mã này:Làm cách nào để vẽ đường dẫn bằng 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(); 

tôi về cơ bản muốn cùng chức năng sử dụng bitmap này:

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

Giải pháp của tôi hiện đang sử dụng một danh sách các điểm (tọa độ) để vẽ bitmap. Vấn đề với giải pháp đó là nó chỉ vẽ bitmap tại các điểm đã cho kết quả là có khoảng trống giữa mỗi bitmap được vẽ. Tôi thà muốn có được một đường trơn tru trong khi vẽ như với một bàn chải đơn giản mà không có bất kỳ khoảng trống ở giữa.

mã hiện tại cho các bản vẽ 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); 
     } 
    } 

cách tốt nhất để làm điều đó là gì? Cảm ơn bạn đã giúp đỡ!

Trả lời

3

tôi sử dụng lớp này Point:

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

đối tượng Sơn:

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

bốc thăm trên vải:

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 trên vải bitmap:

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

Làm cách nào chúng ta có thể vẽ bằng nhiều bitmap? Giống như chúng ta thay đổi màu và vẽ nhiều đường dẫn –

Các vấn đề liên quan