shape drawable和canvas.draw之间的区别,解决方法?

时间:2012-07-13 17:24:21

标签: android android-canvas shapedrawable

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

我希望结果完全相同,但事实并非如此。您可以在下面看到相应笔画之间的细微差别:

enter image description here

两者都是圆形矩形,行程宽度为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);

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

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

编辑:

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

1 个答案:

答案 0 :(得分:2)

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

GradientDrawable.java

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

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