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

  • Canvas 'drawLine and drawRect ne comprend pas la position finale?
  • Android Paint.setTypeface ne fonctionne pas pour l'italique
  • Comment tester l'application sans guignol?
  • Comment remplir la couleur dans l'image dans une zone particulière?
  • Couche de fond de la toile Android (application Canvas)
  • Comment appliquer la couleur de la brosse avec des points dans Paint android application?
  • Comment obtenir la hauteur du texte avec une largeur fixe et obtenir une longueur de texte qui correspond à une image?
  • Android: signature numérique utilisant Bezier
  • 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.