2010-02-19 6 views
12

Angenommen, ich habe eine TextView von einer bestimmten Größe (ist nicht wirklich wichtig, was ... fill_parent, 20dip, was auch immer). Ist es möglich, den Text zu verkleinern, um ihn an den verfügbaren Platz anzupassen, ohne viel zu tun?Skalierung textSize in einem TextView

+0

Bitte beachten Sie die Antwort hier, funktioniert recht gut: [link Beschreibung eingeben hier] [1] [1]: http://stackoverflow.com/questions/5033012/auto-scale-textview-text-to-fit-within-bounds – AllDayAmazing

Antwort

18

Nun, es ist ein wenig einfacher als "eine Menge komplexer Mathematik", aber es gibt eine Hack-Lösung, die ich dafür benutze, wenn die Breite Ihres Textes nicht zu weit von der Breite Ihrer Textansicht entfernt ist.

// HACK to adjust text width 
    final int INITIAL_TEXTSIZE = 15; 
    final int TEXTVIEW_WIDTH = textviewBackground.getIntrinsicWidth(); // I use the background image to find the width, but you can use a fixed value or whatever other method you prefer. 
    final String text = ...; 
    textView.setText(text); 

    int size = INITIAL_TEXTSIZE; 
    while(textview.getPaint().measureText(text) > TEXTVIEW_WIDTH) 
     textview.setTextSize(--size); 

Wenn die Breite des Textes deutlich anders ist als die Breite des Textview sein kann, könnte es besser sein, eine binäre Suche statt einer linearen Suche zu verwenden, um die richtige Schriftgröße zu finden.

Nicht zu sagen, dies ist eine ideale Lösung, aber es ist ein sinnvoller, wenn Sie nicht oft Ihre Textgröße anpassen müssen. Wenn Sie Ihre Textsize häufig anpassen müssen, ist es möglicherweise besser, etwas komplexe Mathematik zu machen.

+0

+1 Sehr nette Antwort. Sollte die akzeptierte IMO sein. –

0

U kann den idea Schriftgrößenwert für eine TextView berechnen. Das ist die Schriftgröße, die es füllt, ohne zu groß zu sein. Die Formel lautet:

fontSize = (TextView Height) * (width DPI/height DPI)/(Screen Width * Screen Height); 

Die Breite und Höhe DPI können durch Überschreiben der onConfigurationChanged Methode in Ihrer Tätigkeit erworben werden, und mit newConfig.screenWidthDp und newConfig.screenHeightDp.

Die Bildschirmgröße in Pixel kann je nach Bedarf

// Get Screen Size 
static public Point getScreenSize(Activity aActivity) 
{ 
    Display display = aActivity.getWindowManager().getDefaultDisplay(); 
    Point size = new Point(); 
    display.getSize(size); 
    return size; 
} 

Ich berechne nur diesen Wert mit der folgenden Hilfsfunktion erworben werden (in onConfigurationChanged) und schieben Sie es bis zu einem gewissen statischen Hilfsklasse. Wenn ein TextView dann bestimmen muss, welche Schriftgröße verwendet werden soll, wird sie aus dieser Klasse entfernt.

Es funktioniert, aber möglicherweise nicht die einfachste Lösung.

+0

Nutzlos. Berücksichtigt nicht die Länge von Zeichen. – AndroidDev

2

Ich probierte fast alle der oben genannten und am meisten fehlgeschlagen einschließlich der oberen. Der einfachste und effektivste, den ich gefunden habe, war von emmby, aber ich fand, dass Sie die anfängliche Textgröße einstellen mussten. Hier ist eine Verbesserung seiner wo Sie brauchen keine Textgröße überhaupt angeben:

final String text = "HELP"; 

    TextView tvFlash = (TextView) findViewById(R.id.tvFlash); 

    DisplayMetrics metrics = getResources().getDisplayMetrics(); 
    int width = metrics.widthPixels; 
    int height = metrics.heightPixels; 

    tvFlash.setText(text); 
    tvFlash.setTextSize(TypedValue.COMPLEX_UNIT_PX, 1); 

    int size = 1; 

    do 
    { 
    float textWidth = tvFlash.getPaint().measureText(text); 

    if (textWidth < width) 
     tvFlash.setTextSize(++size); 
    else 
    { 
     tvFlash.setTextSize(--size); 
     break; 
    } 
    }while(true);