簡體   English   中英

如何在Android中的不同屏幕密度下使位圖中的文本正確縮放?

[英]How do I make text in a Bitmap scale properly on different screen densities in Android?

我對android編程很陌生,但是我有一些人為我編寫了一個小部件,但是他們所做的事情與我想要的有所不同...他們設置了所有文本小部件將顯示為位圖而不是textview。 但是,這並沒有給我我想要的控制權。 讓我發布有關此功能的代碼,看看是否有人可以提供幫助。 這是它的.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文本。謝謝!

他們的位圖策略沒有錯。 只需根據屏幕密度更改“大小”參數即可。

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

現在muliply你的sizewidthheightwidthTextheightText值由metrics.density

這會將它們視為dp值,以為您所在的屏幕產生正確的px值。

從文檔:

DisplayMetrics.density字段指定根據當前屏幕密度將dp單位轉換為像素所必須使用的比例因子。 在中等密度的屏幕上,DisplayMetrics.density等於1.0; 在高密度屏幕上,它等於1.5; 在超高密度屏幕上,它等於2.0; 在低密度屏幕上,它等於0.75。 此數字是您應乘以dp單位以獲得當前屏幕的實際像素數的系數。

如果堅持使用位圖,則可以更好地控制字體渲染。

您問題的簡短答案是,使用密度資源。 如果您使用的是高密度屏幕,但是位圖位於:

res/drawable-hdpi/

長的答案是,屏幕密度沒有“銀彈”,可以這樣說並擁有一個成功的應用程序,您需要確保您的應用程序可在所有屏幕上正常工作。 使您的圖像在一個屏幕上渲染很容易,在多種分辨率下保持相同則有點棘手。

本文在討論可用於確保位圖在所有屏幕上正確顯示而不只是在所有屏幕上正確顯示的一些不同方法和技術方面做得很好。 本文提供了一些最佳實踐和您應了解的其他信息,它們將使您更輕松:

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

祝你好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM