PixelRatio
Ta strona została przetłumaczona przez PageTurner AI (beta). Nie jest oficjalnie zatwierdzona przez projekt. Znalazłeś błąd? Zgłoś problem →
PixelRatio zapewnia dostęp do gęstości pikseli urządzenia i skali czcionek.
Pobieranie obrazu o prawidłowym rozmiarze
Na urządzeniu o wysokiej gęstości pikseli należy użyć obrazu o wyższej rozdzielczości. Dobrą zasadą jest pomnożenie rozmiaru wyświetlanego obrazu przez współczynnik pikseli.
const image = getImage({
width: PixelRatio.getPixelSizeForLayoutSize(200),
height: PixelRatio.getPixelSizeForLayoutSize(100),
});
<Image source={image} style={{width: 200, height: 100}} />;
Przyciąganie do siatki pikseli
W systemie iOS można precyzyjnie określać pozycje i wymiary elementów, np. 29.674825. Jednak fizyczny wyświetlacz ma stałą liczbę pikseli, np. 640×1136 dla iPhone'a SE (1. generacja) czy 828×1792 dla iPhone'a 11. iOS stara się jak najwierniej oddać wartości użytkownika, rozkładając jeden oryginalny piksel na wiele mniejszych. Wadą tej techniki jest rozmyty wygląd wynikowego elementu.
W praktyce odkryliśmy, że programiści nie chcą tej funkcji i muszą ją omijać, ręcznie zaokrąglając wartości, aby uniknąć rozmytych elementów. W React Native automatycznie zaokrąglamy wszystkie piksele.
Należy uważać na moment tego zaokrąglania. Nigdy nie należy jednocześnie używać wartości zaokrąglonych i niezaokrąglonych, ponieważ prowadzi to do kumulowania błędów zaokrąglania. Nawet jeden błąd może być krytyczny - jednopikselowa obramówka może zniknąć lub stać się dwukrotnie szersza.
W React Native wszystko w JavaScripcie i silniku układu działa na liczbach o dowolnej precyzji. Zaokrąglanie następuje dopiero przy ustawianiu pozycji i wymiarów natywnego elementu w głównym wątku. Zaokrąglanie odbywa się też względem korzenia, a nie rodzica, aby uniknąć kumulowania błędów.
Przykład
Dokumentacja
Metody
get()
static get(): number;
Zwraca gęstość pikseli urządzenia. Przykłady:
-
PixelRatio.get() === 1 -
PixelRatio.get() === 1.5 -
PixelRatio.get() === 2- iPhone SE, 6S, 7, 8
- iPhone XR
- iPhone 11
- Urządzenia Android xhdpi
-
PixelRatio.get() === 3- iPhone 6S Plus, 7 Plus, 8 Plus
- iPhone X, XS, XS Max
- iPhone 11 Pro, 11 Pro Max
- Pixel, Pixel 2
- Urządzenia Android xxhdpi
-
PixelRatio.get() === 3.5- Nexus 6
- Pixel XL, Pixel 2 XL
- Urządzenia Android xxxhdpi
getFontScale()
static getFontScale(): number;
Zwraca współczynnik skalowania rozmiarów czcionek. Jest to stosunek używany do obliczania bezwzględnego rozmiaru czcionki, więc wszystkie elementy silnie zależne od tego powinny go wykorzystywać w obliczeniach.
-
w Androidzie wartość odzwierciedla preferencje użytkownika w Ustawienia > Ekran > Rozmiar czcionki
-
w iOS wartość odzwierciedla preferencje w Ustawienia > Ekran i jasność > Rozmiar tekstu, można ją też zmienić w Ustawienia > Ułatwienia dostępu > Wyświetlacz i rozmiar tekstu > Większy tekst
Jeśli skala czcionki nie jest ustawiona, zwracana jest gęstość pikseli urządzenia.
getPixelSizeForLayoutSize()
static getPixelSizeForLayoutSize(layoutSize: number): number;
Konwertuje rozmiar układu (dp) na rozmiar w pikselach (px).
Gwarantuje zwrócenie liczby całkowitej.
roundToNearestPixel()
static roundToNearestPixel(layoutSize: number): number;
Zaokrągla rozmiar w jednostkach układu (dp) do najbliższej wartości odpowiadającej całkowitej liczbie pikseli. Na przykład na urządzeniu z PixelRatio równym 3, PixelRatio.roundToNearestPixel(8.4) = 8.33, co odpowiada dokładnie (8.33 * 3) = 25 pikselom.