Próbuję wyświetlić tekst przy użyciu poniższego kodu. Problem polega na tym, że tekst nie jest wyśrodkowany poziomo. Kiedy ustawiam współrzędne drawText
, ustawia dolną część tekstu w tej pozycji. Chciałbym, aby tekst został narysowany tak, aby był wyśrodkowany również poziomo.
To zdjęcie pokazuje mój problem dalej:
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
//canvas.drawRGB(2, 2, 200);
Paint textPaint = new Paint();
textPaint.setARGB(200, 254, 0, 0);
textPaint.setTextAlign(Align.CENTER);
textPaint.setTypeface(font);
textPaint.setTextSize(300);
canvas.drawText("Hello", canvas.getWidth()/2, canvas.getHeight()/2 , textPaint);
}
java
android
android-activity
android-canvas
drawtext
Sebastian
źródło
źródło
Odpowiedzi:
Spróbuj wykonać następujące czynności:
źródło
float halfLength = text.length() / 2f;
Nazywa się to promocją typu .Paint.descent()
iPaint.ascent()
) z podejściem do wyśrodkowania tekstuPaint.getTextBounds()
w mojej odpowiedzi poniżej.Paint.descent()
iPaint.ascent()
nie uwzględniają faktycznego tekstu. (Możesz rozpoznać tę niedokładność na zrzucie ekranu w moim poście poniżej.) Dlatego odradzam takie podejście. Podejście zPaint.getTextBounds()
wydaje się działać dokładniej.Wyśrodkuj za pomocą Paint.getTextBounds () :
Paint.Align.CENTER nie oznacza, że punkt odniesienia tekstu jest wyśrodkowany pionowo. Punkt odniesienia zawsze znajduje się na linii podstawowej. Dlaczego więc nie użyć Paint.Align.LEFT ? W każdym razie musisz obliczyć punkt odniesienia.
Paint.descent () ma tę wadę, że nie uwzględnia prawdziwego tekstu. Paint.descent () pobiera tę samą wartość, niezależnie od tego, czy tekst zawiera litery ze zjazdami, czy nie. Dlatego zamiast tego używam r.bottom .
Miałem pewne problemy z Canvas.getHeight (), jeśli API <16. Dlatego zamiast tego używam Canvas.getClipBounds (Rect) . (Nie używaj Canvas.getClipBounds (). GetHeight (), ponieważ alokuje pamięć dla Rect .)
Ze względu na wydajność powinieneś przydzielić obiekty, zanim zostaną one użyte w onDraw () . Ponieważ drawCenter () będzie wywoływany w ramach funkcji onDraw (), obiekt Rect r jest tutaj wstępnie przydzielany jako pole.
Próbowałem umieścić kod dwóch najlepszych odpowiedzi we własnym kodzie (sierpień 2015 r.) I zrobiłem zrzut ekranu, aby porównać wyniki:
Tekst powinien być wyśrodkowany w czerwonym wypełnionym prostokącie. Mój kod tworzy biały tekst, a pozostałe dwa kody tworzą łącznie szary tekst (w rzeczywistości są takie same, nakładają się). Szary tekst jest trochę za niski, a dwa po prawej stronie.
Oto jak wykonałem test:
źródło
Wyrównanie w pionie jest trudne, ponieważ zdarzyło się zejście i wznoszenie tekstu, wielu facetów używało Paint.getTextBounds () do pobierania TextWidth i TextHeight, ale nie powoduje to, że tekst jest wyśrodkowany. Tutaj możemy użyć Paint.measureText () do obliczenia TextWidth, TextHeight po prostu wykonujemy odejmowanie wraz z opadaniem i wznoszeniem, wtedy otrzymaliśmy najbardziej zbliżone podejście TextSize, następująca praca jest dla siebie dość łatwa.
Nawiasem mówiąc, zdecydowanie zalecamy używanie RectF zamiast Rect, ponieważ pozycje wymagają dokładniejszych wartości, z mojego doświadczenia wynika, że RectF wykonał odchylenie górne i dolne tylko jeden piksel na urządzeniu xhdpi, Rect będzie jeszcze dwa.
źródło
Twój kod rysuje środek linii bazowej tekstu w środku widoku. Aby wyśrodkować tekst w pewnym momencie, X, Y, trzeba obliczyć środek tekstu i umieścić że w punkcie.
Ta metoda narysuje tekst wyśrodkowany w punkcie x, y. Jeśli przejdziesz przez środek widoku, narysuje tekst na środku.
źródło
android.graphics.Paint
jest używany do narysowania tekstuUważam, że najlepsze rozwiązanie do centrowania tekstu jest następujące:
źródło
działa dla mnie do użycia: textPaint.textAlign = Paint.Align.CENTER z textPaint.getTextBounds
wynikiem jest:
źródło
Tworzę metodę, aby uprościć to:
rectF to obszar, w którym chcesz narysować tekst, to wszystko. Detale
źródło
Jeśli korzystamy z układu statycznego
Layout.Alignment.ALIGN_CENTER to załatwi sprawę . Układ statyczny ma również wiele innych zalet.
Odniesienie: Dokumentacja Androida
źródło
To działało dla mnie:
jeśli ktoś znajdzie jakiś problem, proszę o informację
źródło
W moim przypadku nie musiałem umieszczać tekstu na środku płótna, ale w obracającym się kole. Chociaż musiałem użyć tego kodu, aby odnieść sukces:
Następnie wywołuję tę metodę z klasy View:
źródło