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.
- Dibujar líneas peródicamente
- Bitmapshader y canvas.scaling android
- Android: ¿qué hace esta bandera Paint: DEV_KERN_TEXT_FLAG?
- ¿Definir un estilo de pintura, color, etc en XML?
- Detección de la posición inicial y final de un 'arrastre' en Android y dibujo de una línea entre ellos
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.
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; } }
- Android: firma digital con Bezier
- Captura de pantalla
- Cómo convertir rgb color a int en java
- Canvas 'drawLine y drawRect no incluye la posición final?
- ¿Cómo dibujo una línea blanca semitransparente?
- ¿Cómo aplicar el color del pincel con puntos en la aplicación Paint android?
- Dibujar texto sobre lienzo en ángulo
- Cómo crear este tipo de pincel para pintar en android
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); }
- ¿Cómo superponer el color del texto del elemento de la lista en una región específica?
- Reproducir vídeo en el cuadro de diálogo android