برای دستگاههای تاشو، میتوان با تطبیق رفتار چرخش صفحه نمایش با وضعیت فیزیکی دستگاه، تجربه کاربری را بهینه کرد. به عنوان مثال، میتوانید تنظیم کنید که وقتی دستگاه در حالت تبلت مانند باز میشود، صفحه نمایش به طور خودکار بچرخد، اما وقتی دستگاه تا میشود، به حالت عمودی قفل شود.
از اندروید ۱۳ به بعد، اندروید قابلیت شخصیسازی تنظیمات چرخش خودکار را بر اساس حالتهای دستگاه، مانند حالت تا شده، باز شده یا نیمه تا شده (حالت تبلت) دارد.

شکل ۱: تنظیمات چرخش خودکار مبتنی بر وضعیت دستگاه از دید کاربر.
فعال کردن تنظیم چرخش خودکار بر اساس وضعیت دستگاه
برای فعال کردن و پیکربندی چرخش خودکار مبتنی بر وضعیت دستگاه، یک پوشش دستگاه برای فایل 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>شما باید از API های صحیح برای تغییر این تنظیمات به صورت برنامه نویسی استفاده کنید، نه اینکه مستقیماً برای ارائه دهندگان تنظیمات بنویسید تا از رفتار متناقض جلوگیری شود:
برای تغییر وضعیت قفل چرخش فعلی (
ACCELEROMETER_ROTATIONرا تغییر میدهد):- از SystemUI یا Launcher، از
RotationPolicy#setRotationLock(...)استفاده کنید. - از پنجره مدیریت پنجره، از
DisplayRotation#freezeRotation()یاthawRotation()استفاده کنید.
- از SystemUI یا Launcher، از
برای تغییر تنظیمات قفل چرخش برای یک حالت خاص دستگاه (
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: تبدیل بین شناسههای عمومی وضعیت دستگاه و شناسههای وضعیت دستگاه مورد استفاده این ویژگی را انجام میدهد.
اعتبارسنجی
از آنجا که رفتار این ویژگی به شدت به پیکربندی سازنده اصلی (OEM) وابسته است، هیچ آزمایش CTS خاصی برای آن وجود ندارد. شما باید آزمایش دستی انجام دهید تا تأیید کنید که تنظیمات چرخش خودکار هنگام تغییر دستگاه بین حالتهای فیزیکی مختلفی که پیکربندی کردهاید، مطابق انتظار تغییر میکند.