Hintergrund
Oft müssen wir die Schriftart der Textansicht automatisch an die ihr zugewiesenen Grenzen anpassen.
Das Problem
Obwohl es viele Threads und Beiträge (und Lösungsvorschläge) gibt, die über dieses Problem sprechen (Beispiel hier , hier und hier ), funktioniert leider keiner von ihnen wirklich gut.
Deshalb habe ich beschlossen, jeden von ihnen zu testen, bis ich das richtige Angebot gefunden habe.
Ich denke, dass die Anforderungen an eine solche Textansicht sein sollten:
Sollte die Verwendung von Schriftarten, Schriftarten, Stilen und Zeichensätzen ermöglichen.
Sollte sowohl Breite als auch Höhe handhaben
Keine Kürzung, es sei denn, Text kann aufgrund der von uns angegebenen Einschränkung nicht passen (Beispiel: zu langer Text, zu kleine verfügbare Größe). Wir können jedoch eine horizontale / vertikale Bildlaufleiste anfordern, wenn wir dies wünschen, nur für diese Fälle.
Sollte mehrzeilig oder einzeilig sein. Lassen Sie bei Mehrzeiligkeit die Zeilen max und min zu.
Sollte nicht langsam in der Berechnung sein. Verwenden Sie eine Schleife, um die beste Größe zu finden? Optimieren Sie es zumindest und erhöhen Sie Ihre Stichprobe nicht jedes Mal um 1.
Bei mehrzeiligen Zeilen sollten Sie die Größe ändern oder mehr Zeilen verwenden und / oder die Zeilen selbst auswählen können, indem Sie das Zeichen "\ n" verwenden.
Was ich versucht habe
Ich habe so viele Beispiele ausprobiert (einschließlich der Links, über die ich geschrieben habe), und ich habe auch versucht, sie zu ändern, um die Fälle zu behandeln, über die ich gesprochen habe, aber keines funktioniert wirklich.
Ich habe ein Beispielprojekt erstellt, mit dem ich visuell sehen kann, ob die TextView automatisch richtig passt.
Derzeit randomisiert mein Beispielprojekt nur den Text (das englische Alphabet plus Ziffern) und die Größe der Textansicht nach dem Zufallsprinzip und lässt sie in einer Zeile bleiben, aber selbst dies funktioniert bei keinem der Beispiele, die ich ausprobiert habe, gut.
Hier ist der Code (auch hier verfügbar ):
Datei res/layout/activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" tools:context=".MainActivity">
<Button android:id="@+id/button1" android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true" android:text="Button" />
<FrameLayout android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_above="@+id/button1"
android:layout_alignParentLeft="true" android:background="#ffff0000"
android:layout_alignParentRight="true" android:id="@+id/container"
android:layout_alignParentTop="true" />
</RelativeLayout>
Datei src/.../MainActivity.java
public class MainActivity extends Activity
{
private final Random _random =new Random();
private static final String ALLOWED_CHARACTERS ="qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890";
@Override
protected void onCreate(final Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ViewGroup container=(ViewGroup)findViewById(R.id.container);
findViewById(R.id.button1).setOnClickListener(new OnClickListener()
{
@Override
public void onClick(final View v)
{
container.removeAllViews();
final int maxWidth=container.getWidth();
final int maxHeight=container.getHeight();
final FontFitTextView fontFitTextView=new FontFitTextView(MainActivity.this);
final int width=_random.nextInt(maxWidth)+1;
final int height=_random.nextInt(maxHeight)+1;
fontFitTextView.setLayoutParams(new LayoutParams(width,height));
fontFitTextView.setSingleLine();
fontFitTextView.setBackgroundColor(0xff00ff00);
final String text=getRandomText();
fontFitTextView.setText(text);
container.addView(fontFitTextView);
Log.d("DEBUG","width:"+width+" height:"+height+" text:"+text);
}
});
}
private String getRandomText()
{
final int textLength=_random.nextInt(20)+1;
final StringBuilder builder=new StringBuilder();
for(int i=0;i<textLength;++i)
builder.append(ALLOWED_CHARACTERS.charAt(_random.nextInt(ALLOWED_CHARACTERS.length())));
return builder.toString();
}
}
Die Frage
Kennt jemand eine Lösung für dieses häufig auftretende Problem, die tatsächlich funktioniert?
Sogar eine Lösung, die viel weniger Funktionen hat als das, worüber ich geschrieben habe, zum Beispiel eine, die nur eine konstante Anzahl von Textzeilen hat und ihre Schriftart entsprechend ihrer Größe anpasst, aber niemals seltsame Störungen aufweist und den Text auch bekommt groß / klein im Vergleich zu seinem verfügbaren Platz.
GitHub-Projekt
Da dies ein so wichtiger ist Textview, habe ich beschlossen , eine Bibliothek zu veröffentlichen, so dass jeder sie leicht nutzen könnten, und dazu beitragen, hier .