2015-11-25 48 views
8

Sto tentando di creare un'applicazione in cui l'utente può scegliere di sfocare l'immagine o scegliere di dipingere sullo schermo (l'utente può anche fare entrambe le cose su una tela).Disegno su canvas e oggetti pittura multipla

Ho ancora abbastanza lavoro, tuttavia, sto avendo uno strano problema con il disegno su una prima estrazione dopo che la modalità è cambiata da sfocatura a vernice o viceversa.

Si prega di vedere l'immagine qui sotto.

PAINT MODE

I percorsi disegnati verticalmente è quando l'utente ha selezionato la modalità vernice. Come puoi vedere, il primo tracciato contiene vernice sia da oggetto sfocato sia oggetto pittura (con tratto rosso). Qualsiasi tracciato successivo disegnato ora funziona bene.

SFOCATURA MODE

Allo stesso modo si può vedere, per estrazione a due percorsi verticali, utente commuta la modalità di sfocatura e richiama percorsi orizzontali in questa modalità. Questa volta simile al primo percorso sopra è una miscela di due oggetti di pittura e percorsi successivi funziona bene.

Si prega di consultare il codice pubblicato di seguito e sarebbe bello se è possibile suggerire ciò che potrebbe essere la causa del problema.

enter image description here

ArrayList<DrawCommands> path_color_stroke_list = new ArrayList<DrawCommands>(); 
ArrayList<DrawCommands> path_color_stroke_list_undone = new ArrayList<DrawCommands>(); 
ArrayList<BlurCommands> path_blur_list = new ArrayList<BlurCommands>(); 
ArrayList<BlurCommands> path_blur_list_undone = new ArrayList<BlurCommands>(); 
ArrayList<EditTextDrawCommands> editTextList = new ArrayList<EditTextDrawCommands>(); 

private Bitmap mBitmap; 
private Paint transparentPaint; 
private Paint mPaint; 

public DrawingPanel(Context context, String imageStorageDir) { 
    super(context); 
    appContext = context; 
    setFocusable(true); 
    setFocusableInTouchMode(true); 
    setClickable(true); 
    this.setOnTouchListener(this); 

    mPath = new Path(); 
    setDefaultPaintAttributes(); 

    BitmapFactory.Options bmOptions = new BitmapFactory.Options(); 
    bmOptions.inSampleSize = 8; 

    blurRefImage = BitmapFactory.decodeResource(getResources(), R.drawable.canvas_test, bmOptions); 
    canvasBackImage = BitmapFactory.decodeResource(getResources(), R.drawable.canvas_test); 


    //stretch this small image to the size of the device so that it will be stretched and will already be blurred 
    blurRefImage = Bitmap.createScaledBitmap(blurRefImage, Utilities.getDeviceWidth(), Utilities.getDeviceHeight(), true); 
    blurRefImage = BlurBuilder.blurFullImage(appContext, blurRefImage, 20); 

    mBitmap = Bitmap.createBitmap(Utilities.getDeviceWidth(), Utilities.getDeviceHeight(), Bitmap.Config.ARGB_8888); 

    mCanvas = new Canvas(mBitmap); 

} 

protected void setDefaultPaintAttributes() { 
    mPaint = new Paint(); 
    mPaint.setColor(Color.RED); 
    mPaint.setStyle(Paint.Style.STROKE); 
    mPaint.setStrokeJoin(Paint.Join.ROUND); 
    mPaint.setStrokeCap(Paint.Cap.ROUND); 
    mPaint.setStrokeWidth(30); 

    //mPaint.setColor(0xcc000000); 

    transparentPaint = new Paint(); 
    transparentPaint.setStyle(Paint.Style.STROKE); 
    transparentPaint.setStrokeJoin(Paint.Join.ROUND); 
    transparentPaint.setStrokeCap(Paint.Cap.ROUND); 
    transparentPaint.setStrokeWidth(60); 
    transparentPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); 

} 

