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