تصف هذه الصفحة التحسينات الخاصة بحجم الأدوات والمرونة الأكبر تم طرحه في Android 12 (المستوى 31). كما يشرح بالتفصيل كيفية تحديد حجم الأداة.
استخدام واجهات برمجة تطبيقات محسّنة لأحجام الأدوات والتخطيطات
بدءًا من الإصدار Android 12 (المستوى 31 من واجهة برمجة التطبيقات)، يمكنك توفير حجم أكثر تنقيحًا. والتخطيطات المرنة عن طريق اتباع ما يلي، كما هو موضح في الأقسام التالية:
في الإصدارات السابقة من Android، من الممكن الحصول على نطاقات حجم
باستخدام
OPTION_APPWIDGET_MIN_WIDTH
،
OPTION_APPWIDGET_MIN_HEIGHT
,
OPTION_APPWIDGET_MAX_WIDTH
,
وOPTION_APPWIDGET_MAX_HEIGHT
إضافية ثم تقدير حجم الأداة، لكن هذا المنطق لا ينطبق على كل
المواقف المختلفة. بالنسبة إلى التطبيقات المصغّرة التي تستهدف الإصدار 12 من نظام التشغيل Android أو الإصدارات الأحدث، ننصحك
تقديم متجاوب أو دقيق
التنسيقات.
تحديد قيود إضافية لتغيير حجم التطبيق المصغّر
يضيف نظام Android 12 واجهات برمجة التطبيقات التي تتيح لك التأكّد من أنّ تطبيقك المصغّر الحجم بشكل أكثر موثوقية عبر الأجهزة المختلفة بأحجام شاشات مختلفة.
بالإضافة إلى minWidth
الحالية،
minHeight
,
minResizeWidth
,
وminResizeHeight
السمات، فاستخدم السمات appwidget-provider
الجديدة التالية:
targetCellWidth
وtargetCellHeight
: تحديد الحجم المستهدف للتطبيق المصغّر من حيث خلايا شبكة مشغّل التطبيقات في حال حذف محددة، يتم استخدام هاتين السمتين بدلاً منminWidth
أوminHeight
.maxResizeWidth
وmaxResizeHeight
: تحديد الحد الأقصى للحجم الذي يسمح المشغل للمستخدم بتغيير حجم الأداة إليه.
يوضح XML التالي كيفية استخدام سمات المقاس.
<appwidget-provider
...
android:targetCellWidth="3"
android:targetCellHeight="2"
android:maxResizeWidth="250dp"
android:maxResizeHeight="110dp">
</appwidget-provider>
توفير تخطيطات سريعة الاستجابة
إذا كان التنسيق بحاجة إلى التغيير بناءً على حجم الأداة، نوصي تقوم بإنشاء مجموعة صغيرة من التخطيطات، وكل منها صالح لمجموعة من الأحجام. إذا كان هذا هذا غير ممكن، فهناك خيار آخر ألا وهو توفير تنسيقات استنادًا إلى التطبيق المصغّر الحجم في وقت التشغيل، كما هو موضح في هذه الصفحة.
تتيح هذه الميزة تحجيم أكثر سلاسة ونظامًا أفضل بشكل عام. الصحة، لأنّ النظام لا يضطر إلى تنشيط التطبيق في كل مرة يعرض التطبيق المصغّر بحجم مختلف.
يوضح مثال الرمز التالي كيفية تقديم قائمة بالتنسيقات.
Kotlin
override fun onUpdate(...) { val smallView = ... val tallView = ... val wideView = ... val viewMapping: Map<SizeF, RemoteViews> = mapOf( SizeF(150f, 100f) to smallView, SizeF(150f, 200f) to tallView, SizeF(215f, 100f) to wideView ) val remoteViews = RemoteViews(viewMapping) appWidgetManager.updateAppWidget(id, remoteViews) }
Java
@Override public void onUpdate(...) { RemoteViews smallView = ...; RemoteViews tallView = ...; RemoteViews wideView = ...; Map<SizeF, RemoteViews> viewMapping = new ArrayMap<>(); viewMapping.put(new SizeF(150f, 100f), smallView); viewMapping.put(new SizeF(150f, 200f), tallView); viewMapping.put(new SizeF(215f, 100f), wideView); RemoteViews remoteViews = new RemoteViews(viewMapping); appWidgetManager.updateAppWidget(id, remoteViews); }
لنفترض أن التطبيق المصغّر يحتوي على السمات التالية:
<appwidget-provider
android:minResizeWidth="160dp"
android:minResizeHeight="110dp"
android:maxResizeWidth="250dp"
android:maxResizeHeight="200dp">
</appwidget-provider>
يعني مقتطف الرمز السابق ما يلي:
smallView
متوافق مع قياس 160 بكسل مستقل الكثافة (minResizeWidth
) × 110 بكسل مستقل الكثافة (minResizeHeight
) إلى 160 بكسل مستقل الكثافة × 199 بكسل مستقل الكثافة (نقطة النهاية التالية: 1 بكسل مستقل الكثافة)- تتوفّر ميزة "
tallView
" من 160 بكسل مستقل الكثافة × 200 بكسل مستقل الكثافة إلى 214 بكسل مستقل الكثافة (نقطة النهاية التالية - 1) × 200 بكسل مستقل الكثافة. wideView
: من 215 بكسل مستقل الكثافة × 110 بكسل مستقل الكثافة (minResizeHeight
) إلى 250 بكسل مستقل الكثافة (maxResizeWidth
) × 200 بكسل مستقل الكثافة (maxResizeHeight
)
يجب أن يتوافق التطبيق المصغّر مع نطاق الحجم من minResizeWidth
×.
من minResizeHeight
إلى maxResizeWidth
× maxResizeHeight
. ضمن هذا النطاق،
يمكنك تحديد نقطة الانقطاع لتبديل التخطيطات.
![مثال على التنسيق المتجاوب](https://developer.android.com/static/images/appwidgets/size-range.gif?authuser=9&hl=ar)
تقديم تنسيقات دقيقة
إذا لم تكن مجموعة صغيرة من التنسيقات سريعة الاستجابة ممكنة، فيمكنك تقديم تخطيطات مختلفة مصممة وفقًا للأحجام التي يتم عرض الأداة بها. هذا هو حجمين عادةً للهواتف (الوضع العمودي والأفقي) وأربعة أحجام القابلة للطي.
لتنفيذ هذا الحلّ، يجب أن ينفِّذ تطبيقك الخطوات التالية:
تحميل زائد
AppWidgetProvider.onAppWidgetOptionsChanged()
، وهو ما يسمى عندما تتغير مجموعة الأحجام.يمكنك الاتصال على الرقم
AppWidgetManager.getAppWidgetOptions()
، التي تعرضBundle
تحتوي على المقاسات.الوصول إلى مفتاح
AppWidgetManager.OPTION_APPWIDGET_SIZES
منBundle
يوضح مثال الرمز التالي كيفية توفير تنسيقات دقيقة.
Kotlin
override fun onAppWidgetOptionsChanged( context: Context, appWidgetManager: AppWidgetManager, id: Int, newOptions: Bundle? ) { super.onAppWidgetOptionsChanged(context, appWidgetManager, id, newOptions) // Get the new sizes. val sizes = newOptions?.getParcelableArrayList<SizeF>( AppWidgetManager.OPTION_APPWIDGET_SIZES ) // Check that the list of sizes is provided by the launcher. if (sizes.isNullOrEmpty()) { return } // Map the sizes to the RemoteViews that you want. val remoteViews = RemoteViews(sizes.associateWith(::createRemoteViews)) appWidgetManager.updateAppWidget(id, remoteViews) } // Create the RemoteViews for the given size. private fun createRemoteViews(size: SizeF): RemoteViews { }
Java
@Override public void onAppWidgetOptionsChanged( Context context, AppWidgetManager appWidgetManager, int appWidgetId, Bundle newOptions) { super.onAppWidgetOptionsChanged(context, appWidgetManager, appWidgetId, newOptions); // Get the new sizes. ArrayList<SizeF> sizes = newOptions.getParcelableArrayList(AppWidgetManager.OPTION_APPWIDGET_SIZES); // Check that the list of sizes is provided by the launcher. if (sizes == null || sizes.isEmpty()) { return; } // Map the sizes to the RemoteViews that you want. Map<SizeF, RemoteViews> viewMapping = new ArrayMap<>(); for (SizeF size : sizes) { viewMapping.put(size, createRemoteViews(size)); } RemoteViews remoteViews = new RemoteViews(viewMapping); appWidgetManager.updateAppWidget(id, remoteViews); } // Create the RemoteViews for the given size. private RemoteViews createRemoteViews(SizeF size) { }
تحديد حجم تطبيقك المصغّر
يجب أن يحدّد كل تطبيق مصغّر targetCellWidth
وtargetCellHeight
للأجهزة.
التي تعمل بنظام التشغيل Android 12 أو إصدار أحدث، أو minWidth
وminHeight
لجميع المستخدمين
من Android - مما يشير إلى الحد الأدنى من المساحة التي تستهلكها
تلقائيًا. ومع ذلك، عندما يضيف المستخدمون أداة إلى الشاشة الرئيسية، فإنه بشكل عام
أكثر من الحد الأدنى للعرض والارتفاع اللذين تحدّدهما.
توفر شاشات Android الرئيسية للمستخدمين شبكة من المساحات المتاحة التي يمكنهم
استخدام التطبيقات المصغّرة والأيقونات. يمكن أن تختلف هذه الشبكة حسب الجهاز؛ على سبيل المثال، العديد من
توفر الهواتف المحمولة شبكة 5×4، ويمكن أن توفر الأجهزة اللوحية شبكة أكبر. عندما يبدأ تطبيقك المصغّر
تضاف، فإنها تمدد لشغل الحد الأدنى من عدد الخلايا،
أفقيًا وعموديًا، مطلوبة لتلبية قيود
"targetCellWidth
" و"targetCellHeight
" على أجهزة قيد التشغيل
Android 12 أو الإصدارات الأحدث، أو minWidth
وminHeight
قيود على
الأجهزة التي تعمل بنظام التشغيل Android 11 (المستوى 30 لواجهة برمجة التطبيقات) أو الإصدارات الأقدم.
عرض خلية وارتفاعها وحجم الهوامش التلقائية المطبَّقة إلى التطبيقات المصغّرة يمكن أن تتفاوت من جهاز إلى آخر. استخدِم الجدول التالي لتقدير الحد الأدنى لأبعاد الأداة في هاتف شبكي نموذجي 5×4، مع الأخذ في الاعتبار عدد خلايا الشبكة المشغولة التي تريدها:
عدد الخلايا (العرض × الارتفاع) | الحجم المتاح في الوضع العمودي (dp) | الحجم المتاح في الوضع الأفقي (dp) |
---|---|---|
1x1 | 57×102 بكسل مستقل الكثافة | 127×51 بكسل مستقل الكثافة |
2×1 | 130 × 102 بكسل مستقل الكثافة | 269×51 بكسل مستقل الكثافة |
3x1 | 203×102 بكسل مستقل الكثافة | 412×51 بكسل مستقل الكثافة |
4×1 | 276 × 102 بكسل مستقل الكثافة | 554×51 بكسل مستقل الكثافة |
5x1 | 349 × 102 بكسل مستقل الكثافة | 697×51 بكسل مستقل الكثافة |
5×2 | 349×220 بكسل مستقل الكثافة | 697 × 117 بكسل مستقل الكثافة |
5×3 | 349 × 337 بكسل مستقل الكثافة | 697×184 بكسل مستقل الكثافة |
5×4 | 349×455 بكسل مستقل الكثافة | 697×250 بكسل مستقل الكثافة |
... | ... | ... |
ن x م | (73n - 16) × (118 مترًا - 16) | (142 - 15) × (66 - 15) |
استخدِم أحجام الخلايا في الوضع العمودي لتحديد القيم التي تقدّمها
السمات minWidth
وminResizeWidth
وmaxResizeWidth
وبالمثل،
استخدِم أحجام الخلايا في الوضع الأفقي لتحديد القيم التي تقدّمها
للسمات minHeight
وminResizeHeight
وmaxResizeHeight
السبب في ذلك هو أن عرض الخلية عادة ما يكون أصغر في الوضع الرأسي عنها في الوضع الأفقي - وبالمثل، يكون ارتفاع الخلية عادةً أصغر في الوضع الأفقي من الوضع العمودي.
على سبيل المثال، إذا كنت تريد تغيير حجم عرض الأداة إلى خلية واحدة على
Google Pixel 4، يجب ضبط minResizeWidth
على 56 وحدة بكسل مستقلة الكثافة (dp) كحدّ أقصى
للتأكّد من أنّ قيمة سمة minResizeWidth
أصغر
من 57dp - لأن عرض الخلية لا يقل عن 57 بكسل مستقل الكثافة في الوضع العمودي.
وبالمثل، إذا كنت تريد تغيير حجم ارتفاع الأداة في خلية واحدة في
الجهاز نفسه، يجب ضبط minResizeHeight
على 50 وحدة بكسل مستقلة الكثافة (dp) على الأكثر للتأكّد من
قيمة السمة minResizeHeight
أصغر من
51dp - لأن ارتفاع خلية واحدة على الأقل 51 بكسل مستقل الكثافة في الوضع الأفقي
يمكن تغيير حجم كل تطبيق مصغّر ضمن نطاقات الأحجام بين
minResizeWidth
/minResizeHeight
وmaxResizeWidth
/maxResizeHeight
السمات، مما يعني أنها بحاجة إلى التكيف مع أي نطاقات أحجام بينها.
على سبيل المثال، لضبط الحجم التلقائي للأداة في موضعها، يمكنك اضبط السمات التالية:
<appwidget-provider
android:targetCellWidth="3"
android:targetCellHeight="2"
android:minWidth="180dp"
android:minHeight="110dp">
</appwidget-provider>
هذا يعني أن الحجم الافتراضي للتطبيق المصغّر هو 3×2 الخلايا، كما هو محدد من خلال
targetCellWidth
وtargetCellHeight
— أو 180×110 بكسل مستقل الكثافة، بحيث
المحدد في minWidth
وminHeight
للأجهزة التي تعمل
الإصدار 11 من نظام التشغيل Android أو الإصدارات الأقدم وفي الحالة الثانية، يمكن أن
تختلف باختلاف الجهاز.
بالإضافة إلى ذلك، لضبط نطاقات الحجم المتوافقة مع أداتك، يمكنك تحديد ما يلي: :
<appwidget-provider
android:minResizeWidth="180dp"
android:minResizeHeight="110dp"
android:maxResizeWidth="530dp"
android:maxResizeHeight="450dp">
</appwidget-provider>
كما هو محدد من خلال السمات السابقة، يكون عرض الأداة يمكن تغيير حجمه من 180 بكسل مستقل الكثافة إلى 530 بكسل مستقل الكثافة (dp)، كما يمكن تغيير ارتفاعه من 110 بكسل مستقل الكثافة (dp) إلى 450 بكسل مستقل الكثافة (dp). يمكن بعد ذلك تغيير حجم الأداة من خلايا بحجم 3x2 إلى 5x2، طالما أن ما يلي: جميع الشروط:
- يحتوي الجهاز على شبكة 5×4.
- التعيين بين عدد الخلايا والحجم المتاح بالبكسلة في الثانية يتبع الجدول الذي يوضح تقدير الحد الأدنى الأبعاد في هذه الصفحة.
- وتتكيّف الأداة مع نطاق الحجم هذا.
Kotlin
val smallView = RemoteViews(context.packageName, R.layout.widget_weather_forecast_small) val mediumView = RemoteViews(context.packageName, R.layout.widget_weather_forecast_medium) val largeView = RemoteViews(context.packageName, R.layout.widget_weather_forecast_large) val viewMapping: Map<SizeF, RemoteViews> = mapOf( SizeF(180f, 110f) to smallView, SizeF(270f, 110f) to mediumView, SizeF(270f, 280f) to largeView ) appWidgetManager.updateAppWidget(appWidgetId, RemoteViews(viewMapping))
Java
RemoteViews smallView = new RemoteViews(context.getPackageName(), R.layout.widget_weather_forecast_small); RemoteViews mediumView = new RemoteViews(context.getPackageName(), R.layout.widget_weather_forecast_medium); RemoteViews largeView = new RemoteViews(context.getPackageName(), R.layout.widget_weather_forecast_large); Map<SizeF, RemoteViews> viewMapping = new ArrayMap<>(); viewMapping.put(new SizeF(180f, 110f), smallView); viewMapping.put(new SizeF(270f, 110f), mediumView); viewMapping.put(new SizeF(270f, 280f), largeView); RemoteViews remoteViews = new RemoteViews(viewMapping); appWidgetManager.updateAppWidget(id, remoteViews);
لنفترض أن الأداة تستخدم التخطيطات سريعة الاستجابة المحددة في الأقسام السابقة
من مقتطفات التعليمات البرمجية. هذا يعني أن التخطيط المحدد
يتم استخدام R.layout.widget_weather_forecast_small
من 180 بكسل مستقل الكثافة (minResizeWidth
) x
من 110 بكسل مستقل الكثافة (minResizeHeight
) إلى 269×279 بكسل مستقل الكثافة (نقاط النهاية التالية - 1) وبالمثل،
يتم استخدام R.layout.widget_weather_forecast_medium
من 270x110dp إلى 270x279dp،
وتستخدم R.layout.widget_weather_forecast_large
من حجم 270x280 بكسل مستقل الكثافة
530 بكسل مستقل الكثافة (maxResizeWidth
) × 450 بكسل مستقل الكثافة (maxResizeHeight
).
وعندما يقوم المستخدم بتغيير حجم الأداة، يتغير مظهرها ليتكيف مع كل حجم في الخلايا، كما هو موضح في الأمثلة التالية.
![مثال على تطبيق مصغّر يعرض الطقس بأصغر حجم 3×2 شبكة تعرض واجهة المستخدم
اسم الموقع (طوكيو) ودرجة الحرارة (14 درجة) والرمز الذي يشير إلى
طقس غائم جزئيًا.](https://developer.android.com/static/images/appwidgets/weather-size-3x2.png?authuser=9&hl=ar)
R.layout.widget_weather_forecast_small
.![مثال على تطبيق مصغّر عن الطقس بنموذج 4×2 "متوسط" الحجم. تغيير حجم التطبيق المصغّر
تعتمد بهذه الطريقة على كل واجهة المستخدم من حجم الأداة السابق،
وتضيف التصنيف "غائم بصورة جزئية" والتوقّعات بدرجات الحرارة بدءًا من
من 4 مساءً حتى 7 مساءً.](https://developer.android.com/static/images/appwidgets/weather-size-4x2.png?authuser=9&hl=ar)
R.layout.widget_weather_forecast_medium
.![مثال على تطبيق مصغّر عن الطقس بنموذج 5×2 "متوسط" الحجم. تغيير حجم التطبيق المصغّر
ينتج بهذه الطريقة نفس واجهة المستخدم مثل الحجم السابق، باستثناء
تم تمديدها بطول خلية واحدة لشغل مساحة أفقية أكبر.](https://developer.android.com/static/images/appwidgets/weather-size-5x2.png?authuser=9&hl=ar)
R.layout.widget_weather_forecast_medium
.![مثال على تطبيق مصغّر عن الطقس بحجم 5×3 "كبير" الحجم. تغيير حجم التطبيق المصغّر
تعتمد بهذه الطريقة على كل واجهة المستخدم من أحجام الأدوات السابقة،
وأضِف طريقة عرض داخل التطبيق المصغّر تحتوي على توقّعات أحوال الطقس
يومي الثلاثاء والأربعاء. رموز تشير إلى طقس مشمس أو ممطر
ودرجات الحرارة العالية والمنخفضة لكل يوم](https://developer.android.com/static/images/appwidgets/weather-size-5x3.png?authuser=9&hl=ar)
R.layout.widget_weather_forecast_large
.![مثال على تطبيق مصغّر عن الطقس بحجم 5×4 "كبير" الحجم. تغيير حجم التطبيق المصغّر
تعتمد بهذه الطريقة على كل واجهة المستخدم من أحجام الأدوات السابقة،
وتضيف الخميس والجمعة (والرموز المقابلة لكل منهما)
يشير إلى نوع الطقس وكذلك درجة الحرارة المرتفعة والمنخفضة
لكل يوم).](https://developer.android.com/static/images/appwidgets/weather-size-5x4.png?authuser=9&hl=ar)
R.layout.widget_weather_forecast_large
.