مقدمة
منذ وقت ليس ببعيد ، قرأت مقالة حول ورقة القاع ، وبعد التشاور مع الزملاء ، قررت تنفيذ هذا الشيء في طلبنا. بعد قضاء ساعات كافية لتعليم "القاع السفلي" كيفية السفر في بضع خطوات (مثل خرائط Google) ، أدركت بلاغته وحدوده. تم العثور على حلين: لف كل شيء في دفق من شأنه أن يراقب حالة الستارة المطولة في الوقت الحقيقي أو لإعادة كتابة بعض أساليب فئة BottomSheetBehavior (لحسن الحظ ، يسمح لك ترخيص Apache 2.0 بالقيام بذلك). اخترت الخيار الثاني ، لأنه بدا لي أكثر قابلية للتطبيق ، والآن ، بناءً على تجربتي ، سأحاول أن أخبركم بما جاء منه. آمل أن يكون هذا مفيدًا لشخص ما. حسنًا ، لنبدأ.
التخصيص
لقد تخطيت خطوات إنشاء مشروع ، وأضفت عليه صفحة Google Bottom Sheet ، لأنه إذا قرأت هذا ، فقد تغلبت بالفعل على كل ما سبق. سنحتاج إلى الانتقال إلى فئة BottomSheetBehavior ونسخ محتوياته إلى فئة CustomBottomSheetBehavior الجديدة التي أنشأناها. بمجرد النسخ ، لا تنسَ إعادة تسمية كل شيء مميز باللون الأحمر. أيضًا ، في ملف .xml الخاص بـ BottomSheet الخاص بنا ، يجب أن نعيد تسمية هذا السطر ، في إشارة إلى صفنا الجديد ، يجب أن يتحول شيء مثل هذا:
app:layout_behavior="com.my.custombottomsheetexample.CustomBottomSheetBehavior"
وهكذا ، لدينا أكثر من 700 سطر من شفرة Java تبدو مخيفة ، فماذا تفعل بها؟
تحتاج أولاً إلى العثور على طريقة onViewReleased ():
public void onViewReleased(@NonNull View releasedChild, float xvel, float yvel) { ... }
نحن بحاجة إلى تغيير بضعة أسطر. سنجد أولاً إذا {...} واستبدلنا محتوياته بهذا الرمز:
if (yvel < 0.0F) { currentTop = releasedChild.getTop(); if (currentTop > CustomBottomSheetBehavior.this.halfExpandedOffset) { top = CustomBottomSheetBehavior.this.halfExpandedOffset; targetState = 6; } else { top = 0; targetState = 3; } }
الآن تقدم BottomSheet الخاصة بنا على مرحلتين ، متوقفة في الوسط:
(
)
تغيير الطول
ولكن هذا ليس كل شيء ، يمكنك ضبط متوسط الارتفاع. للقيام بذلك ، كل ذلك في نفس الفئة ، ابحث عن تهيئة المتغير halfExpandedOffset:
this.halfExpandedOffset = this.parentHeight / 2;
عند النظر إلى هذا السطر ، يصبح من الواضح أنه يمكننا ضبط الارتفاع كما نرغب ، حتى من حيث النسبة المئوية. شخصيا ، فضلت تغيير مثل هذا:
this.halfExpandedOffset = this.parentHeight * 60 / 100;
(
)
يمتد My BottomSheet إلى 40٪ من ارتفاع العرض الرئيسي. هذا كل شئ!