@Override 
protected void onDraw(Canvas canvas) { 
    mCanvas.drawBitmap(canvasBackImage, 0, 0, mPaint); 

    //Draw Blur 
    for (BlurCommands path_blur : path_blur_list) { 
     mCanvas.drawPath(path_blur.getPath(), transparentPaint); 
    } 

    //Draw Paints 
    for (DrawCommands path_clr : path_color_stroke_list) { 
     mCanvas.drawPath(path_clr.getPath(), mPaint); 
    } 

    switch (CURRENT_MODE) { 
     case MODE_BLUR: 
      mCanvas.drawPath(mPath, transparentPaint); 
      break; 
     case MODE_PAINT: 
      mCanvas.drawPath(mPath, mPaint); 
      break; 
    } 

    canvas.drawBitmap(blurRefImage, 0, 0, mPaint); 
    canvas.drawBitmap(mBitmap, 0, 0, mPaint); 

} 

private void touch_start(float x, float y) { 
    mPath.reset(); 
    mPath.moveTo(x, y); 
    mX = x; 
    mY = y; 
    switch (CURRENT_MODE) { 
     case MODE_BLUR: 
      break; 
     case MODE_PAINT: 
      break; 
     default: 
      break; 
    } 
} 

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) { 
     switch (CURRENT_MODE) { 
      case MODE_BLUR: 
      case MODE_PAINT: 
       mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2); 
       mX = x; 
       mY = y; 
       break; 
      default: 
       break; 
     } 

    } 

} 

private void touch_up(MotionEvent event) { 
    switch (CURRENT_MODE) { 
     case MODE_BLUR: 
      mPath.lineTo(mX, mY); 
      mPath = new Path(); 
      path_blur_list.add(new BlurCommands(mPath, blurStrength, transparentPaint.getStrokeWidth())); 
      break; 
     case MODE_PAINT: 
      mPath.lineTo(mX, mY); 
      mPath = new Path(); 
      path_color_stroke_list.add(new DrawCommands(mPath, mPaint.getColor(), mPaint.getStrokeWidth())); 
      Log.d(TAG, "Touch up: X: " + mX + " Y: " + mY); 
      break; 
     default: 
      break; 
    } 
} 

risposta

4

Probabilmente si desidera cambiare l'ordine delle 2 linee in touch_up che spianare la strada (nuova Path), e che aggiungi annuncio il percorso all'elenco (aggiungere prima, poi chiaro)

+0

Grazie per la tua respnse. Ho provato questo. Ho spostato la riga mPath = new Path(); per essere dopo aggiungere il comando aggiungi ma ancora non funziona – Sahil

+0

Sahil, il roditore in cui si inizializza non è importante. L'ordine in cui disegni è: immagina un foglio, disegni con una penna blu, poi disegni con una penna rossa. Il rosso si sovrapporrà di blu. Non importa in che modo metti le matite sul tavolo. – Empty2k12

1

L'errore si verifica perché l'oggetto mPath viene creato corrispondente alla modalità di disegno precedente poiché è stato creato al passaggio del mouse con la modalità di disegno precedente.

Spostare la creazione mpath a touch_start e sarà utilizzata la modalità disegno corrente:

private void touch_start(float x, float y) { 
    mPath = new Path(); 
    mPath.moveTo(x, y); 
    mX = x; 
    mY = y; 
    switch (CURRENT_MODE) { 
     case MODE_BLUR: 
      path_blur_list.add(new BlurCommands(mPath, blurStrength, transparentPaint.getStrokeWidth())); 
      break; 
     case MODE_PAINT: 
      path_color_stroke_list.add(new DrawCommands(mPath, mPaint.getColor(), mPaint.getStrokeWidth())); 
      break; 
     default: 
      break; 
    } 
} 
... 
private void touch_up(MotionEvent event) { 
    mPath.lineTo(mX, mY); 
}