2012-07-13 93 views
0

我使用两种方法在我的应用程序中显示按钮和编辑文本:一种是使用可绘制的xml形状,并将其应用于按钮/编辑文本的背景,另一种是使用自定义视图中的画布。形状drawable和canvas.draw之间的区别,解决方法?

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

enter image description here

两者都是圆rectanlges与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); 

,并显示具有t梯度时,我观察到的微小差异他相同的假设等价的方式:可绘制的形状有一个更好的显示,颜色看起来更好,线条不模糊。

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

编辑:

令人惊讶地,发生这种差异仅当自定义布局的笔划宽度为奇数。即使值的显示也完全一样!

+0

尝试使用'strokePaint.setDither(true);'。 'ShapeDrawable'可能已经被默认的抖动。 (另外,你可以上传图片到imgur或其他东西,然后张贴链接。) – Eric 2012-07-13 17:25:56

+0

这是在它,我没有把它放在代码中,因为它不会改变任何东西。 – 2012-07-13 17:27:39

+0

@Soxxeh:我把图片imgur:http://imgur.com/njzxD – 2012-07-13 17:32:08

回答

2

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

GradientDrawable.java

可以在inflate()方法的XML是如何解析出到对象,然后看到了法draw()是所有pertient Canvas代码包含。

编辑:乍一看,我看到的唯一的主要区别是,当提供单个半径值时,框架使用canvas.drawRoundedRect()而不是canvas.drawPath()。它也适用于填充和中风,即使在你的情况下填充是透明的。可能还有其他的不同之处,我没有密切注意所有的代码。

+0

我希望我可以将你的答案标记为有用,但我没有15声望..我实际上在GrepCode ShapeDrawable代码上游荡。 是的,我试过drawRoundRect,它不会改变任何东西。这很奇怪,因为如果你看图imgur.com/njzxD,antialising在角上的作用是一样的,不同之处在于直线。 我看到的唯一的其他区别是使用 mStrokePaint.setColorFilter(mColorFilter); 我不知道什么关于colorfilers,并且developer.android.com没有解释类参考中的任何东西。 – 2012-07-13 18:52:24

+0

任何人都知道如何在Android Canvas中使用RectShape显示文本ShapeDrawable? – 2014-08-20 11:37:38