我在我的应用程序中使用两种方式显示按钮和编辑文本:一种是使用xml形状可绘制,并将其应用于按钮/ edittext的背景,另一种是使用自定义中的画布图。
我希望结果完全相同,但事实并非如此。您可以在下面看到相应笔画之间的细微差别:
两者都是圆形矩形,行程宽度为2dp,角半径为8dp。 以下是每个代码:
左,可绘制的形状用作背景:
<?xml version="1.0" encoding="UTF-8"?>
<shape
xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="@color/transparent"/>
<corners android:radius="@dimen/button_cornersRadius"/>
<stroke
android:width="@dimen/button_strokeWidth"
android:color="@color/blue_light"/>
</shape>
是的,自定义视图的onDraw方法:
protected void onDraw(Canvas canvas) {
canvas.drawPath(drawingPath,strokePaint);
canvas.drawText(text,demiWidth,textHeight,textPaint);
}
Whith:
strokePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
strokePaint .setStyle(Paint.Style.STROKE);
strokePaint .setStrokeWidth((int)(2*densityObtainedWithDisplayMetrics)));
strokePaint .setColor(the exact same as above);
我在使用相同的方法显示渐变时观察到微小的差异:可绘制的形状有更好的显示,颜色看起来更好,线条不模糊。
有人可以解释一下为什么/如何解决它? 如果我只使用一种方式,它将是第二种,但我不想,因为它看起来不干净。 谢谢你的帮助!
编辑:
令人惊讶的是,只有当自定义布局的笔触宽度为奇数时才会出现这种差异。使用偶数值,显示完全相同!
答案 0 :(得分:2)
我建议您查看GradientDrawable
(实际从<shape>
XML标记创建的对象)的源代码,以查看框架为给定框架设置的绘制调用形状创造。
您可以在inflate()
方法中看到如何将XML解析到对象中,然后方法draw()
就是包含所有相关Canvas
代码的地方。
编辑:快速浏览一下,我看到的唯一主要区别是,当提供单个半径值时,框架使用canvas.drawRoundedRect()
而不是canvas.drawPath()
。它也适用于填充和描边,即使在您的情况下填充是透明的。可能还有其他差异,我没有密切跟踪所有代码。