Rozmiar i położenie w android view – DSP#12

System związany z wymiarami oraz położeniem jest w Androidzie nieco skomplikowany. Z racji tego, że na telefon możemy patrzeć zarówno w pionie jak i poziomie, biblioteki i aplikacje muszą się przebudowywać pod konkretne położenie telefonu. Dodatkowo każde urządzenie posiada inny rozmiar, w związku z tym stosowaniem pikseli mija się z celem. Jednostki te zostały zastąpione przez dp dla grafiki, oraz sp dla tekstów.

Rozmiar w klasie View

Aby poznać rozmiar obszaru który możemy wykorzystać korzysta się z metody onSizeChanged(). Jest ona wywoływana za każdym razem kiedy widok jest tworzony, oraz kiedy jest przebudowywany, np z powodu zmiany orientacji. Przyjmuje 4 parametry: xNew, yNew, xOld, yOld. Nietrudno się domyślić co one tak właściwie znaczą, ale dla porządku, te z przedrostkiem new oznaczają aktualny, nowy rozmiar widoku. Z kolei te z dopiskiem old stare rozmiary.

Margin a padding

Różnice pomiędzy tymi dwoma są takie same jak w CSS, tzn margin oznacza po prostu odsunięcie się od danego obiektu. Z kolei padding odstęp zawartości od granicy naszego obiektu. W swojej implementacji traktuję je tak samo, tzn padding będzie również odsuwał ramkę, oraz tło.

Implementacja

Dzisiejsza implementacja prezentuje się następująco:

Tworzę sobie cztery zmienne zawierające odpowiednio wysokość, szerokość, punkt startowy w poziomie, oraz w pionie. Następnie w metodzie onSizeChanged() przypisuję te wartośći, ustawiając je odpowiednio w zależności od wartości paddingów. Jak widać w metodzie onDraw() rysujemy już korzystając z nowych wartości. A tak prezentują się efekty naszej pracy w pionie:

A tak w poziomie:

Wszystko to zostało obsłużone przez taki kodzik znajdujący się w demie:

Przeliczanie dp i px

Na koniec chciałem jeszcze wrócić na chwilę do początku i jednostek dp oraz px. Istnieje ogólny wzór przeliczania tego, korzystając z tej tabelki:

  • 0.75 on ldpi (120 dpi)
  • 1.0 on mdpi (160 dpi; baseline)
  • 1.5 on hdpi (240 dpi)
  • 2.0 on xhdpi (320 dpi)
  • 3.0 on xxhdpi (480 dpi)
  • 4.0 on xxxhdpi (640 dpi)

A następnie w zależności od tego, czy potrzebujemy pikseli, czy dp:

  • px = dp * (dpi / 160)
  • dp = px / (dpi / 160)

Na szczęście nie musimy tego robić 🙂 zajmują się tym maszyny, ale dobrze mieć świadomość, jaki rozmiar powinien mieć obrazek, aby dobrze wyświetlał się na konkretnym ekranie. Tego typu informacje znajdują się też np na tej stronie.

To tyle jeśli chodzi o rozmiary, w przyszłości pewnie będziemy co nieco więcej przeliczać, chcąc np aby aby pasek do góry kalendarza miał prawidłowy rozmiar, albo, żeby tło wyświetlało się do odpowiedniego miejsca. Wszystkie zmiany znajdują się na githubie oznaczone komentarzem ‚size’.