【问题标题】:How do I make text in a Bitmap scale properly on different screen densities in Android?如何在 Android 的不同屏幕密度上正确缩放位图中的文本?
【发布时间】:2012-07-04 02:11:00
【问题描述】:

我对 android 编程很陌生,但有人为我编写了一个小部件,但他们所做的事情与我想要的有点不同......他们设置了所有小部件中的文本显示为位图而不是文本视图。这并没有给我我想要的控制权。让我发布我所拥有的代码,看看是否有人可以提供帮助。这是它的 .java 代码:

    String strHourFormat = "hh:mm";
    String strDateFormat = "MM.dd.yy";
    SimpleDateFormat fHour = new SimpleDateFormat(strHourFormat);
    SimpleDateFormat fDate = new SimpleDateFormat(strDateFormat);
    Date date = new Date();
    String am = date.getHours() > 11 ? "PM":"AM";

    setContentView(R.layout.widget_ui);
    TextView day = new TextView(this);
    day = (TextView) findViewById(R.id.day);
    day.setText("" + fDate.format( date));
    day.setTypeface(Typeface.createFromAsset(this.getAssets(), "roboto_thin.ttf"));

    ///////////
    WidgetBiggs.previousState = WidgetBiggs.getWifiState(getApplication());     
    SoundDebug.previousState = SoundDebug.getSoundState(getApplication());
    // Update each requested appWidgetId
    RemoteViews widgetView = WidgetBiggs.buildUpdate(getApplication(), -1);

    for(int wid:widgetIds){
        //final RemoteViews widgetView = new RemoteViews(getPackageName(),R.layout.widget_ui);
        widgetView.setImageViewBitmap( R.id.img_Hour, updateFontText(""+fHour.format(date),40,100,84,100,60)); 
        widgetView.setImageViewBitmap( R.id.img_AM, updateFontText(""+am,25,40,84,40,60)); 
        widgetView.setImageViewBitmap( R.id.img_Day, updateFontText("" + fDate.format( date),38,150,40,150,40)); 
        //widgetView.setImageViewBitmap( R.id.img_Weather, updateFontText(getWeatherGoogle().toString(),25,120,30,120,30));

介于两者之间的其他一些东西......

private Bitmap updateFontText(String time, int size, int width, int height, int widthText, int heightText) 
{
Bitmap myBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_4444);
Canvas myCanvas = new Canvas(myBitmap);
Paint paint = new Paint();
Typeface clock = Typeface.createFromAsset(this.getAssets(),"roboto_thin.ttf");
paint.setAntiAlias(true);
paint.setSubpixelText(true);
paint.setTypeface(clock);
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.WHITE);
paint.setTextSize(size);
paint.setTextAlign(Align.RIGHT );
myCanvas.drawText(time, widthText, heightText, paint);
return myBitmap;

这是我开始的 XML:

<TextView
    android:id="@+id/day"
    android:visibility="visible"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:gravity="center_horizontal|center_vertical"
    android:textSize="32dp">            
</TextView>

这会导致我的应用程序出现问题。如果你看到任何突出的东西,请告诉我。我想把位图文字拿出来,把textview文字放进去。谢谢!

【问题讨论】:

  • 我不太确定你在这里问什么。您能否澄清您的问题。
  • 当然,我很抱歉。我有一个需要显示一些文本的小部件。确切的时间和日期。它目前这样做,但通过画布视图作为位图。正因为如此,文本的大小不会随着我需要的不同密度屏幕而改变。文本在更高分辨率的手机上显得很小。所以我需要将文本显示为文本,这样我可以在 UI.XML 中设置大小,它将在更高分辨率的屏幕上显示为正确的大小。我想知道该怎么做。我(上面)输入的代码似乎不起作用。
  • 或者如果以某种方式编写小部件以考虑不同分辨率的屏幕并通过画布视图保持文本显示会更简单。我也会接受。

标签: android text bitmap textview android-canvas


【解决方案1】:

他们的位图策略没有错。只需根据屏幕密度更改“大小”参数即可。

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);

现在将您的 sizewidthheightwidthTextheightText 值乘以 metrics.density

这会将它们视为 dp 值,以便为您所在的屏幕生成正确的 px 值。

来自文档:

DisplayMetrics.density 字段指定您必须使用的比例因子 用于根据当前屏幕将 dp 单位转换为像素 密度。在中等密度屏幕上,DisplayMetrics.density 等于 1.0;在高密度屏幕上它等于 1.5;在超高密度屏幕上,它等于 2.0;在低密度屏幕上,它等于 0.75。 这个数字是你应该乘以 dp 单位的因素 获取当前屏幕的实际像素数。

如果您坚持使用位图,您将对字体渲染有更多的控制权。

【讨论】:

  • 谢谢汤姆!我已经实现了 DisplayMetrics,但我不确定如何将这些值乘以 metrics.density。对不起,我还是很绿..
【解决方案2】:

您的问题的简短回答是,使用密度资源。如果您使用的是高密度屏幕,但您的位图在:

res/drawable-hdpi/

长答案是,屏幕密度没有“灵丹妙药”,可以这么说,要拥有成功的应用程序,您需要确保您的应用程序在所有屏幕上都能正常工作。让您的图像在一个屏幕上呈现很容易,但在多个分辨率下保持相同则有点棘手。

这篇文章很好地讨论了一些不同的方法和技术,您可以使用这些方法和技术来确保您的位图在所有屏幕上正确显示,而不仅仅是一个屏幕。本文包含一些您应该了解的最佳做法和其他信息,这将使您更轻松:

http://developer.android.com/guide/practices/screens_support.html

祝你好运!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2013-10-27
    相关资源
    最近更新 更多