Pressable — köhnəlmiş TouchableHighlight, TouchableOpacity və TouchableWithoutFeedback komponentlərini əvəz edən, toxunmaları idarə etmək üçün müasir React Native komponentidir. Pressable pressed, hovered və focused vəziyyətlərinin aşkarlanması ilə vahid API təmin edir. Komponent React Native 0.63-də ortaya çıxmışdır və Meta tərəfindən bütün yeni layihələr üçün tövsiyə olunur. Komponent haqqında ətraflı məlumatı Meta sənədlərində oxuya bilərsiniz.
Başlıca
Pressable — bütün toxunma növlərini idarə etmək üçün vahid interfeys təmin edən React Native komponentidir. Üç fərqli Touchable komponentindən (TouchableHighlight, TouchableOpacity, TouchableWithoutFeedback) fərqli olaraq, Pressable onları çevik vəziyyət və stilizasiya sistemi ilə bir komponentdə əvəz edir.
Komponent React Native 0.63-də (sentyabr 2020) təqdim edilmişdir. Meta-nın məlumatlarına görə (2026), React Native-də yeni layihələrin 70%-i Touchable komponentləri əvəzinə Pressable-dən istifadə edir. Pressable Touchable-ın əsas problemini — dağınıq API və müxtəlif effektlər üçün komponentlər arasında keçid ehtiyacını həll edir.
TouchableOpacity-dən fərqli olaraq, burada toxunma effekti sərt şəkildə müəyyən edilmişdir (şeffaflığın dəyişməsi), Pressable cari vəziyyəti qəbul edən funksiya təqdim edir. Tərtibatçı toxunmaya vizual reaksiyanı özü müəyyənləşdirir: rəngi, miqyası, kölgəni və ya effektlərin kombinasiyasını dəyişmək. Bu, UX üzərində tam nəzarət verir.
Pressable üç qarşılıqlı təsir vəziyyəti müəyyənləşdirir: pressed (barmaq ekranda), hovered (kursor element üzərində Web/TV-də), focused (element klaviatura fokusunda). Hər vəziyyət müvafiq geri çağırışı aktivləşdirir və stil funksiyasına və uşaq render funksiyasına ötürülür.
| Vəziyyət | Şərt | Tipik reaksiya |
|---|---|---|
| pressed | Barmaq ekranda və ya klik basılı saxlanılır | Şəffaflığın, miqyasın, fon rənginin dəyişməsi |
| hovered | Kursor element üzərində (Web, TV) | İşıqlandırma, kölgə, alt xətt |
| focused | Element klaviatura fokusunda | Kontur, çərçivə, rəng dəyişməsi |
Vacib: hovered və focused yalnız göstərici dəstəyi olan platformalarda işləyir (Web, Android TV, Apple TV). Mobil cihazlarda yalnız pressed mövcuddur. Platformalararası tətbiqlər üçün vizual reaksiyaları bu məhdudiyyəti nəzərə alaraq dizayn edin.
<Pressable
style={({ pressed }) => [
styles.button,
pressed && styles.buttonPressed,
]}
onPress={handlePress}>
{({ pressed }) => (
<Text style={pressed ? styles.textPressed : styles.text}>
{pressed ? 'Release' : 'Press'}
</Text>
)}
</Pressable>Pressable API dörd əsas geri çağırış daxildir: onPress (buraxma ilə tam basma), onLongPress (uzun basma), onPressIn (toxunmanın başlanğıcı) və onPressOut (toxunmanın sonu). onPressIn və onPressOut kombinasiyası fərdi animasiyalar yaratmağa imkan verir.
Əlavə propslar: delayLongPress (uzun basma gecikməsi, standart 500 ms), pressRetentionOffset (basmanın ləğv edildiyi sahə), android_ripple (Android-də ripple effekti). Vacib: Ripple yalnız Android 5+-də işləyir.
<Pressable
onPress={() => console.log('Basılıb')}
onLongPress={() => console.log('Uzun basma')}
onPressIn={() => console.log('Barmaq aşağı')}
onPressOut={() => console.log('Barmaq yuxarı')}
delayLongPress={300}
android_ripple={{ color: 'rgba(0,0,0,0.1)', borderless: false }}
style={styles.button}>
<Text>Press me</Text>
</Pressable>onPress yalnız barmaq komponentin daxilində (pressRetentionOffset nəzərə alınmaqla) qaldırıldıqda çağrılır. İstifadəçi barmağını hüduddan kənara çəkərsə, onPress işləmir ki, bu da yanlış basmaların qarşısını alır. onPressOut istənilən halda barmaq qaldırıldıqda çağrılır.
hitSlop — toxunma sahəsini komponentin görünən hüdudlarından kənara genişləndirən Pressable propsudur. Bu kiçik elementlər üçün çox vacibdir: ikonalar, çekbokslar, radio düymələr. Apple HIG minimum toxunma hədəfi ölçüsü kimi 44x44 nöqtə tövsiyə edir. hitSlop vizual ölçünü dəyişmədən bu tələbi yerinə yetirməyə imkan verir.
hitSlop { top, bottom, left, right } obyektini və ya bütün tərəflər üçün vahid rəqəmi qəbul edir. Dəyərlər məntiqi piksellərlə (dp/pt) verilir. 24x24 ölçülü ikonalar üçün 44x44 toxunma hədəfinə çatmaq üçün hər tərəfdən minimum 10-12 hitSlop tövsiyə olunur.
<Pressable
hitSlop={{ top: 10, bottom: 10, left: 10, right: 10 }}
onPress={handleIconPress}
style={styles.iconButton}>
<Icon name="star" size={24} />
</Pressable>pressRetentionOffset — hitSlop-un əksi: istifadəçinin basmanı ləğv etmədən komponentin hüdudlarından kənara çıxa biləcəyi sahəni müəyyənləşdirir. Standart olaraq hitSlop-a bərabərdir. Basmanın hüduddan kənarda saxlanmasını istəyirsinizsə, pressRetentionOffset-i artırın.
Pressable vs Touchable — toxunmaları idarə etmək üçün komponent seçərkən əsas sual. TouchableOpacity, TouchableHighlight və TouchableWithoutFeedback köhnəlmiş komponentlərdir, silinməyəcəklər, lakin yeni xüsusiyyətlər almırlar. Meta yeni layihələr üçün Pressable-i tövsiyə edir.
Pressable-in əsas üstünlükləri: bütün effekt növləri üçün vahid API, fərdi stilizasiya üçün pressed vəziyyətinə giriş, hovered/focused vəziyyətlərinin dəstəyi, hitSlop və pressRetentionOffset, əlavə konfiqurasiya olmadan onLongPress geri çağırışı. TouchableOpacity yalnız sadə şeffaflıq dəyişikliyi üçün uyğundur.
| Ssenari | Touchable | Pressable |
|---|---|---|
| Sadə basma | TouchableOpacity | Pressable + style-də şeffaflıq |
| Fon işıqlandırması | TouchableHighlight | Pressable + backgroundColor |
| Vizual effektsiz | TouchableWithoutFeedback | Boş style ilə Pressable |
| Uzun basma | İstənilən Touchable-də onLongPress | Pressable-də onLongPress |
| Fərdi animasiya | Animated + onPressIn/Out | Pressable + useAnimatedStyle |
| Android-də Ripple | TouchableNativeFeedback | Pressable + android_ripple |
Pressable minimal kodla mürəkkəb interaktiv elementlər yaratmağa imkan verir. Aşağıda — basarken miqyas dəyişikliyi və Android-də ripple effekti olan animasiyalı düymə nümunəsi. Belə bir düymə TouchableOpacity + Animated kombinasiyasını əvəz edir.
const AnimatedButton = ({ title, onPress }) => {
const scale = React.useRef(new Animated.Value(1)).current;
const handlePressIn = () => {
Animated.spring(scale, {
toValue: 0.96,
useNativeDriver: true,
}).start();
};
const handlePressOut = () => {
Animated.spring(scale, {
toValue: 1,
friction: 3,
useNativeDriver: true,
}).start();
};
return (
<Pressable
onPress={onPress}
onPressIn={handlePressIn}
onPressOut={handlePressOut}
android_ripple={{ color: 'rgba(255,255,255,0.3)' }}
style={styles.button}>
<AnimatedView style={[styles.inner, { transform: [{ scale }] }]}>
<Text style={styles.text}>{title}</Text>
</AnimatedView>
</Pressable>
);
};Vacib: Pressable-də animasiyalar üçün useNativeDriver: true istifadə edin. Bu, animasiyanı yerli axına köçürür və sürətli basmalarda kadr itkilərinin qarşısını alır. Transform və şeffaflıq üçün yerli sürücü bütün platformalarda dəstəklənir.
Tez-tez verilən suallar
Xeyr, Pressable-in fərqli API-si var. TouchableOpacity basarkən avtomatik şeffaflıq tətbiq edir. Pressable vəziyyət funksiyası vasitəsilə açıq stil təyin edilməsini tələb edir. Əvəz etmə sadədir: style={({ pressed }) => [{ opacity: pressed ? 0.5 : 1 }]} ötürün.
android_ripple propsundan { color, borderless } obyekti ilə istifadə edin. Ripple rəngi rgba formatında verilir. Dairəvi düymələr üçün borderless: true istifadə edin. Ripple yalnız Android 5+-də işləyir. iOS-da fərdi animasiyadan istifadə edin.
Pressable-in skroll zamanı təsadüfi basmalara qarşı qorunması var. İstifadəçi siyahını skroll edirsə, onPress çağrılmır. Bu davranışı pressRetentionOffset və delayPressIn vasitəsilə konfiqurasiya etmək olar.
onLongPress propsundan istifadə edin — uzun basmanın daxili dəstəyi. Gecikmə delayLongPress vasitəsilə konfiqurasiya edilir (standart 500 ms). Kontekst menyuları və drag-and-drop üçün onLongPress-i onPressIn ilə birləşdirin.
Bəli, Pressable Android TV, Apple TV və Web-də klaviatura naviqasiyası üçün focused vəziyyətini dəstəkləyir. Fokusun göstərilməsi üçün { focused } vasitəsilə stilizasiyadan istifadə edin. Mobil cihazlarda focused vəziyyəti aktual deyil.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun