2015-11-25 12 views
8

Próbuję wykonać aplikację, w której użytkownik może albo zamazać obraz, albo może zamalować obraz na ekranie (użytkownik może również zrobić oba na jednym płótnie).Rysowanie na płótnie i wielu obiektach malarskich

Mam jednak dość dużo pracy, mam dziwny problem z rysunkiem na pierwszym losowaniu po zmianie trybu z rozmycia na pomalowanie lub odwrotnie.

Proszę zobaczyć zdjęcie poniżej.

Paint Tryb

ścieżki wyciągnięte pionowo, kiedy użytkownik wybiera tryb malowania. Jak widać pierwsza ścieżka zawiera farbę zarówno z obiektu zamazywania farby, jak iz obiektu malowania (z czerwoną kreską). Każda kolejna narysowana ścieżka działa poprawnie.

PLAMA TRYB

Podobnie można zobaczyć, po pobraniu dwóch pionowych dróg użytkownik przełącza tryb plama i opiera się poziomymi ścieżkami w tym trybie. Tym razem podobnie jak powyżej pierwsza ścieżka jest mieszaniną dwóch obiektów malarskich, a kolejne ścieżki działają dobrze.

Proszę zobaczyć kod zamieszczony poniżej i byłoby wspaniale, gdyby można było zasugerować, co może być przyczyną problemu.

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

Odpowiedz

4

Prawdopodobnie chcesz, aby przełączyć kolejność 2 linie w touch_up to jasne ścieżki (nowa droga), a dodać ogłoszenie ścieżkę do listy (pierwszy dodatek, to jasne)

+0

Dzięki za respnse. Próbowałem tego. Przeniosłem linię mPath = new Path(); być po dodaniu polecenia add, ale nadal nie działa – Sahil

+0

Sahil, rózga, w której inicjujesz, nie jest zmienna. Kolejność, w jakiej rysujesz: Wyobraź sobie papier, rysujesz niebieskim długopisem, a następnie rysujesz czerwonym długopisem. Czerwony będzie nakładał się na niebiesko. Nie ma znaczenia, w jaki sposób kładziesz ołówki na stole. – Empty2k12

1

Błąd występuje, ponieważ obiekt mPath został utworzony zgodnie z poprzednim trybem rysowania, ponieważ został utworzony przy pomocy myszki w poprzednim trybie rysowania.

Przesuń tworzenie mPath do touch_start i aktualny tryb rysowania zostaną wykorzystane:

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