21

Szukam metody w Androidzie, która zajmie dane wejściowe (tekst, text_font_size, device_width) i na podstawie tych obliczeń zwróci wartość wysokości wymaganą do wyświetlenia określonego tekstu?Jak zmierzyć wysokość TextView w oparciu o szerokość urządzenia i rozmiar czcionki?

Ustawiam środowisko wykonawcze do widoku tekstu/podglądu strony w oparciu o jego zawartość, jestem świadomy treści przekłamań, ale nie mogę jej użyć w moim przypadku z powodu pewnego problemu dotyczącego minimalnej wysokości widoku strony.

Próbuję obliczyć wysokość i na tej podstawie ustawiam wysokość widoku.

Próbowałem z następujących sposobów

Paint paint = new Paint(); 
paint.setTextSize(text.length()); 
Rect bounds = new Rect(); 
paint.getTextBounds(text, 0, 1, bounds); 
mTextViewHeight= bounds.height(); 

So wyjściem jest

1) "Hello World" zwraca wysokość 13 dla czcionki 15

2) „Najnowsza wersja Jelly Bean jest tutaj, z optymalizacją wydajności "zwraca wysokość 16 dla czcionki 15

Następnie próbowałem z

Paint paint = new Paint(); 
paint.setTextSize(15); 
paint.setTypeface(Typeface.SANS_SERIF); 
paint.setColor(Color.BLACK); 

Rect bounds = new Rect(); 
paint.getTextBounds(text, 0, text.length(), result); 

Paint.FontMetrics metrics = brush.getFontMetrics(); 
int totalHeight = (int) (metrics.descent - metrics.ascent + metrics.leading); 

więc wyjście jest

1) "Hello World" zwraca wysokość 17 dla czcionki 15

2) "W najnowszej wersji Jelly Bean jest tutaj, z optymalizacji wydajności" zwraca wysokość 17 dla czcionki 15

jeśli ustawię te wartości w moim widoku, a następnie wycinam jakiś tekst, który nie pokazuje całej zawartości.

Znowu wygląda to dobrze na niektórych stołach, ponieważ ma dużą szerokość, ale nie na telefonie.

Czy istnieje sposób obliczenia wysokości na podstawie zawartości?

Odpowiedz

44
public static int getHeight(Context context, String text, int textSize, int deviceWidth) { 
    TextView textView = new TextView(context); 
    textView.setText(text); 
    textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize); 
    int widthMeasureSpec = MeasureSpec.makeMeasureSpec(deviceWidth, MeasureSpec.AT_MOST); 
    int heightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); 
    textView.measure(widthMeasureSpec, heightMeasureSpec); 
    return textView.getMeasuredHeight(); 
} 

Jeśli textSize nie jest podana w pikselach, zmienić pierwszy paramter z setTextSize().

+0

Niesamowita odpowiedź. – Noundla

+0

co to jest rozmiar tekstu? –

7

Paint.getTextBounds() zwraca nie to, czego można się spodziewać. Szczegóły to here.

Zamiast tego, można spróbować w ten sposób:

int mMeasuredHeight = (new StaticLayout(mMeasuredText, mPaint, targetWidth, Alignment.ALIGN_NORMAL, 1.0f, 0.0f, true)).getHeight(); 
+0

Dzięki. To powinno zostać użyte do ponownego utworzenia macierzystej wysokości TextView podczas rysowania tekstu. –

+0

Co powiesz na niestandardową czcionkę? –

5

mam łatwiejszy sposób na poznanie prawdziwego wysokość linii przed być malowane, ja nie wiem, czy to pomoże Ci faceci, ale moje rozwiązanie, aby uzyskać wysokość linii jest to niezależne od wysokości układu, tylko podjąć parametrów czcionki tak:

myTextView.getPaint().getFontMetrics().bottom - myTextView.getPaint().getFontMetrics().top) 

z tym mamy realną wysokość, że czcionki zajmie od TextView być namalowany. To nie daje int, ale możesz zrobić Math.round, aby uzyskać zbliżoną wartość.