2013-06-22 14 views
6

Esempio di fingerpaint nella demo di Android api campione non disegna punto/punto toccando il dito sullo schermo. Nel codice hanno usato Path per disegnare una linea, c'è un modo per disegnare un cerchio o un punto usando il percorso?L'esempio Android FingerPaint non disegna punti?

public class MyView extends View { 
    // int bh = originalBitmap.getHeight(); 
    // int bw = originalBitmap.getWidth(); 

    public MyView(Context c, int w, int h) { 
     super(c); 
     mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); 
     // Bitmap mBitmap = 
     // Bitmap.createScaledBitmap(originalBitmap,200,200,true); 
     mCanvas = new Canvas(mBitmap); 
     mPath = new Path(); 
     mBitmapPaint = new Paint(Paint.DITHER_FLAG); 
     //mBitmapPaint.setColor(Color.YELLOW); 
     //mBitmapPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC)); 
    } 

    @Override 
    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
     super.onSizeChanged(w, h, oldw, oldh); 
     // mBitmap = Bitmap.createBitmap(bw, bh, Bitmap.Config.ARGB_8888); 
     // mCanvas = new Canvas(mBitmap); 
    } 


    @Override 
    protected void onDraw(Canvas canvas) { 
     //canvas.drawColor(customColor); 
     canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); 
     canvas.drawPath(mPath, mPaint); 
    } 

    // //////************touching evants for painting**************/////// 
    private float mX, mY; 
    private static final float TOUCH_TOLERANCE = 5; 

    private void touch_start(float x, float y) { 
     //mCanvas.drawCircle(x, y, progress+1, mPaint); 

     mPath.reset();   
     mPath.moveTo(x, y); 
     //mPaint.setStyle(Paint.Style.FILL); 
     //mPath.addCircle(x, y, (float) (progress+0.15), Direction.CW); 
     mCanvas.drawPath(mPath, mPaint); 
     mX = x; 
     mY = y; 
     //mPaint.setStyle(Paint.Style.STROKE); 

    } 

    private void touch_move(float x, float y) { 
     float dx = Math.abs(x - mX); 
     float dy = Math.abs(y - mY); 
     if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) { 
      mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2); 
      mX = x; 
      mY = y; 
     } 
    } 

    private void touch_up() { 
     mPath.lineTo(mX, mY); 
     // commit the path to our offscreen 
     mCanvas.drawPath(mPath, mPaint); 
     // kill this so we don't double draw 
     mPath.reset(); 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     float x = event.getX(); 
     float y = event.getY(); 
     switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      touch_start(x, y); 
      invalidate(); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      touch_move(x, y); 
      invalidate(); 
      break; 
     case MotionEvent.ACTION_UP: 
      touch_up(); 
      invalidate(); 
      break; 
     } 
     return true; 
    } // end of touch events for image 
} 

Ecco il codice, che cosa devo modificare in questo codice al grado di disegnare dot/punto finertouch?

+0

ci mostra un po 'di codice. non perché non stai disegnando i punti invece stai disegnando i percorsi nel metodo 'onDraw' – Raghunandan

+0

quali modifiche devo fare per disegnare punti/punti al tocco in basso? –

+1

non ho provato questo. prova questo 'mCanvas.drawPoint (x, y, mPaint)' in 'touch_start' – Raghunandan

risposta

10

c'è un modo per disegnare un cerchio o un punto utilizzando il percorso?

Invece di provare a farlo, utilizzare il metodo drawPoint(float x, float y, Paint paint) nella classe Canvas.

di utilizzarlo in API demo è necessario cambiare 3 cose:

  1. Avere un private boolean mDrawPoint; nella classe MyView di distinguere tra un rubinetto e uno scivolo.
  2. Impostare mDrawPoint a true in touch_start() ea false in touch_move() se il percorso viene modificato (cioè nella dichiarazione if).
  3. In touch_up() controllare il valore di mDrawPoint. Se è falsa fare ciò che la funzione ha fatto prima e se è vero quindi disegnare il punto sulla tela: mCanvas.drawPoint(mX, mY, mPaint);

