Ich versuche, eine Anwendung zu machen, wo der Benutzer entweder wählen kann, um das Bild zu verwischen oder wählen Sie auf dem Bildschirm malen (Benutzer kann auch beide auf einer Leinwand tun).Zeichnen auf Leinwand und mehrere Malobjekte
Ich habe es ziemlich funktioniert, aber ich habe ein seltsames Problem mit der Zeichnung auf einer ersten zeichnen, nachdem der Modus von Unschärfe zu malen oder umgekehrt geändert wird.
Bitte sehen Sie das Bild unten.
PAINT MODE
Die verstreckten Pfade vertikal ist, wenn der Benutzer ausgewählt hat Farbe-Modus. Wie Sie sehen können, enthält der erste Pfad Farbe sowohl von blur paint als auch von paint (mit rotem Strich). Alle weiteren gezeichneten Pfade funktionieren jetzt einwandfrei.
BLUR MODE
Ebenso können Sie sehen, nach zwei vertikalen Pfade zeichnen, schaltet Benutzer den Modus zu verwischen und zieht horizontalen Wege in diesem Modus. Diesmal ist ähnlich wie oben der erste Pfad eine Mischung aus zwei Malobjekten und nachfolgenden Pfaden.
Bitte beachten Sie den unten angegebenen Code und es wäre toll, wenn Sie vorschlagen können, was das Problem verursachen könnte.
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;
}
}
Vielen Dank für Ihre respnse. Ich habe es versucht. Ich habe die Zeile mPath = new Path() verschoben; um nach dem hinzufügen der Befehl hinzufügen, aber es funktioniert immer noch nicht – Sahil
Sahil, der Roder, in dem Sie initialialze ist nicht wichtig. Die Reihenfolge, in der Sie zeichnen, ist: Stellen Sie sich ein Papier vor, Sie zeichnen mit einem blauen Stift, dann zeichnen Sie mit einem roten Stift. Rot wird blau überlagern. Es ist egal, auf welche Weise du die Bleistifte auf den Tisch legst. – Empty2k12