Dibujo sobre lienzo y varios objetos de pintura

Estoy tratando de hacer una aplicación donde el usuario puede elegir borrosa la imagen o puede optar por pintar en la pantalla (el usuario también puede hacer ambos de estos en un lienzo).

Lo tengo bastante trabajo sin embargo, estoy teniendo un extraño problema con el dibujo en un primer sorteo después de que el modo se cambia de desenfoque a la pintura o viceversa.

Por favor vea la imagen abajo.

MODO DE PINTURA

Los caminos trazados verticalmente son cuando el usuario tiene seleccionado el modo de pintura. Como se puede ver, la primera ruta contiene la pintura tanto del objeto de pintura borroso como del objeto de pintura (con trazo rojo). Cualquier trayectoria posterior dibujada ahora funciona bien.

MODO BLUR

Del mismo modo, puede ver, después de dibujar dos rutas verticales, el usuario cambia el modo a desenfoque y dibuja rutas horizontales en este modo. Esta vez similar a la anterior primera vía es una mezcla de dos objetos de pintura y caminos posteriores funciona bien.

Vea por favor el código fijado abajo y sería estupendo si usted puede sugerir qué podría causar el problema.

Introduzca aquí la descripción de la imagen

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

Es probable que desee cambiar el orden de las 2 líneas en touch_up que borrar la ruta (nueva ruta), y que añadir el anuncio de la ruta de acceso a la lista (primero agregar y, a continuación, claro)

El error se produce porque el objeto mPath se crea que coincide con el modo de dibujo anterior ya que se creó en mouse-up con el modo de dibujo anterior.

Mueva la creación mPath a touch_start y se utilizará el modo de dibujo actual:

 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); } 
  • Obtener la altura del texto incluyendo el tamaño de fuente y establecer esa altura
  • Android - Cómo dibujar en vista
  • Android Paint setShadowLayer () ignora el color de su Paint
  • Línea dinámicamente generada con brillo efectivo
  • Detección de color de la imagen de fondo con Android Paint
  • ¿Cómo dibujo texto en negrita en un mapa de bits?
  • Dibujar mapa de bits girado con anti alias
  • Android FingerPaint Deshacer / Rehacer la implementación
  • ¿Comportamiento diferente para FillType.EVEN_ODD al agregar un CornerPathEffect?
  • Android cómo dibujar la pintura en mano libre en MapView con superposición?
  • Android conjunto de la fuente personalizada a una pintura
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.