Nuova versione di touch_up():

private void touch_up() { 
    if(mDrawPoint == true) { 
     mCanvas.drawPoint(mX, mY, mPaint);   
    } else { 
     mPath.lineTo(mX, mY); 
     // commit the path to our offscreen 
     mCanvas.drawPath(mPath, mPaint); 
     // kill this so we don't double draw 
     mPath.reset(); 
    } 
} 

quando mi muovo il mio dito dopo aver tracciato una linea, disegna automaticamente un punto vicino ad esso, dove finisce la linea. E quando avvierò una nuova linea/curva, la linea precedentemente disegnata rimuoverà/rimuoverà dalla tela lasciando solo i punti dietro che sono stati disegnati.

Non è necessario modificare più di quello che è nella mia risposta. Probabilmente hai dimenticato di implementarne una parte.

Ho avuto lo stesso problema quando lo ho provato e risolto prima di postare la mia risposta. È stato causato dal disegno su due tele diverse, dato al metodo onDraw, che si perde quando il dito si alza e l'altro è mCanvas, che è il punto in cui la riga viene salvata in touch_up. Questo è il motivo per cui ha un touch_upif:

Se non ci siamo mossi il dito (solo sfruttato) poi disegnamo il punto al mCanvas in modo che sia ancora lì sul prossimo onDraw (onDraw pareggi il mCanvas alla tela riceve come argomento in modo che le linee e i punti precedenti dipinti su mCanvas siano ancora visibili).

Se abbiamo spostato il dito, salviamo il tracciato tracciato sulla tela passata a onDraw allo mCanvas in modo che sia ancora presente dopo aver sollevato il dito.

Il problema che hai proviene dalla else parte della funzione touch_up mai della sedia elettrica in modo che su touch_up un punto viene disegnato indipendentemente dal fatto che dovrebbe e il percorso non viene mai impegnato a mCanvas e quindi scomparire la prossima volta onDraw si chiama .

Questo molto probabilmente provengono da impostazione che mDrawPoint al vero in touch_start() come ho detto nel punto 2. ma dimenticando di impostare mDrawPoint fino a falso in touch_move come ho detto anche al punto 2.

Ecco cosa il mio touch_move assomiglia:

private void touch_move(float x, float y) { 
    float dx = Math.abs(x - mX); 
    float dy = Math.abs(y - mY); 
    if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) { 
     mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2); 
     mX = x; 
     mY = y; 
     mDrawPoint = false; 
     } 
    } 
+0

Usando il tuo codice sono in grado di disegnare punti, ma quando alzo il dito dopo aver disegnato una linea, disegna automaticamente un punto vicino ad esso, dove finisce la linea. E quando avvierò una nuova linea/curva, la linea precedentemente disegnata rimuoverà/rimuoverà dalla tela lasciando solo i punti dietro che sono stati disegnati. per favore suggeriscimi quali altre modifiche ho bisogno per attuare questo? –

+0

@NoumanBhatti qual è il tuo esatto requisito. disegnare un percorso o un punto? – Raghunandan

+0

@Raghunandan il suo requisito è quello di disegnare un punto quando si tocca e un percorso durante lo scorrimento. Il Fingerpaint originale fa il secondo ma non disegna un punto se tocca semplicemente. –

0

Una risposta molto tardi, ma sarebbe più facile da usare mCanvas.drawPoint(x, y, mPaint); in touch_start.

0

La semplice soluzione che funziona per me è solo quello di aggiungere il seguente codice a touch_start():

mPath.quadTo(x, y, x + 0.1f, y); 
0

Se si preferisce continuare a utilizzare il vostro percorso, memorizzare le coordinate ACTION_DOWN e confrontarli in ACTION_UP. Se non si sono mossi, aggiungi un piccolo cerchio al tuo percorso.

path.addCircle(event.getX(), event.getY(), paint.getStrokeWidth()/4f, Path.Direction.CW); 

Il vantaggio di questo approccio è che è semplice e il cerchio non sembra affatto fuori luogo.