2013-06-21 4 views
8

Ich versuche, ein Bild freihändig zuzuschneiden, damit ich auf das Bild malen kann. Aber es geht außerhalb der Bitmap-Region. Ich möchte nur einschränken, dass der Benutzer nur innerhalb der Bitmap-Region zeichnen kann, siehe unten Screenshot.Freihandbild Freistellen innerhalb der Bitmap-Region

Ich versuche, Funktionalität wie Photoshop lasso tool zu implementieren.

Die Zeichnung außerhalb der Ansichtsregion, die falsche Ausgabe generiert. Input

Ausgabe Output

-Code @

OnDraw

public void onDraw(Canvas canvas) { 

     final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); 
     canvas.drawBitmap(bitmap, rect, rect, null); 
     // RectF r = new RectF(); 
     // Matrix matrix = new Matrix(); 
     // matrix.mapRect(r); 
     // Log.i(TAG, "Rect " + r.left + " " + r.top + " " + r.right + " " + 
     // r.bottom + " "); 
     // canvas.clipRect(r.left, r.top, r.right, r.bottom); 

     Path path = new Path(); 
     boolean first = true; 

     for (int i = 0; i < points.size(); i += 2) { 
      Point point = points.get(i); 
      if (first) { 
       first = false; 
       path.moveTo(point.x, point.y); 
      } else if (i < points.size() - 1) { 
       Point next = points.get(i + 1); 
       path.quadTo(point.x, point.y, next.x, next.y); 
      } else { 
       mlastpoint = points.get(i); 
       path.lineTo(point.x, point.y); 
      } 
     } 
     canvas.drawPath(path, paint); 
    } 

onCrop

Bitmap resultingImage = Bitmap.createBitmap(widthOfscreen,heightOfScreen, bitmap1.getConfig()); 

     Canvas canvas = new Canvas(resultingImage); 

     Paint paint = new Paint(); 
     paint.setAntiAlias(true); 
     Path path = new Path(); 
     for (int i = 0; i < SomeView.points.size(); i++) { 
      path.lineTo(SomeView.points.get(i).x, SomeView.points.get(i).y); 
     } 
     // path.lineTo(150, 0); 
     // path.lineTo(230, 120); 
     // path.lineTo(70, 120); 
     // path.lineTo(150, 0); 

     canvas.drawPath(path, paint); 
     if(crop){ 
      paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); 

     }else{ 
      paint.setXfermode(new PorterDuffXfermode(Mode.SRC_OUT)); 
     } 

schlagen Sie mir vor, mein Ziel zu erreichen.

Antwort

0

Es ist ein Weg, um Ihr Ziel zu erreichen ..

Folgen folgende Schritte aus:

1) Machen Sie ein Bild wie als Innenteil der Ernte Bild sein sollte transparent und Außenteil Hintergrund sein sollte Leinwand überprüfen unter Bild.

2) Zeichnen Sie dieses Bild oben auf Ihrer Leinwand.

3) Zeichnen Sie etwas auf Ihre Leinwand und ziehen Sie dieses Bild wieder oben auf die Leinwand.

Image:

enter image description here

0

Sie alle Noten-Events ignorieren können, die außerhalb des Bildansicht sind. Merken Sie sich den letzten Veranstaltungsort in Ihrer Bildansicht und verbinden Sie ihn mit dem nächsten Veranstaltungsort innerhalb der Ansicht. Dies sollte funktionieren, wenn beide Ereignisse Teil einer einzelnen Bewegung sind (ohne den Finger zu heben), aber es kann komplizierter sein, wenn die Zeichnung außerhalb Ihrer Ansicht ausgeführt wird und dann eine neue Zeichnung beginnt. Versuchen Sie auch, diesen Fall zu erfassen.

0

späte Antwort, aber verwenden Sie voll für andere u können onmeasure Methode überschreiben und setzen Sie Ihre Bild Bitmap Breite und Höhe in dieser Methode und Größe der Leinwand so jetzt können Sie nur in Ihrem canvas.so Ihr Bild kommen center.it für Drawpath nur auf deiner Bitmap.

@Override 
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec){ 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

    height = bitmap.getHeight(); 
    width = bitmap.getWidth(); 

    setMeasuredDimension(width,height); 
} 

und dann in Ihrer Oncrop-Methode ändern, so dass Sie esaly es können.

Bitmap resultingImage = Bitmap.createBitmap(yourbitmap.getwidth(),yourbitmap.getheight(), yourbitmap.getConfig()); 
Verwandte Themen