Android 可绘制形状和canvas.draw之间的区别,解决方法?

Android 可绘制形状和canvas.draw之间的区别,解决方法?,android,android-canvas,shapedrawable,Android,Android Canvas,Shapedrawable,在我的应用程序中,我使用两种方法来显示按钮和编辑文本:一种是使用xml形状可绘制,并将其应用于按钮/编辑文本的背景,另一种是在自定义视图中使用画布 我希望结果完全一样,但事实并非如此。您可以在下面看到各个笔划之间的细微差别: 两者都是圆形矩形,笔划宽度为2dp,角半径为8dp。 以下是它们各自的代码: 左侧,用作背景的可绘制形状: <?xml version="1.0" encoding="UTF-8"?> <shape xmlns:android="http://s

在我的应用程序中,我使用两种方法来显示按钮和编辑文本:一种是使用xml形状可绘制,并将其应用于按钮/编辑文本的背景,另一种是在自定义视图中使用画布

我希望结果完全一样,但事实并非如此。您可以在下面看到各个笔划之间的细微差别:

两者都是圆形矩形,笔划宽度为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>
其中:

    strokePaint     = new Paint(Paint.ANTI_ALIAS_FLAG);
    strokePaint     .setStyle(Paint.Style.STROKE);
    strokePaint     .setStrokeWidth((int)(2*densityObtainedWithDisplayMetrics)));
    strokePaint     .setColor(the exact same as above);
我观察到,当用同样被认为是等效的方式显示渐变时,会有细微的差别:可绘制的形状有更好的显示,颜色看起来更好,线条不模糊

有人能告诉我为什么/如何解决这个问题吗? 如果我只用一种方法,那就是第二种,但我不想,因为它看起来不干净。 谢谢你的帮助

编辑:


令人惊讶的是,只有当自定义布局的笔划宽度为奇数时,才会出现这种差异。对于偶数值,显示完全相同

我建议您查看
GradientDrawable
(实际从
XML标记创建的对象)的源代码,以查看框架为创建的给定形状放置的draw调用

您可以在
inflate()
方法中看到如何将XML解析到对象中,然后方法
draw()
是包含所有相关
Canvas
代码的地方


编辑:快速浏览,我看到的唯一主要区别是,当提供单个半径值时,框架使用了
canvas.drawRoundedRect()
而不是
canvas.drawrapath()
。它也会对填充和笔划执行此操作,即使在您的情况下填充是透明的。可能还有其他差异,我没有仔细跟踪所有代码。

尝试使用
strokePaint.setDither(true)。默认情况下,
ShapeDrawable
可能已经抖动。(还有,你可以上传图片到imgur或其他什么东西,然后发布链接。)它在里面,我没有把它放在代码里,因为它没有改变任何东西。@Soxxeh:我把图片放在imgur上:@0gravity:它不等于strokePaint=new Paint(Paint.ANTI_ALIAS_FLAG)@查尔斯:是的,这就是我删除评论的原因。我通常使用
strokePaint.setAntiAlias(true)而不是你正在做的方式,但它应该是相同的。为了安全起见,你可以试试看:)我希望我能把你的答案标记为有用,但我没有15%的声誉。。实际上,我是在研究格雷普码形状的可刷新代码。是的,我试过drawRoundRect,它没有改变任何东西。这很奇怪,因为如果你看图片imgur.com/njzxD,反Alizing在拐角处的效果相同,但在直线上的效果不同。我看到的唯一其他区别是使用了mStrokePaint.setColorFilter(mColorFilter);我对ColorFiler一无所知,developer.android.com也没有解释类引用中的任何内容。有人知道如何在android Canvas中显示文本吗?
    strokePaint     = new Paint(Paint.ANTI_ALIAS_FLAG);
    strokePaint     .setStyle(Paint.Style.STROKE);
    strokePaint     .setStrokeWidth((int)(2*densityObtainedWithDisplayMetrics)));
    strokePaint     .setColor(the exact same as above);