的ArrayList
ArrayList<Pair<Path, Float>> foregroundPaths = new ArrayList<Pair<Path, Float>>();
油漆启动
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();
以上代码能够使用手指在画布上绘图。但问题是当多条路径相互交叉时它的重叠。我附上了我的应用快照的链接。 重叠在绿色矩形内。我将Xfermode设置为绘画但不按预期工作。
请帮助我并建议我,我该怎么做才能解决这个问题。 任何建议将不胜感激。 感谢
答案 0 :(得分:1)
你试过了吗?
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.XOR));
毕竟你想要的是一个异或(XOR) - 第一行或第二行,但不是彼此重叠。
我没有试过这个,看起来似乎是合乎逻辑的答案。
答案 1 :(得分:1)
mPaint.setXfermode(new AvoidXfermode(Color.RED, 90, Mode.AVOID));
对我有用。
答案 2 :(得分:0)
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.OVERLAY));
答案 3 :(得分:0)
由于AvoidXferMode 已贬值,这对使用API 16+ 的人会很有帮助。这更像是一种解决方法。但工作得很好。出现这种重叠错误的原因是为绘制设置了 alpha 值。
例如,如果您想使用带有 alpha 的“红色”颜色 您实际上可以使用实用程序函数将透明度设置为“红色”,而不是传递 mPaint.setAlpha()。
所以在这种情况下,只需使用 mPaint.setColor(Color.parseColor(getTransparentColor(Color.Red, 50)));并且不要使用 setAlpha。
使用以下代码获得透明颜色。
public static String getTransparentColor (int colorCode, int transCode) {
// convert color code into hexa string and remove starting 2 digit
String color = defaultColor;
try{
color = Integer.toHexString(colorCode).toUpperCase().substring(2);
}catch (Exception ignored){}
if (!color.isEmpty() && transCode < 100) {
if (color.trim().length() == 6) {
return "#" + convert(transCode) + color;
} else {
Log.d(TAG, "Color is already with transparency");
return convert(transCode) + color;
}
}
// if color is empty or any other problem occur then we return deafult color;
return "#" + Integer.toHexString(defaultColorID).toUpperCase().substring(2);
}
/**
* This method convert numver into hexa number or we can say transparent code
*
* @param trans number of transparency you want
* @return it return hex decimal number or transparency code
*/
public static String convert(int trans) {
String hexString = Integer.toHexString(Math.round(255 * trans / 100));
return (hexString.length() < 2 ? "0" : "") + hexString;
}
注意: 即使在所有这些更改之后,如果出现重叠错误,也请添加以下代码。
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.XOR));