2015-11-25 4 views
8

मैं एक ऐसा एप्लिकेशन बनाने की कोशिश कर रहा हूं जहां उपयोगकर्ता या तो छवि को धुंधला कर सकता है या स्क्रीन पर पेंट करना चुन सकता है (उपयोगकर्ता इन दोनों को एक कैनवास में भी कर सकता है)।कैनवास और मल्टीप्ले पेंट ऑब्जेक्ट्स पर चित्रण

मेरे पास यह बहुत अधिक काम कर रहा है, हालांकि, धुंध से पेंट या इसके विपरीत मोड बदलने के बाद मुझे पहले ड्रॉ पर ड्राइंग के साथ एक अजीब समस्या है।

कृपया नीचे दी गई छवि देखें।

पेंट मोड

रास्तों खड़ी तैयार की है जब उपयोगकर्ता रंग मोड का चयन किया गया है। जैसा कि आप देख सकते हैं कि पहले पथ में ब्लर पेंट ऑब्जेक्ट के साथ-साथ पेंट ऑब्जेक्ट (लाल स्ट्रोक के साथ) दोनों रंग शामिल हैं। अब खींचे गए किसी भी पथ को ठीक काम करता है।

ब्लर मोड

इसी तरह आप देख सकते हैं, दो ऊर्ध्वाधर पथ ड्राइंग के बाद, उपयोगकर्ता धुंधला करने के लिए मोड स्विच और इस मोड में क्षैतिज रास्तों खींचता है। इस बार उपरोक्त पहले पथ के समान दो पेंट ऑब्जेक्ट्स का मिश्रण है और बाद के पथ ठीक काम करते हैं।

कृपया नीचे पोस्ट किया गया कोड देखें और यदि आप सुझाव दे सकते हैं कि समस्या का कारण क्या हो सकता है तो यह बहुत अच्छा होगा।

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

धन्यवाद:

touch_start को mpath निर्माण ले जाएँ और वर्तमान ड्राइंग मोड उपयोग किया जाएगा। मैंने कोशिश की। मैंने लाइन mPath = नया पथ() स्थानांतरित किया; जोड़ने के आदेश को जोड़ने के बाद, लेकिन यह अभी भी – Sahil

+0

साहिल काम नहीं करता है, जिस रॉडर में आप प्रारंभिक नहीं हैं, वह अमर नहीं है। जिस क्रम में आप आकर्षित करते हैं वह है: एक पेपर की कल्पना करो, आप नीली कलम से आते हैं, फिर आप लाल कलम से आते हैं। लाल नीला ओवरले होगा। इससे कोई फर्क नहीं पड़ता कि आप टेबल पर पेंसिल डालते हैं। – Empty2k12

1

त्रुटि तब होती है क्योंकि 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); 
} 
संबंधित मुद्दे