2015-11-25 8 views
8

私は、ユーザーが画像をぼかすか、画面にペイントするかを選択できるアプリケーションを作成しようとしています(これらの両方をキャンバスで行うこともできます)。キャンバスと複数のペイントオブジェクトに描画する

私はそれほど多くの作業を行っていますが、モードがぼかしからペイントに変更されたり、その逆に変更されたりすると、最初の描画で描画に奇妙な問題が発生します。

下記の画像をご覧ください。ユーザは、ペイントモードを選択したときに垂直に描か

ペイントモード

経路があります。あなたが見ることができるように、最初のパスには、ぼかしペイントオブジェクトとペイントオブジェクトの両方からのペイント(赤いストローク)が含まれています。後で描画されるパスはすべて正常に動作します。

BLUR MODE

同様にあなたが見ることができ、二つの垂直パスを描画した後、ユーザがあいまいにモードを切り替えると、このモードでの水平パスを描画します。この最初のパスに似ているこの時間は、2つのペイントオブジェクトの混合であり、後続のパスはうまく動作します。

下記のコードを参照してください。問題の原因となる可能性のあることが示唆されていれば幸いです。

enter image description here

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

答えて

4

(最初にクリアし、追加)おそらくパス(新しいパスを)クリアtouch_upで2行の順序を切り替えたい、それが広告にリストへのパスを追加

+0

感謝を。私はこれを試しました。私は行を移動しましたmPath = new Path(); addコマンドを追加した後になるが、それでも動作しない。 – Sahil

+0

Sahil、初期化するローダは無邪気ではない。あなたが描く順序は次のとおりです:紙を想像し、青いペンで描いてから、赤いペンで描きます。赤色が青色にオーバーレイします。どのように鉛筆をテーブルの上に置いても問題ありません。 – Empty2k12

1

mPathオブジェクトが以前の描画モードでマウスアップして作成されたため、以前の描画モードと一致するように作成されているため、エラーが発生します。

touch_startと、現在の描画モードにMPATH作成を移動しますが使用されます:あなたのrespnseため

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); 
} 
関連する問題