Dessin sur toile et objets de peinture mutiple

J'essaie de faire une application où l'utilisateur peut soit choisir de flou l'image, soit choisir de peindre sur l'écran (l'utilisateur peut également faire les deux sur une seule toile).

Je l'ai très bien fonctionné, mais j'ai un problème étrange avec le dessin sur un premier tirage après le changement du mode de flou à la peinture ou vice versa.

Voir l'image ci-dessous.

MODE DE PEINTURE

Les chemins tracés verticalement sont lorsque l'utilisateur a sélectionné le mode de peinture. Comme vous pouvez le voir, le premier chemin contient de la peinture à la fois d'un objet de peinture flou ainsi que d'un objet de peinture (avec un trait rouge). Tous les trajets ultérieurs tracés fonctionnent bien.

BLUR MODE

De même, vous pouvez voir, après avoir dessiné deux chemins verticaux, l'utilisateur commute le mode pour flou et dessine des chemins horizontaux dans ce mode. Cette fois, semblable au premier chemin ci-dessus est un mélange de deux objets de peinture et les chemins suivants fonctionnent bien.

Veuillez vous reporter au code ci-dessous. Ce serait génial si vous pouvez suggérer ce qui pourrait causer le problème.

Entrez la description de l'image ici

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

  • Voir avec Zoom et dessiner la ligne sur toile dans Android
  • Android - paint.setShadowLayer Ignorer shadowColor
  • Comportement différent pour FillType.EVEN_ODD lors de l'ajout d'un effet CornerPathEffect?
  • Police Android personnalisée pour une peinture
  • Comment tester l'application sans guignol?
  • Android - Remplissez la couleur sous le graphique de ligne
  • Assurez-vous que certaines zones de bitmap sont transparentes sur le contact
  • Comment remplir la couleur dans l'image dans une zone particulière?
  • 2 Solutions collect form web for “Dessin sur toile et objets de peinture mutiple”

    Vous voulez probablement passer l'ordre des 2 lignes en touch_up qui efface le chemin (nouveau chemin d'accès), et que l'annonce ajouter le chemin d'accès à la liste (première ajout, puis effacer)

    L'erreur se produit car l'objet mPath est créé correspondant au mode de dessin précédent car il a été créé en mode souris avec le mode de dessin précédent.

    Déplacez la création mPath sur touch_start et le mode de dessin actuel sera utilisé:

     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); } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.