2012-07-13 92 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