Android: Canvas.DrawText () rozmiar tekstu w różnych rozdzielczościach ekranu

Do mojej gry na Androida mam kilka połączeń do Canvas.drawText().

Do testowania używam standardowego rozmiaru czcionki, który wydaje się działać dobrze.

Jednak, gdy podniosę rozdzielczość do większej gęstości, większe obrazy są automatycznie ładowane, ale tekst jest teraz niewiarygodnie mały.

Czy jest łatwy sposób na obliczenie, w jakim rozmiarze powinien być narysowany tekst, czy jestem zobowiązany zrobić to ręcznie?

Edit: jaki był cel edytowania mojego posta @ Suragch ?

Author: Community, 2011-03-20

4 answers

Najprostszym sposobem jest zdefiniowanie rozmiarów czcionek w swoich Zasobach za pomocą jednostek pikseli niezależnych od skali (sp) -- Ta jednostka jest jak piksele niezależne od gęstości (dp lub dip), ponieważ bierze pod uwagę gęstość ekranu, ale bierze również pod uwagę ustawienie rozmiaru czcionki użytkownika.

Aby dodać nowy wymiar, Utwórz plik dimens.xml w folderze res/values i wprowadź następujący kod, aby dodać nowy wymiar o nazwie myFontSize:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="myFontSize">20sp</dimen>
</resources>

Możesz wtedy uzyskać rozmiar tekstu w aplikacji za pomocą

int scaledSize = getResources().getDimensionPixelSize(R.dimen.myFontSize);

Uzyskany Rozmiar zostanie poprawnie przeskalowany, aby uwzględnić bieżącą gęstość ekranu i ustawienia rozmiaru czcionki.

Aby uzyskać więcej informacji, zobacz Android Developers page on More Resources.

 83
Author: Joseph Earl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-22 11:32:01

Możesz to zrobić samodzielnie za pomocą prostej operacji matematycznej:

Musisz obliczyć relację, która rysuje tekst o tym samym rozmiarze dla dowolnego rozmiaru płótna, więc użyj rzeczywistego rozmiaru płótna, tak:

double relation = Math.sqrt(canvas.getWidth() * canvas.getHeight());

Ale ta liczba jest po prostu zbyt duża, więc podziel ją przez jedną, która odpowiada twoim potrzebom, powiedzmy 250:

relation = relation / 250;

Teraz możesz ustawić rozmiar tekstu w następujący sposób:

paint.setTextSize((float) (myFontSize * relation));

Nie musisz koniecznie dzielić relacji przez dowolną liczbę, ale w takim przypadku będziesz musiał użyć bardzo małe rozmiary czcionek dla zmiennej myFontSize. Dla mnie 250 działa dobrze, aby używać zwykłych rozmiarów czcionek, które dostosują się do dowolnego rozmiaru ekranu, ponieważ już bierzesz wymiar pikseli z obszaru roboczego.

 5
Author: Camilo Ortegón,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-10 21:58:49

Najprostszym sposobem jest zdefiniowanie rozmiaru czcionki w katalogu zasobów za pomocą jednostek scale-independent pixel (sp) lub density-independent pixel (dp). Następnie pobierz rozmiar tekstu za pomocą

int scaledSize = getResources().getDimensionPixelSize(R.dimen.font_size);
mTextView.setTextSize(scaledSize);

Rozmiar tekstu zostanie odpowiednio skalowany zgodnie z aktualną gęstością/rozdzielczością ekranu i ustawieniem rozmiaru czcionki użytkownika.

Jak zdefiniować rozmiar czcionki w katalogu zasobów?

Utwórz plik o nazwie dimens.xml w folderze res->values. Następnie skopiuj poniższy kod.

<resources>
    <dimen name="font_size">25sp</dimen>   // sp or dp accordingly
</resources>

Atrybut name tag <dimen> będzie używany jako identyfikator zasobu.

 4
Author: Trung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-11 06:55:32

Podczas wywoływania Canvas.drawText() rozmiar tekstu jest najpierw określany przez obiekt Paint, który można ustawić za pomocą Paint.setTextSize(). Rozmiar tekstu jest automatycznie skalowany przez Canvas na podstawie gęstości obszaru roboczego, którą można znaleźć za pomocą Canvas.getDensity().

Podczas ustawiania rozmiaru tekstu na obiekcie paint, który będzie rysowany na płótnie, pracuj z wartością jednostkową dp lub sp i pozwól Canvas zająć się skalowaniem.

 2
Author: Tanner Perrien,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-11 20:26:59