2015-11-25 6 views
8

Ich versuche, eine Anwendung zu machen, wo der Benutzer entweder wählen kann, um das Bild zu verwischen oder wählen Sie auf dem Bildschirm malen (Benutzer kann auch beide auf einer Leinwand tun).Zeichnen auf Leinwand und mehrere Malobjekte

Ich habe es ziemlich funktioniert, aber ich habe ein seltsames Problem mit der Zeichnung auf einer ersten zeichnen, nachdem der Modus von Unschärfe zu malen oder umgekehrt geändert wird.

Bitte sehen Sie das Bild unten.

PAINT MODE

Die verstreckten Pfade vertikal ist, wenn der Benutzer ausgewählt hat Farbe-Modus. Wie Sie sehen können, enthält der erste Pfad Farbe sowohl von blur paint als auch von paint (mit rotem Strich). Alle weiteren gezeichneten Pfade funktionieren jetzt einwandfrei.

BLUR MODE

Ebenso können Sie sehen, nach zwei vertikalen Pfade zeichnen, schaltet Benutzer den Modus zu verwischen und zieht horizontalen Wege in diesem Modus. Diesmal ist ähnlich wie oben der erste Pfad eine Mischung aus zwei Malobjekten und nachfolgenden Pfaden.

Bitte beachten Sie den unten angegebenen Code und es wäre toll, wenn Sie vorschlagen können, was das Problem verursachen könnte.

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

Antwort

4

Sie wahrscheinlich die Reihenfolge der zwei Linien in touch_up wechseln mögen, die den Pfad (neuer Pfad) zu löschen, und dass Anzeigen den Pfad zur Liste hinzufügen (zuerst hinzufügen, dann klar)

+0

Vielen Dank für Ihre respnse. Ich habe es versucht. Ich habe die Zeile mPath = new Path() verschoben; um nach dem hinzufügen der Befehl hinzufügen, aber es funktioniert immer noch nicht – Sahil

+0

Sahil, der Roder, in dem Sie initialialze ist nicht wichtig. Die Reihenfolge, in der Sie zeichnen, ist: Stellen Sie sich ein Papier vor, Sie zeichnen mit einem blauen Stift, dann zeichnen Sie mit einem roten Stift. Rot wird blau überlagern. Es ist egal, auf welche Weise du die Bleistifte auf den Tisch legst. – Empty2k12

1

Der Fehler tritt auf, weil das mPath-Objekt mit dem vorherigen Zeichnungsmodus erstellt wird, da es beim vorherigen Mouse-Up-Modus erstellt wurde.

die mpath Schöpfung touch_start Bewegen und die aktuelle Zeichenmodus verwendet wird:

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