Wprowadź gesty szczypania, aby obsługiwać skalowalną zawartość w aplikacji. Jest to standardowa, spójna na różnych platformach metoda poprawy dostępności, która pozwala użytkownikom intuicyjnie dostosowywać rozmiar tekstu i elementów interfejsu do swoich potrzeb. Aplikacja może definiować niestandardowe zachowanie skalowania z dokładną kontrolą i kontekstowym zachowaniem, które zapewnia użytkownikom lepsze wrażenia niż funkcja systemowa, taka jak powiększenie ekranu.
Wybierz strategię skalowania
Strategie opisane w tym przewodniku powodują, że interfejs użytkownika zmienia układ i organizację, aby dopasować się do szerokości ekranu. Zapewnia to znaczną poprawę dostępności, ponieważ eliminuje konieczność przewijania w poziomie i frustrujący ruch „zygzakowaty”, który w przeciwnym razie byłby wymagany do odczytania długich wierszy tekstu.
Dodatkowe informacje: badania potwierdzają, że w przypadku użytkowników niedowidzących przepływ treści jest znacznie bardziej czytelny i łatwiejszy w nawigacji niż interfejsy wymagające dwuwymiarowego przesuwania. Więcej informacji znajdziesz w artykule Porównanie treści w formacie pan-and-scan i reflowable na urządzeniach mobilnych.
Skalowanie wszystkich elementów lub tylko elementów tekstowych
Poniższa tabela pokazuje efekt wizualny każdej strategii skalowania.
| Strategia | Skalowanie gęstości | Skalowanie czcionek |
|---|---|---|
Zachowanie |
Skaluje wszystko proporcjonalnie. Treść jest dopasowywana do kontenera, więc użytkownik nie musi przesuwać jej w poziomie, aby zobaczyć całość. |
Dotyczy tylko elementów tekstowych. Ogólny układ i elementy inne niż tekst pozostają w tym samym rozmiarze. |
Wagi |
Wszystkie elementy wizualne: tekst, komponenty (przyciski, ikony), obrazy i odstępy w układzie (dopełnienie, marginesy). |
Tylko tekst |
Demonstracja |
Rekomendacje
Teraz, gdy znasz już różnice wizualne, w tabeli poniżej możesz porównać zalety i wady poszczególnych strategii i wybrać najlepszą dla swoich treści.
Typ interfejsu |
Zalecana strategia |
Uzasadnienie |
Układy z dużą ilością tekstu Przykłady: artykuły prasowe, aplikacje do obsługi wiadomości |
Gęstość lub skalowanie czcionki |
Skalowanie gęstości jest preferowane w przypadku skalowania całego obszaru treści, w tym obrazów w tekście. Skalowanie czcionek to prosta alternatywa, jeśli trzeba skalować tylko tekst. |
Układy o strukturze wizualnej Przykłady: sklepy z aplikacjami, kanały mediów społecznościowych |
Skalowanie gęstości |
Zachowuje wizualne relacje między obrazami i tekstem w karuzelach lub siatkach. Dzięki temu, że treść jest dopasowywana do rozmiaru ekranu, nie trzeba przesuwać jej w poziomie, co mogłoby kolidować z elementami przewijanymi zagnieżdżonymi. |
Wykrywanie gestów skalowania w Jetpack Compose
Aby obsługiwać treści, które można skalować przez użytkownika, musisz najpierw wykrywać gesty wielodotykowe. W Jetpack Compose możesz to zrobić za pomocą funkcji Modifier.transformable.
Modyfikator transformable to interfejs API wysokiego poziomu, który podaje zoomChange
wartość delta od ostatniego zdarzenia związanego z gestem. Upraszcza to logikę aktualizacji stanu do bezpośredniego gromadzenia (np. scale *= zoomChange), dzięki czemu idealnie nadaje się do strategii skalowania adaptacyjnego opisanych w tym przewodniku.
Przykładowe implementacje
Poniższe przykłady pokazują, jak wdrożyć strategie skalowania gęstości i skalowania czcionek.
Skalowanie gęstości
W tym podejściu skalowana jest podstawa density obszaru interfejsu. W rezultacie wszystkie pomiary oparte na układzie, w tym dopełnienie, odstępy i rozmiary komponentów, są skalowane tak, jakby zmienił się rozmiar lub rozdzielczość ekranu. Rozmiar tekstu zależy też od gęstości, więc również jest skalowany proporcjonalnie. Ta strategia jest skuteczna, gdy chcesz równomiernie powiększyć wszystkie elementy w określonym obszarze, zachowując ogólny rytm wizualny i proporcje interfejsu.
private class DensityScalingState( // Note: For accessibility, typical min/max values are ~0.75x and ~3.5x. private val minScale: Float = 0.75f, private val maxScale: Float = 3.5f, private val currentDensity: Density ) { val transformableState = TransformableState { zoomChange, _, _ -> scaleFactor.floatValue = (scaleFactor.floatValue * zoomChange).coerceIn(minScale, maxScale) } val scaleFactor = mutableFloatStateOf(1f) fun scaledDensity(): Density { return Density( currentDensity.density * scaleFactor.floatValue, currentDensity.fontScale ) } }
Skalowanie czcionek
Ta strategia jest bardziej precyzyjna, ponieważ modyfikuje tylko współczynnik fontScale. W rezultacie tylko elementy tekstowe powiększają się lub zmniejszają, a wszystkie inne komponenty układu, takie jak kontenery, dopełnienie i ikony, zachowują stały rozmiar. Ta strategia dobrze sprawdza się w przypadku poprawy czytelności tekstu w aplikacjach, w których użytkownicy dużo czytają.
class FontScaleState( // Note: For accessibility, typical min/max values are ~0.75x and ~3.5x. private val minScale: Float = 0.75f, private val maxScale: Float = 3.5f, private val currentDensity: Density ) { val transformableState = TransformableState { zoomChange, _, _ -> scaleFactor.floatValue = (scaleFactor.floatValue * zoomChange).coerceIn(minScale, maxScale) } val scaleFactor = mutableFloatStateOf(1f) fun scaledFont(): Density { return Density( currentDensity.density, currentDensity.fontScale * scaleFactor.floatValue ) } }
Wspólny interfejs wersji demonstracyjnej
Jest to wspólny DemoCard komponent kompozycyjny używany w obu poprzednich przykładach do wyróżnienia różnych zachowań skalowania.
@Composable private fun DemoCard() { Card( modifier = Modifier .width(360.dp) .padding(16.dp), shape = RoundedCornerShape(12.dp) ) { Column( modifier = Modifier.padding(16.dp), verticalArrangement = Arrangement.spacedBy(16.dp) ) { Text("Demo Card", style = MaterialTheme.typography.headlineMedium) var isChecked by remember { mutableStateOf(true) } Row(verticalAlignment = Alignment.CenterVertically) { Text("Demo Switch", Modifier.weight(1f), style = MaterialTheme.typography.bodyLarge) Switch(checked = isChecked, onCheckedChange = { isChecked = it }) } Row(verticalAlignment = Alignment.CenterVertically) { Icon(Icons.Filled.Person, "Icon", Modifier.size(32.dp)) Spacer(Modifier.width(8.dp)) Text("Demo Icon", style = MaterialTheme.typography.bodyLarge) } Row( Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween ) { Box( Modifier .width(100.dp) .weight(1f) .height(80.dp) .background(Color.Blue) ) Box( Modifier .width(100.dp) .weight(1f) .height(80.dp) .background(Color.Red) ) } Text( "Demo Text: Lorem ipsum dolor sit amet, consectetur adipiscing elit," + " sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.", style = MaterialTheme.typography.bodyMedium, textAlign = TextAlign.Justify ) } } }
Wskazówki i informacje
Aby zapewnić użytkownikom lepsze wrażenia, zastosuj te rekomendacje:
- Rozważ udostępnienie elementów sterujących skalą bez gestów: niektórzy użytkownicy mogą mieć trudności z gestami. Aby pomóc tym użytkownikom, rozważ udostępnienie alternatywnego sposobu dostosowywania lub resetowania skali, który nie wymaga gestów.
- Twórz aplikacje z myślą o różnych skalach: przetestuj interfejs pod kątem skalowania w aplikacji oraz ustawień czcionki lub wyświetlacza w całym systemie. Sprawdź, czy układy aplikacji dostosowują się prawidłowo, nie powodując uszkodzeń, nakładania się ani ukrywania treści. Dowiedz się więcej o tworzeniu układów adaptacyjnych.