2015-11-25 13 views
8

Kullanıcının görüntüyü bulanıklaştırmayı seçebileceği veya ekranda boyamayı seçebileceği bir uygulama yapmaya çalışıyorum (kullanıcı her ikisini de tek bir tuvalde yapabilir).Tuval ve birbirine bağlı boya nesneleri üzerinde çizim

Oldukça fazla çalışıyorum, ancak mod, bulanıklıktan boyaya veya tam tersi olarak değiştirildikten sonra, ilk çizimde çizimle ilgili garip bir sorun yaşıyorum.

Lütfen aşağıdaki resime bakınız. Kullanıcı, boya modu seçilir zaman dikey olarak çizilen

BOYA MODU

yolları olduğunu. Gördüğünüz gibi, ilk yolda hem boya nesnesi hem de boya nesnesi (kırmızı çizgi ile) bulunur. Şimdi çizilen sonraki yollar iyi çalışıyor.

BLUR MOD

Benzer Gördüğünüz, iki dikey yollar çizildikten sonra, kullanıcı bulanıklaşmaya moduna geçer ve bu modda yatay yolları çizer. Yukarıdaki ilk yola benzer bu zaman iki boya objesinin bir karışımıdır ve sonraki yollar iyi çalışır.

Lütfen aşağıda listelenen kodlara bakın. Soruna neden olabileceğini önerebilirseniz harika olur.

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

cevap

4
Muhtemelen yolu (yeni Yolu) temizlemek touch_up içinde 2 hat sırasını değiştirmek ve bu listeye reklamı yolunu eklemek istediğiniz

(ilk, sonra berrak ekleyin)

+0

Teşekkür sizin respnse için. Bunu denedim. MPath = new Path(); add komutunu ekledikten sonra ancak hala çalışmıyor – Sahil

+0

Sahil, sizin başlattığınız roder imrensiz değil. Çizdiğiniz sıra şu şekildedir: Bir kağıt düşünün, mavi bir kalemle çizin, sonra kırmızı bir kalemle çizin. Kırmızı maviyi kaplayacak. Kalemleri masanın üzerine nasıl soktuğunuz önemli değil. – Empty2k12

1

Hata, önceki çizim kipinde fare-up ile oluşturulduğundan, önceki çizim kipiyle eşleşen mPath nesnesi oluşturulduğu için oluşur.

touch_start için mpath oluşturma Taşı

ve geçerli çizim modu kullanılacaktır:

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); 
} 
İlgili konular