Czy w Androidzie jest jakiś sposób, aby dostosować rozmiar tekstu w widoku tekstu, aby pasował do zajmowanej przestrzeni?
Np. Używam a TableLayout
i dodaję kilka TextView
s do każdego wiersza. Ponieważ nie chcę, aby TextView
s zawijały tekst, raczej widzę, że zmniejsza rozmiar czcionki zawartości.
Jakieś pomysły?
Próbowałem measureText
, ale ponieważ nie znam wielkości kolumny, korzystanie z niej wydaje się kłopotliwe. To jest kod, w którym chcę zmienić rozmiar czcionki na coś, co pasuje
TableRow row = new TableRow(this);
for (int i=0; i < ColumnNames.length; i++) {
TextView textColumn = new TextView(this);
textColumn.setText(ColumnNames[i]);
textColumn.setPadding(0, 0, 1, 0);
textColumn.setTextColor(getResources().getColor(R.drawable.text_default));
row.addView(textColumn, new TableRow.LayoutParams());
}
table.addView(row, new TableLayout.LayoutParams());
Odpowiedzi:
Poniższe rozwiązanie zawiera wszystkie sugestie tutaj. Zaczyna się od tego, co pierwotnie opublikował Dunni. Korzysta z wyszukiwania binarnego, takiego jak gjpc, ale jest nieco bardziej czytelny. Zawiera również poprawki błędów gregm i własne poprawki błędów.
źródło
<com.example.zengame1.FontFitTextView android:paddingTop="5dip" android:id="@+id/childs_name" android:layout_width="fill_parent" android:layout_height="0dip" android:layout_weight="1" android:layout_gravity="center" android:textSize="@dimen/text_size"/>
float hi = this.getHeight() - this.getPaddingBottom() - this.getPaddingTop();
Napisałem klasę, która rozszerza TextView i robi to. Po prostu używa MeasureText, jak sugerujesz. Zasadniczo ma maksymalny rozmiar tekstu i minimalny rozmiar tekstu (który można zmienić) i po prostu przegląda rozmiary między nimi w odstępach 1, aż znajdzie największy, który będzie pasował. Niezbyt elegancki, ale nie znam innego sposobu.
Oto kod:
źródło
Jest to płaszczyzna prędkości
FontFitTextView
, ale zmniejsza rozmiar czcionki tylko w razie potrzeby, aby dopasować tekst, a poza tym zachowuje rozmiar czcionki. Nie zwiększa rozmiaru czcionki do wysokości.Oto przykład, jak można go użyć w XML:
Spowodowałoby to utrzymanie rozmiaru czcionki do 60sp, o ile tekst mieści się w szerokości. Jeśli tekst jest dłuższy, zmniejszy rozmiar czcionki. W takim przypadku
TextView
wysokość s również ulegnie zmianie z powoduheight=wrap_content
.Jeśli znajdziesz jakieś błędy, możesz je edytować.
źródło
this.setMeasuredDimension(parentWidth, height);
match_parent
iwrap_content
.text.isEmpty()
byłoby"".equals(text)
.Oto moje rozwiązanie, które działa na emulatorze i telefonach, ale niezbyt dobrze na edytorze układu Eclipse. Jest inspirowany kodem kilaki, ale rozmiar tekstu nie jest uzyskiwany z Paint, ale z pomiaru samego wywołania TextView
measure(0, 0)
.Klasa Java:
Plik atrybutów XML:
Sprawdź mój github, aby uzyskać najnowszą wersję tej klasy. Mam nadzieję, że może się przydać komuś. Jeśli błąd zostanie znaleziony lub kod wymaga wyjaśnienia, możesz otworzyć problem w Github.
źródło
Bardzo dziękuję https://stackoverflow.com/users/234270/speedplane . Świetna odpowiedź!
Oto ulepszona wersja jego odpowiedzi, która również dba o wysokość i zawiera atrybut maxFontSize, aby ograniczyć rozmiar czcionki (był przydatny w moim przypadku, więc chciałem go udostępnić):
Odpowiedni plik /res/values/attr.xml:
Przykład:
Aby użyć nowego
maxFontSize
atrybutu, nie zapomnij dodaćxmlns:res-auto="http://schemas.android.com/apk/res-auto"
jako pokazu w przykładzie.źródło
Miałem ten sam problem i napisałem zajęcia, które wydają się dla mnie skuteczne. Zasadniczo użyłem układu statycznego, aby narysować tekst na osobnym obszarze roboczym i dokonać ponownej oceny, aż znajdę odpowiedni rozmiar czcionki. Możesz zobaczyć zajęcia opublikowane w poniższym temacie. Mam nadzieję, że to pomoże.
Automatyczne skalowanie tekstu Wyświetlanie tekstu w celu dopasowania w granicach
źródło
Możesz to teraz zrobić bez biblioteki lub widżetu innej firmy. Jest wbudowany w TextView na poziomie API 26. Dodaj
android:autoSizeTextType="uniform"
do swojegoTextView
i ustaw wysokość. To wszystko.https://developer.android.com/guide/topics/ui/look-and-feel/autosizing-textview.html
Możesz także użyć
TextViewCompat
do kompatybilności.źródło
Nieznaczna modyfikacja onMeasure:
I wyszukiwanie binarne w refitText:
źródło
trySize *= availableWidth / measured_width
(następnie zaciśnięte na minTextSize).Znalazłem następujące, które działają dla mnie ładnie. Nie zapętla się i uwzględnia zarówno wysokość, jak i szerokość. Zauważ, że ważne jest, aby określić jednostkę PX podczas wywoływania setTextSize w widoku. Dzięki wskazówkom w poprzednim poście do tego!
Oto procedura, której używam, przekazując getPaint () z widoku. 10-znakowy ciąg znaków z „szerokim” znakiem służy do oszacowania szerokości niezależnie od rzeczywistego ciągu.
źródło
Działa z modyfikacjami
Musisz ustawić taki rozmiar widoku tekstu, ponieważ inaczej setTextSize zakłada, że wartość jest w jednostkach SP:
I musiałeś jawnie dodać ten kod.
źródło
Służy
app:autoSizeTextType="uniform"
do kompatybilności wstecznej, ponieważandroid:autoSizeTextType="uniform"
działa tylko na poziomie API 26 i wyższym.źródło
Użyłem powyższej odmiany rozwiązania Dunni, ale ten konkretny kod nie działał dla mnie. W szczególności, gdy próbujesz użyć zestawu obiektów Paint, aby mieć cechy obiektu Paint widoku, a następnie wywołujemy pomiarText (), nie zwraca tej samej wartości, co bezpośrednie wywoływanie obiektu Paint widoku. Być może istnieją pewne różnice w sposobie konfiguracji moich poglądów, które sprawiają, że zachowanie się różni.
Moim rozwiązaniem było bezpośrednie użycie Paint w widoku, nawet jeśli mogą wystąpić pewne ograniczenia wydajności przy wielokrotnym zmienianiu rozmiaru czcionki dla widoku.
źródło
Pracowałem nad ulepszeniem doskonałego rozwiązania z Speedplane i wymyśliłem to. Zarządza wysokością, w tym ustawia margines w taki sposób, aby tekst był poprawnie wyśrodkowany pionowo.
Używa tej samej funkcji do uzyskania szerokości, ponieważ wydaje się, że działa najlepiej, ale używa innej funkcji do uzyskania wysokości, ponieważ wysokość nigdzie nie jest podana. Jest kilka korekt, które należy wprowadzić, ale wymyśliłem sposób na zrobienie tego, wyglądając przyjemnie dla oka.
źródło
Google już wprowadził tę funkcję.
https://developer.android.com/guide/topics/ui/look-and-feel/autosizing-textview.html
źródło
Tak długo cierpiałem w moich projektach, dopóki nie znalazłem tej biblioteki:
Musisz tylko dodać xml według swoich potrzeb i gotowe. Na przykład:
źródło
Zainspirowany poprzednimi plakatami chciałem podzielić się moim rozwiązaniem. Działa ze współczynnikiem skali, który jest stosowany do poprzedniego rozmiaru czcionki, aby dopasować ją do dostępnej przestrzeni. Oprócz zapobiegania nieoczekiwanemu zachowaniu metody TextViews onDraw, po prostu rysuje tekst samodzielnie.
źródło
źródło
To powinno być proste rozwiązanie:
źródło
Rozszerz TextView i zastąp overDraw za pomocą poniższego kodu. Zachowa proporcje tekstu, ale dostosuje rozmiar, aby wypełnić przestrzeń. W razie potrzeby możesz łatwo zmodyfikować kod, aby go rozciągał.
źródło
Napisałem krótką klasę pomocnika, która dopasowuje widok tekstu do określonej szerokości i dodaje na końcu elipsę „...”, jeśli nie można osiągnąć minimalnej wielkości tekstu.
Pamiętaj, że zmniejsza tylko tekst, dopóki nie będzie pasował lub nie zostanie osiągnięty minimalny rozmiar tekstu. Aby przeprowadzić test z dużymi rozmiarami, przed wywołaniem metody pomocy ustaw rozmiar tekstu na dużą liczbę.
Zajmuje piksele, więc jeśli używasz wartości z dimen, możesz to nazwać tak:
Z tej klasy korzystam:
źródło
Jeśli ustawiona jest transformacja taka jak allCaps, podejście Speedplane jest błędne. Naprawiłem go, powodując następujący kod (przepraszam, moja reputacja nie pozwala mi dodać tego jako komentarza do rozwiązania speedplane):
źródło
Nie wiem, czy to jest poprawny sposób, czy też nie działa ... weź swój widok i sprawdź OnGlobalLayoutListener () i uzyskaj wartość linii tekstowej viewview, a następnie ustaw textSize.
Jest to bardzo prosty kod linii.
źródło