1

我使用两种方法在我的应用程序中显示按钮和编辑文本:一种是使用可绘制的 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);
}

哪里:

    strokePaint     = new Paint(Paint.ANTI_ALIAS_FLAG);
    strokePaint     .setStyle(Paint.Style.STROKE);
    strokePaint     .setStrokeWidth((int)(2*densityObtainedWithDisplayMetrics)));
    strokePaint     .setColor(the exact same as above);

而且我在使用相同的所谓等效方式显示渐变时观察到微小的差异:可绘制的形状具有更好的显示效果,颜色看起来更好,线条不模糊。

有人可以解释一下为什么/如何解决它吗?如果我只使用一种方式,那将是第二种方式,但我不想这样做,因为它看起来不干净。谢谢你的帮助!

编辑 :

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

4

1 回答 1

2

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

GradientDrawable.java

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

编辑:一目了然,我看到的唯一主要区别是框架使用canvas.drawRoundedRect()而不是canvas.drawPath()在提供单个半径值时使用。它也适用于填充和描边,即使在您的情况下填充是透明的。可能还有其他差异,我没有仔细跟踪所有代码。

于 2012-07-13T18:04:48.027 回答