2013-07-20 41 views
4

要在我的Widget上放置自定義字體,我正在使用其中的字體創建位圖,然後將該位圖放入我的RemoteView中。然而,位圖上的文本相當模糊,並且看起來相當像一個活動中的水晶般清晰。當使用位圖時,RemoteViews(Widget)具有模糊文字

已有相當多的應用程序在小部件上使用自定義字體。儘管如此,我還沒有找到一個堅實的方法來做到這一點。如果有人有更好的解決這個問題,我很樂意聽到它!

現在這是我用來創建位圖,並將其放置在窗口小部件是什麼:

RemoteViews widgetView = new RemoteViews(this.getPackageName(), R.layout.widget); 
widgetView.setImageViewBitmap(R.id.widgetImage, buildBitmap()); 

public Bitmap buildBitmap() { 
     Bitmap bitmap = Bitmap.createBitmap(160, 84, Bitmap.Config.ARGB_8888); 
     Canvas canvas = new Canvas(bitmap); 

     TextPaint textPaint = new TextPaint(TextPaint.LINEAR_TEXT_FLAG | TextPaint.ANTI_ALIAS_FLAG); 
     textPaint.setTypeface(getFont()); 
     textPaint.setStyle(Style.FILL); 
     textPaint.setColor(fontColor); 
     textPaint.setTextSize(fontSize); 

     StaticLayout staticLayout = new StaticLayout(textString, textPaint, bitmap.getWidth(), Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false); 
     staticLayout.draw(canvas); 

     return bitmap; 
    } 

罪魁禍首小工具!最上面的那個是自定義字體,中間的圖像是在位圖上使用默認的Sans字體,以顯示無論使用什麼字體,文本都是模糊的。

最後一張圖片是使用默認的remoteView.setTextViewText("Text");代替位圖時的文字。

對此問題的任何幫助將不勝感激!

enter image description here enter image description here enter image description here

+2

160x84尺寸看起來非常小 - 你不應該調整屏幕密度嗎? – Delyan

+0

提醒我爲什麼你不能只使用自定義字體的textview? – Tom

+3

@Tom因爲它是一個小部件。 'RemoteViews'不會讓你這樣做。 – kabuko

回答

2

你不能假設160x84。這是一個非常小的尺寸。縮放時,它可能會模糊,如你所見。相反,您會希望根據給定的sp上文本的測量結果實際測量出位圖大小。 Paint.measureText有時候對於這些東西有用,以獲得寬度,但你也需要身高來做對,所以getTextBounds可能更有用。你可能還需要添加一些填充,但這應該讓你開始。正如你在圖片中看到的那樣,清晰並不是你必須處理的唯一問題。你也必須弄清楚換字(也許這裏Paint.measureText會派上用場)。

+0

將160x84更改爲300x400之類的東西肯定有所作爲!但它不是小部件的實際大小。我已經嘗試了measureText和getTextBounds。他們返回非常大的數字,例如Paint.measureText()返回7375. – Gatekeeper

+0

您是否在具有適當值的paint對象上調用了「setTextSize」和「setTextScale」? – kabuko

+0

現在,我將18傳入'setTextSize',但不對'setTextScaleX'做任何事情。更改'setTextScaleX'只是向左或向右拉伸文本,使其傾斜。 – Gatekeeper

0

您正在使用的ImageView需要android:scaleType="matrix"屬性才能添加。編輯您的小部件佈局xml並在需要的地方添加該屬性。 ImageView將不會嘗試縮放圖像以適應視圖。

以前的帖子都說你的像素尺寸是錯的。您應該保留每個小部件大小的記錄,以便稍後可以使用它來創建位圖。

如果您需要幫助,我可以發佈一些代碼。接受這個答案並專門發佈關於該問題的另一個問題,我將在那裏回答代碼。

+3

請不要勒索用戶接受答案或發佈新的,有點相關的問題。如果你能幫忙,幫忙。如果不是,不要。 – Delyan

+0

我不是在勒索任何人..我實際上已經發布了他的問題的答案。在重新閱讀我的答覆後,我可以看到它是如何以不同的方式出現的,以及我的措辭如何更好。我只是說,另一個問題基本上是不相關的,如果他想回答這個問題,他應該發表另外一個問題。 – Simon