برای دستگاههای تاشو، با تطبیق رفتار چرخش صفحهنمایش با وضعیت فیزیکی دستگاه میتوان تجربه کاربر را بهینه کرد. برای مثال، میتوانید تنظیم کنید که وقتی دستگاه در حالت شبیه رایانه لوحی باز میشود، صفحه بهطور خودکار بچرخد، اما وقتی دستگاه تا میشود، روی حالت عمودی قفل شود.
از Android 13، این سیستمعامل میتواند تنظیمات چرخش خودکار را براساس وضعیت دستگاه (مثلاً تاشده، بازشده، یا نیمهتاشده (حالت رومیزی)) سفارشیسازی کند.
شکل ۱. تنظیمات چرخش خودکار براساس وضعیت دستگاه که کاربر میبیند.
فعال کردن تنظیم چرخش خودکار براساس وضعیت دستگاه
برای فعال کردن و پیکربندی چرخش خودکار براساس وضعیت دستگاه،
رونهادی برای فایل config.xml چارچوب دستگاه ایجاد کنید، به این صورت:
با پر کردن آرایه عدد صحیح
config_perDeviceStateRotationLockDefaultsدر رونهادconfig.xmlدستگاهتان، رفتار پیشفرض چرخش خودکار را برای حالتهای مختلف دستگاه پیکربندی کنید:<!-- In your device overlay, for example, device/generic/goldfish/phone/overlay/frameworks/base/core/res/res/values/config.xml --> <resources> <!-- Map of device posture to rotation lock setting. Each entry must be in the format "key:value", or "key:value:fallback_key" for example: "0:1" or "2:0:1". The keys are one of Settings.Secure.DeviceStateRotationLockKey, and the values are one of Settings.Secure.DeviceStateRotationLockSetting. --> <integer-array name="config_perDeviceStateRotationLockDefaults"> <item>0:1</item> <!-- CLOSED -> LOCKED --> <item>1:0:2</item> <!-- HALF_OPENED -> IGNORED and fallback to device posture OPENED --> <item>2:2</item> <!-- OPENED -> UNLOCKED --> <item>3:0:0</item> <!-- REAR_DISPLAY -> IGNORED and fallback to device posture CLOSED --> </integer-array> </resources>
fallback-keyبه وضعیت دستگاه دیگری ارجاع میدهد و باید مشخص کنید مقدار وضعیت چه زمانیSettings.Secure.DEVICE_STATE_ROTATION_LOCK_IGNOREDاست. وقتی وضعیت بدنی به این روش پیکربندی میشود، هرگونه درخواست برای دریافت یا تنظیم اولویت چرخش خودکار آن به وضعیت بدنی جایگزین هدایت میشود.برای مثال، اگر وضعیت
HALF_OPENEDبه وضعیتOPENEDبرگردد:- خواندن تنظیم چرخش خودکار برای
HALF_OPENEDتنظیم فعلیOPENEDرا برمیگرداند. - درحالیکه دستگاه در وضعیت
HALF_OPENEDاست، اولویت چرخش خودکار جدیدی نوشته میشود اولویت برای وضعیتOPENEDبهروزرسانی میشود.
- خواندن تنظیم چرخش خودکار برای
شرحهایی را برای هر وضعیت دستگاه قابلتنظیم توسط کاربر پیکربندی کنید. آرایه رشتهای
config_settableAutoRotationDeviceStatesDescriptionsرا در رونهاد برنامه «تنظیمات» دستگاهتان تکمیل کنید:<!-- In your device's Settings app overlay --> <resources> <!-- The settings/preference description for each settable device posture defined in the array "config_perDeviceStateRotationLockDefaults". The item in position "i" describes the auto-rotation setting for the device posture also in position "i" in the array "config_perDeviceStateRotationLockDefaults". --> <string-array name="config_settableAutoRotationDeviceStatesDescriptions"> <item>Auto-rotate when folded</item> <item>@null</item> <!-- No description for state in position 1 (it is not settable by the user) --> <item>Auto-rotate when unfolded</item> </string-array> </resources>برای اصلاح برنامهریزیشده این تنظیمات، بهجای نوشتن مستقیم در ارائهدهندگان تنظیمات، از میاناهای برنامهسازی کاربردی صحیح استفاده کنید تا از عملکرد ناسازگار جلوگیری شود:
برای تغییر وضعیت فعلی قفل چرخش (
ACCELEROMETER_ROTATIONرا تغییر میدهد):- از SystemUI یا «راهانداز»، از
RotationPolicy#setRotationLock(...)استفاده کنید. - از «مدیر پنجره»، از
DisplayRotation#freezeRotation()یاthawRotation()استفاده کنید.
- از SystemUI یا «راهانداز»، از
برای تغییر اولویت قفل چرخش برای وضعیت دستگاه خاص (
DEVICE_STATE_ROTATION_LOCKرا تغییر میدهد):- از
requestDeviceStateAutoRotateSettingChange(...)ازRotationPolicyیاDeviceStateAutoRotateSettingManagerاستفاده کنید.
- از
جزئیات پیادهسازی
تنظیمات و کلاسهای کلیدی اصلی که رفتار چرخش خودکار را برای دستگاه تاشو کنترل میکنند در بخشهای زیر توضیح داده شده است.
تنظیمات
سیستم از دو تنظیم زیر برای مدیریت چرخش خودکار استفاده میکند:
Settings.System.ACCELEROMETER_ROTATION: این تنظیم اصلی چرخش خودکار است. برای دستگاه تاشو، مقدار آن نشان میدهد که چرخش خودکار برای وضعیت دستگاه فعلی فعال است یا نه.Settings.Secure.DEVICE_STATE_ROTATION_LOCK: این تنظیم اولویت چرخش خودکار کاربر را برای هر وضعیت دستگاه (برای مثال، تاشده یا بازشده) ذخیره میکند. این کار به سیستم اجازه میدهد تا اولویت صحیح را هنگام تغییر وضعیت دستگاه اعمال کند.این تنظیم بهصورت رشتهای با جداکننده دونقطه ذخیره میشود. هر جفت مقدار نشاندهنده وضعیت دستگاه و تنظیم چرخش مربوط به آن است. قالب اینگونه است:
<device_posture_0>:<rotation_value_0>:<device_posture_1>:<rotation_value_1>...مقادیر چرخش عبارتاند از:
0: نادیده گرفته شد (از تنظیمات وضعیت بازگشت استفاده میشود)-
1: قفل (چرخش خودکار خاموش است) 2: قفل باز است (چرخش خودکار روشن است)
برای مثال، رشته
"0:2:2:1"به این معنی است:- برای حالت تاشده (وضعیت
0)، چرخش خودکار باز است (2). - برای حالت باز (وضعیت
2)، چرخش خودکار قفل است (1).
کلاسهای کلیدی
منطق مدیریت تنظیمات چرخش خودکار مبتنی بر وضعیت دستگاه توسط کلاسهای زیر انجام میشود:
DeviceStateAutoRotateSettingManagerImpl: تنظیمDEVICE_STATE_ROTATION_LOCKرا مدیریت میکند. روشهایی برای بهروزرسانی تنظیم، بازیابی مقدار آن، و ثبت شنوندگان برای تغییرات ارائه میدهد.DeviceStateAutoRotateSettingController(مدیر پنجره):ACCELEROMETER_ROTATIONوDEVICE_STATE_ROTATION_LOCKرا همگامسازی میکند. وقتی وضعیت دستگاه تغییر میکند،ACCELEROMETER_ROTATIONبراساس اولویت کاربر برای وضعیت جدید بهروز میشود. این تنظیم تضمین میکند که هر تغییری درACCELEROMETER_ROTATIONبرای وضعیت فعلی دستگاه درDEVICE_STATE_ROTATION_LOCKذخیره شود و به همین ترتیب تغییراتDEVICE_STATE_ROTATION_LOCKبرای وضعیت فعلی درACCELEROMETER_ROTATIONمنعکس شود.DeviceStateAutoRotateSettingController(برنامه «تنظیمات»): میانای کاربر را در صفحه تنظیمات چرخش خودکار مبتنی بر وضعیت دستگاه کنترل میکند.PostureDeviceStateConverter: بین شناسههای عمومی وضعیت دستگاه و شناسههای وضعیت دستگاه که این ویژگی استفاده میکند تبدیل میکند.
اعتبارسنجی
ازآنجاییکه عملکرد این ویژگی بهشدت به پیکربندی سازنده تجهیزات اصلی بستگی دارد، آزمایشهای CTS خاصی برای آن وجود ندارد. باید آزمایش دستی انجام دهید تا تأیید کنید تنظیمات چرخش خودکار هنگام انتقال دستگاه بین حالتهای فیزیکی مختلفی که پیکربندی کردهاید، طبق انتظار تغییر میکند.