【问题标题】:Difference between shape drawable and canvas.draw, workaround?形状drawable和canvas.draw之间的区别,解决方法?
【发布时间】:2012-07-13 17:24:21
【问题描述】:

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

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

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

编辑:

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

【问题讨论】:

  • 尝试使用strokePaint.setDither(true);。默认情况下,ShapeDrawable 可能已经被抖动。 (另外,你可以上传图片到 imgur 之类的,然后发布链接。)
  • 在里面,我没有把它放在代码中,因为它并没有改变任何东西..
  • @Soxxeh : 我把图片放在 imgur 上 : imgur.com/njzxD
  • @0gravity : 不等于 strokePaint = new Paint(Paint.ANTI_ALIAS_FLAG); ?
  • @Charles 是的,这就是我删除评论的原因。我通常使用strokePaint.setAntiAlias(true); 而不是你的做法,但应该是一样的。为了安全起见,您可以尝试一下 :)

标签: android android-canvas shapedrawable


【解决方案1】:

我建议您查看GradientDrawable 的源代码(实际上是从&lt;shape&gt; XML 标记创建的对象),以查看框架为创建的给定形状实施的绘制调用。

GradientDrawable.java

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

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

【讨论】:

  • 我希望我可以将您的答案标记为有用,但我没有 15 名声望。我实际上是在研究 GrepCode ShapeDrawable 代码。是的,我尝试了 drawRoundRect 并没有改变任何东西。这很奇怪,因为如果您查看图片 imgur.com/njzxD,抗锯齿在拐角处的效果相同,区别在于直线上。我看到的唯一其他区别是使用 mStrokePaint.setColorFilter(mColorFilter);我对colorfilers一无所知,developer.android.com在类参考中没有解释任何内容..
  • 有人知道如何使用 RectShape 在 Android Canvas ShapeDrawable 中显示文本吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-05
  • 1970-01-01
  • 2020-05-11
  • 2011-03-06
  • 1970-01-01
  • 1970-01-01
  • 2021-11-07
相关资源
最近更新 更多