मैं एक ऐसा एप्लिकेशन बनाने की कोशिश कर रहा हूं जहां उपयोगकर्ता या तो छवि को धुंधला कर सकता है या स्क्रीन पर पेंट करना चुन सकता है (उपयोगकर्ता इन दोनों को एक कैनवास में भी कर सकता है)।कैनवास और मल्टीप्ले पेंट ऑब्जेक्ट्स पर चित्रण
मेरे पास यह बहुत अधिक काम कर रहा है, हालांकि, धुंध से पेंट या इसके विपरीत मोड बदलने के बाद मुझे पहले ड्रॉ पर ड्राइंग के साथ एक अजीब समस्या है।
कृपया नीचे दी गई छवि देखें।
पेंट मोड
रास्तों खड़ी तैयार की है जब उपयोगकर्ता रंग मोड का चयन किया गया है। जैसा कि आप देख सकते हैं कि पहले पथ में ब्लर पेंट ऑब्जेक्ट के साथ-साथ पेंट ऑब्जेक्ट (लाल स्ट्रोक के साथ) दोनों रंग शामिल हैं। अब खींचे गए किसी भी पथ को ठीक काम करता है।
ब्लर मोड
इसी तरह आप देख सकते हैं, दो ऊर्ध्वाधर पथ ड्राइंग के बाद, उपयोगकर्ता धुंधला करने के लिए मोड स्विच और इस मोड में क्षैतिज रास्तों खींचता है। इस बार उपरोक्त पहले पथ के समान दो पेंट ऑब्जेक्ट्स का मिश्रण है और बाद के पथ ठीक काम करते हैं।
कृपया नीचे पोस्ट किया गया कोड देखें और यदि आप सुझाव दे सकते हैं कि समस्या का कारण क्या हो सकता है तो यह बहुत अच्छा होगा।
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;
}
}
धन्यवाद:
touch_start को mpath निर्माण ले जाएँ और वर्तमान ड्राइंग मोड उपयोग किया जाएगा। मैंने कोशिश की। मैंने लाइन mPath = नया पथ() स्थानांतरित किया; जोड़ने के आदेश को जोड़ने के बाद, लेकिन यह अभी भी – Sahil
साहिल काम नहीं करता है, जिस रॉडर में आप प्रारंभिक नहीं हैं, वह अमर नहीं है। जिस क्रम में आप आकर्षित करते हैं वह है: एक पेपर की कल्पना करो, आप नीली कलम से आते हैं, फिर आप लाल कलम से आते हैं। लाल नीला ओवरले होगा। इससे कोई फर्क नहीं पड़ता कि आप टेबल पर पेंसिल डालते हैं। – Empty2k12