2013-06-21 8 views
8

Cercando di ottenere il ritaglio a mano libera di un'immagine, quindi sono in grado di disegnare sull'immagine. Ma va oltre la regione bitmap. Voglio solo limitare che l'utente possa disegnare solo all'interno della regione bitmap, controlla sotto la schermata.Disegno a mano libera Disegno all'interno dell'area bitmap

Sto cercando di implementare funzionalità come Photoshop lasso tool.

La sua area di visualizzazione esterna del disegno, che genera un'uscita errata. Input

uscita Output

Codice @

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

suggerisco di raggiungere il mio obiettivo.

risposta

0

C'è un modo per raggiungere il tuo obiettivo ..

Seguire i passaggi qui sotto:

1) Effettuare un'immagine come parte come all'interno di ritagliare l'immagine di deve essere parte trasparente e al di fuori dovrebbe essere sfondo di controllo della tela sotto Immagine.

2) Disegna l'immagine sopra la tela.

3) Disegnare qualsiasi cosa sulla tela e disegnare quell'immagine sulla parte superiore della tela.

Image:

enter image description here

0

È possibile ignorare tutti gli eventi di tocco che sono fuori la visualizzazione delle immagini. Ricorda l'ultima posizione dell'evento che si trova all'interno della tua vista immagine e collegala alla successiva posizione dell'evento che si trova all'interno della vista. Questo dovrebbe funzionare quando entrambi gli eventi fanno parte di un singolo movimento (senza alzare il dito), ma potrebbe essere più complicato quando il disegno viene eseguito al di fuori della vista e quindi un nuovo disegno inizia all'interno. Cerca di coprire anche questo caso.

0

risposta tardiva, ma utilizzare pieno per altri utenti può sovrascrivere il metodo di misura e impostare la larghezza e l'altezza della bitmap dell'immagine in tale metodo e ridimensionare la tela in modo che ora sia possibile disegnare solo nella canvas.so l'immagine come center.it per drawpath solo sulla tua bitmap.

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

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

    setMeasuredDimension(width,height); 
} 

e quindi modificare il metodo oncrop in modo da poterlo sfogliare esaly.

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