Swipeable
هي واجهة برمجة تطبيقات Compose Material API تساعدك في إنشاء مكوّنات
يمكن التمرير سريعًا بينها بين حالات منفصلة، مثل الأوراق السفلية أو الأدراج أو
التمرير سريعًا لإغلاق العنصر. لدعم حالات الاستخدام المتقدّمة بشكلٍ أفضل، مثل عناصر الربط التي
تعتمد على حجم المكوّن، تم نشر عنصر لاحق في
Compose-Foundation 1.6.0-alpha01: AnchoredDraggable
. AnchoredDraggable
هي واجهة برمجة تطبيقات لإنشاء مكونات قابلة للسحب ذات حالات ثابتة، مثل
الأوراق السفلية أو الأدراج أو التمرير السريع للإغلاق.
لقد تم إيقاف واجهات برمجة التطبيقات Swipeable
التابعة للمواد لصالح AnchoredDraggable
الخاصة بالمؤسسة، وستتم إزالتها في إصدار مستقبلي. يشرح هذا الدليل
كيفية نقل البيانات من واجهات برمجة تطبيقات Swipeable
إلى AnchoredDraggable
.
نقل SwipeableState
إلى AnchoredDraggableState
ابدأ بتحديد التغييرات التي طرأت على مالك الحالة. لا يمكن اكتساب الخاصية AnchoredDraggableState
، ويتم تمثيل الإزاحة كـ Float.NaN
قبل إعدادها.
تعديل معلومات صاحب الحالة
AnchoredDraggableState
هي فئة نهائية، ما يعني أنّه لا يمكن اكتساب ميزاتها. إذا كان المكوّن الحالي ينشئ عنصرًا فرعيًا من SwipeableState
، عدِّل
عنصر الحالة ليحتوِى على إشارة إلى AnchoredDraggableState
بدلاً من
إنشاء عنصر فرعي منه:
تمرير سريع لمشاهدة الفيديو التالي
class MySwitchState: SwipeableState()
AnchoredDraggable
class MySwitchState {
private val anchoredDraggableState = AnchoredDraggableState(...)
}
بما أنّ مالك الحالة لم يعُد يكتسب معلومات من SwipeableState
، قد تحتاج إلى الإفصاح عن واجهات برمجة التطبيقات بنفسك. واجهات برمجة التطبيقات الأكثر شيوعًا التي يمكنك استخدامها هي
offset
وprogress
وcurrentValue
وtargetValue
.
الوصول إلى الإزاحة
على عكس Swipeable
، يكون offset
في AnchoredDraggableState
هو Float.NaN
قبل
بدء تشغيله. في AnchoredDraggable
، يمكن تمرير نقاط الربط إلى
طريقة وضع تصميم AnchoredDraggableState
أو تعديلها من خلال
AnchoredDraggableState#updateAnchors
. يؤدي تمرير نقاط الربط إلى باني
AnchoredDraggableState
إلى بدء القيمة المُعدَّلة على الفور.
إذا كانت نقاط الربط تعتمد على التنسيق أو يمكن أن تتغيّر، استخدِم
AnchoredDraggableState#updateAnchors
لتجنُّب إعادة إنشاء الحالة عند
تغيُّر نقاط الربط.
في حال استخدام updateAnchors
، سيكون ال offset هو Float.NaN
قبل تمرير
المرسّيات إلى updateAnchors
. لتجنُّب تمرير Float.NaN
إلى
المكوّنات عن طريق الخطأ، استخدِم AnchoredDraggableState#requireOffset
للمطالبة ببدء استخدام
الموضع المرجعي عند قراءته. يساعدك ذلك في رصد
التناقضات أو الأخطاء المحتمَلة في وقت مبكر.
@Composable
fun AnchoredDraggableBox() {
val state = remember { AnchoredDraggableState(...) }
val density = LocalDensity.current
val anchors = remember { DraggableAnchors { ... } }
SideEffect {
state.updateAnchors(anchors)
}
Box(
Modifier.offset { IntOffset(x = state.requireOffset(), y = 0) }
}
}
نقل بيانات Modifier.swipeable
إلى Modifier.anchoredDraggable
Modifier.anchoredDraggable()
يحل محل Modifier.swipeable
. تم نقل بعض
مَعلمات Modifier.swipeable()
إلى AnchoredDraggableState
مباشرةً، كما هو موضّح في الأقسام التالية.
تحديد علامات الارتساء
حدِّد نقاط الربط باستخدام طريقة إنشاء DraggableAnchors
. ثم مررها إلى الدالة الإنشائية AnchoredDraggableState#updateAnchors
أو AnchoredDraggableState
:
طريقة وضع التصميم
enum class DragValue { Start, Center, End }
@Composable
fun AnchoredDraggableBox() {
val anchors = DraggableAnchors {
Start at -100.dp.toPx()
Center at 0f
End at 100.dp.toPx()
}
val state = remember {
AnchoredDraggableState(anchors = anchors)
}
Box(
Modifier.offset { IntOffset(x = state.requireOffset(), y = 0) }
)
}
updateAnchors
enum class DragValue { Start, Center, End }
@Composable
fun AnchoredDraggableBox() {
val state = remember { AnchoredDraggableState(...) }
val density = LocalDensity.current
val anchors = with (density) {
DraggableAnchors {
Start at -100.dp.toPx()
Center at 0f
End at 100.dp.toPx()
}
}
SideEffect {
state.updateAnchors(anchors)
}
Box(
Modifier.offset { IntOffset(x = state.requireOffset(), y = 0) }
)
}
إذا كانت نقاط الربط ثابتة، مرِّرها إلى الدالة الإنشائية. إذا كانت تعتمد على التنسيق أو غير ثابتة، استخدِم updateAnchors
.
تحديد حدود موضعية
تم تغيير نوع معلَمة الحدود واسمها. بدلاً من استخدام واجهة ThresholdConfig
منفصلة، تحتوي دالة AnchoredDraggableState
على مَعلمة positionalThreshold
تستخدِم دالة لامدا لعرض
موضع الحدّ الأدنى. على سبيل المثال، يمكن التعبير عن الحدّ الأدنى للموقع بنسبة% 50 على النحو التالي:
val anchoredDraggableState = AnchoredDraggableState(
positionalThreshold = { distance -> distance * 0.5f },
...
)
يمكن التعبير عن الحدّ الأدنى للموقع 56dp
على النحو التالي:
val density = LocalDensity.current
val anchoredDraggableState = AnchoredDraggableState(
positionalThreshold = { with(density) { 56.dp.toPx() } },
...
)
تحديد حدود السرعة
يتم أيضًا تمرير حدود السرعة إلى دالة الإنشاء الخاصة بـ AnchoredDraggableState
،
ويتم التعبير عنها أيضًا كدالّة لامبدا:
val density = LocalDensity.current
val anchoredDraggableState = AnchoredDraggableState(
velocityThreshold = { with(density) { 125.dp.toPx() } },
...
)
التغييرات في واجهة برمجة التطبيقات
يمكنك الاطّلاع أدناه على نظرة عامة حول التغييرات التي طرأت على واجهة برمجة التطبيقات.
AnchoredDraggableState
|
|
---|---|
|
|
|
|
|
|
|
|
|
|
|
لا ينطبق |
|
|
|
|
|
|
|
|
|
|
|
Modifier.anchoredDraggable
|
|
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
تم تمريرها إلى دالة الإنشاء |
|
هذا الحساب غير متوافق حاليًا. يمكنك الاطّلاع على b/288084801 لمعرفة آخر حالة. |
|
تم تمريرها إلى طريقة وضع التصميم |