1

我对 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文本放进去。谢谢!

4

2 回答 2

1

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

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

现在将您的size, width, height,widthTextheightText值乘以metrics.density

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

从文档:

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

如果您坚持使用位图,您将可以更好地控制字体渲染。

于 2012-07-04T07:15:38.980 回答
0

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

res/drawable-hdpi/

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

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

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

祝你好运!

于 2012-07-04T15:22:50.110 回答