2013-05-13 3 views
0

ArrayListцвет перекрытия при рисовании множественного пути

ArrayList<Pair<Path, Float>> foregroundPaths = new ArrayList<Pair<Path, Float>>(); 

Краска initilization

mPaint = new Paint(); 
    mPaint.setAntiAlias(false); 
    mPaint.setDither(true); 
    mPaint.setColor(0x0FFF0000); 
    mPaint.setStyle(Paint.Style.STROKE); 
    mPaint.setStrokeJoin(Paint.Join.BEVEL); 
    mPaint.setStrokeCap(Paint.Cap.ROUND); 
    mPaint.setStrokeWidth(Math.abs(ImageViewTouch.brushSize 
        /getScale())); 

    mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP)); 

    mPaint.setAlpha(0x80); 

OnDraw

canvas.save(); 


    displayRectF = new RectF(); 


    canvas.concat(getDisplayMatrix()); 

    rect = canvas.getClipBounds(); 
    displayRectF.set(rect); 

    for (Pair<Path, Float> p : foregroundPaths) { 
     mPaint.setStrokeWidth(p.second); 
     canvas.drawPath(p.first, mPaint); 
    } 



    canvas.restore(); 

enter image description here

Выше коды способны нарисовать холст пальцем. Но проблема заключается в том, что несколько путей пересекают друг друга, перекрывая друг друга. Я добавил ссылку на снимок приложения. Перекрытие находится внутри зеленого прямоугольника. Я установил Xfermode для рисования, но не работал, как я ожидаю.

Пожалуйста, помогите мне и предложите мне, что я должен сделать, чтобы удалить эту проблему. любое предложение будет оценено. Благодаря

+0

пробовал нижеследующий ?. Работает ли это для вас? – Raghunandan

+0

почему вы не заметили внезапно – Raghunandan

+0

даже с этим mBitmap = Bitmap.createBitmap (w, h, Bitmap.Config.ARGB_8888); mCanvas = новый холст (mBitmap); его та же история. доя сопли решает. Поэтому я думаю, что мой ответ в этом контексте прав. – Raghunandan

ответ

1
mPaint.setXfermode(new AvoidXfermode(Color.RED, 90, Mode.AVOID)); 

это работает для меня.

+0

AvoidXfermode устарел на уровне API 16 – kldavis4

1

Вы пробовали:

mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.XOR)); 

В конце концов, что вы хотите, это исключающее ИЛИ (XOR) - либо первая линия или вторая линия, но не оба друг на друга.

Я не пробовал это, просто кажется логичным ответом.

0
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.OVERLAY)); 
+0

Это не дает ответа на вопрос. Чтобы критиковать или запросить разъяснения у автора, оставьте комментарий ниже своего сообщения - вы всегда можете прокомментировать свои собственные сообщения, и как только у вас будет достаточно [репутации] (http://stackoverflow.com/help/whats-reputation), вы будете быть в состоянии [прокомментировать любое сообщение] (http://stackoverflow.com/help/privileges/comment). –

+0

@PieterGoosen Прошу прощения, но насколько я вижу, мой ответ напрямую связан с исходным вопросом. ravi roshan спросил, как избежать перекрытия двух путей, когда он полупрозрачен, и использование режима PorterDuff.Mode.OVERLAY именно для этого. Если вы думаете, что я не понял вопрос, пожалуйста, поправьте меня. –

Смежные вопросы