2012-01-19 12 views
9

Eventuali duplicati How to make custom brush for canvas in android?Come creare questo tipo di pennello per la vernice in Android

Ciao amici,

Sono troppo attaccato per creare questo tipo di pennello per l'applicazione della vernice, ma non ha trovato nulla legati alla Questo.

Sono nuovo per dipingere/tela quindi non ho conoscenza di ciò per il basic che ho completato ma per l'effetto come creare un pennello non avevo nulla di simile a come crearlo/implementarlo. Qualcuno ha un esempio o codice per questo?

ho bisogno di questo tipo di pennello per la mia applicazione semplice esempio bisogno di comprensione:

enter image description here

Grazie.

+0

hey Pratik, hai trovato una soluzione per questo. puoi per favore aiutarmi come ottenere lo stesso. – skygeek

risposta

8

Immagino che non ci sia un modo semplice. Ho trovato this discussion e in particolare il seguente post è interessante:

La Computer Grafica professionale non è mai facile. Ecco perché ci sono così poche persone che lo affrontano davvero. Per peggiorare le cose, le tecniche professionali vengono pubblicate raramente. Non so quanto sforzo tu voglia fare per ottenerlo, ma ti darò un po 'di luce. Quindi, se vuoi il , puoi studiare, sviluppare e ottenere il modo migliore. Se ti sembra troppo difficile, lascia che sia una curiosità.

Il modo professionale per rendere i pennelli calligrafici al giorno d'oggi è come che:

La curva master è liscio perché è disegnato sulla base di spline (s). Per ottenere il risultato più professionale, costruire due spline: una utilizzando i punti ottenuti (ad esempio, dagli eventi del mouse) che si trovano sopra la spline e un altro utilizzando i punti come i punti di controllo spline. Quindi la curva che si disegna è la curva generata dall'interpolazione di queste due spline . In questo modo, hai una "curva principale" da disegnare.

Si dovrebbe anche avere uno "spessore master" su cui deve essere applicata una variazione applicata. Questa variazione di spessore viene calcolata in base al risultato desiderato. Il tipo più comune di pennello calligrafico è solo come nell'immagine che hai collegato: le regioni curve di solito sono più sottili di rispetto a quelle diritte. È il tipo più comune perché la maggior parte dei designer ottiene questo tipo di risultato quando si disegna con un tablet, quindi i programmi emulano questo comportamento. Questo effetto in particolare è di solito calcolato utilizzando una funzione basata sulla seconda derivata della spline master . L'ampiezza della variazione di spessore può essere un valore configurabile.

I puntali sottili e appuntiti sono realizzati con un calcolo extra. A volte può essere una buona idea livellare anche le variazioni dello spessore con spline o qualche tipo di "funzione ceil".

Se hai fatto tutto bene, hai una curva spessa (e ovviamente chiusa) nelle tue mani. Disegnalo usando il miglior algoritmo di riempimento che puoi sviluppare .Utilizzare l'anti-aliasing se si è in grado di.

Tutte queste tecniche possono essere calcolate in tempo reale mentre l'utente sposta il mouse. Maggiore è il numero di punti ottenuti, maggiore è il numero di calcoli effettuati da te , ma funziona bene perché la maggior parte dei calcoli già effettuati sono ancora validi . Di solito hai solo bisogno di ricostruire una piccola (ultima) parte.

Un ultimo suggerimento: non fanno mai 2D levigatura usando funzione di regressione metodi, a meno che i punti rappresentano in realtà una funzione (quindi è necessario di mantenere la "matematica significato" dei punti per quanto possibile). Posso non immaginare un modo più lento per arrotondare i punti che non hanno una speciale semantica . L'unica eccezione è quando si hanno punti molto sparsi e l'ordine di input non ha importanza, ma non è il caso quando qualcuno sta disegnando con i pennelli.

3

È possibile ottenere questo effetto disegnando una trama bitmap su una tela. Ho ritagliato un po 'di texture da un'immagine che avete condiviso e utilizzato che come struttura in tela: -

enter image description here

immagine Struttura: -

enter image description here

Qui è la mia classe di visualizzazione: -

import java.util.ArrayList; 
import java.util.List; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.view.MotionEvent; 
import android.view.View; 

import com.serveroverload.dali.R; 

public class CanvasBrushDrawing extends View { 
    private Bitmap mBitmapBrush; 
    private Vector2 mBitmapBrushDimensions; 

    private List<Vector2> mPositions = new ArrayList<Vector2>(100); 

    private static final class Vector2 { 
     public Vector2(float x, float y) { 
      this.x = x; 
      this.y = y; 
     } 

     public final float x; 
     public final float y; 
    } 

    public CanvasBrushDrawing(Context context) { 
     super(context); 

// load your brush here 
     mBitmapBrush = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher); 
     mBitmapBrushDimensions = new Vector2(mBitmapBrush.getWidth(), mBitmapBrush.getHeight()); 

     setBackgroundColor(0xffffffff); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 

     for (Vector2 pos : mPositions) { 
      canvas.drawBitmap(mBitmapBrush, pos.x, pos.y, null); 
     } 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 

     int action = event.getAction(); 
     switch (action) { 
     case MotionEvent.ACTION_MOVE: 
      final float posX = event.getX(); 
      final float posY = event.getY(); 
      mPositions.add(new Vector2(posX - mBitmapBrushDimensions.x/2, posY - mBitmapBrushDimensions.y/2)); 
      invalidate(); 
     } 

     return true; 
    } 
} 

È possibile utilizzare questa visualizzazione nella propria attività in questo modo: -

setContentView(new CanvasBrushDrawing(MainActivity.this)); 

Ora hai solo bisogno di migliori file di texture dal tuo designer. Speranza ha aiutato

Si può vedere il codice sorgente completo su Git repo https://github.com/hiteshsahu/Dali-PaintBox

+0

Ciao Hitesh, per favore non aggiungere risposte doppie, rispondi a una domanda. Se trovi dei duplicati, segnalali, se non sono duplicati lascia un commento indicando la possibile soluzione che hai fornito ** una volta **. – bummi

+0

@Hitesh Sahu Sto usando i percorsi per l'operazione di annullamento/ripristino, ma quando inserisco il ciclo for all'interno del metodo onDraw(), i pennelli personalizzati vengono applicati più volte. Per favore controlla la mia domanda qui, http://stackoverflow.com/questions/38995187/custom-brush-with-undo-redo-operation-in-android-canvas/38995449?noredirect=1#comment65385129_38995449 –