فایلهای نقشه نویسه کلید (.kcm فایل) مسئول نگاشت ترکیبهای
کدهای کلید Android با اصلاحکنندهها به نویسههای Unicode هستند.
فایلهای چیدمان کلید مختص دستگاه برای همه دستگاههای ورودی داخلی (توکار) که کلید دارند الزامی است، حتی اگر فقط برای این باشد که به سیستم بگویید دستگاه فقط برای هدف خاصی است (صفحهکلید کامل نیست).
فایلهای چیدمان کلید مختص دستگاه برای صفحهکلیدهای خارجی اختیاری است و اغلب اصلاً نیاز نیست. سیستم نقشه نویسه کلید عمومیای ارائه میدهد که برای بسیاری از صفحهکلیدهای خارجی مناسب است.
اگر فایل چیدمان کلید مختص دستگاه دردسترس نباشد، سیستم بهجای آن چیدمان پیشفرضی را انتخاب میکند.
مکان
فایلهای نقشه نویسههای کلیدی براساس شناسه ارائهدهنده USB، محصول (و درصورت تمایل نسخه) یا براساس نام دستگاه ورودی مکانیابی میشوند.
مسیرهای زیر بهترتیب مورد مشورت قرار میگیرند.
/odm/usr/keychars/Vendor_XXXX_Product_XXXX_Version_XXXX.kcm/vendor/usr/keychars/Vendor_XXXX_Product_XXXX_Version_XXXX.kcm/system/usr/keychars/Vendor_XXXX_Product_XXXX_Version_XXXX.kcm/data/system/devices/keychars/Vendor_XXXX_Product_XXXX_Version_XXXX.kcm/odm/usr/keychars/Vendor_XXXX_Product_XXXX.kcm/vendor/usr/keychars/Vendor_XXXX_Product_XXXX.kcm/system/usr/keychars/Vendor_XXXX_Product_XXXX.kcm/data/system/devices/keychars/Vendor_XXXX_Product_XXXX.kcm/odm/usr/keychars/DEVICE_NAME.kcm/vendor/usr/keychars/DEVICE_NAME.kcm/system/usr/keychars/DEVICE_NAME.kcm/data/system/devices/keychars/DEVICE_NAME.kcm/odm/usr/keychars/Generic.kcm/vendor/usr/keychars/Generic.kcm/system/usr/keychars/Generic.kcm/data/system/devices/keychars/Generic.kcm/odm/usr/keychars/Virtual.kcm/vendor/usr/keychars/Virtual.kcm/system/usr/keychars/Virtual.kcm/data/system/devices/keychars/Virtual.kcm
هنگام ساختن مسیر فایل که حاوی نام دستگاه است، همه نویسههای نام دستگاه بهغیراز «۰» تا «۹»، «a» تا «z»، «A» تا «Z»، «-» یا «_» با «_» جایگزین میشوند.
فایل نقشه نویسه کلید عمومی
سیستم فایل نقشه نویسه کلید داخلی ویژهای بهنام Generic.kcm ارائه میدهد.
این نگاشت نویسه کلید برای پشتیبانی از انواع صفحهکلیدهای خارجی استاندارد
درنظر گرفته شده است.
نقشه نویسه کلید عمومی را تغییر ندهید!
فایل نقشه نویسه کلید مجازی
سیستم فایل نقشه نویسه کلید داخلی ویژهای بهنام Virtual.kcm
ارائه میدهد که دستگاههای صفحهکلید مجازی از آن استفاده میکنند.
دستگاه صفحهکلید مجازی یک دستگاه ورودی ترکیبی است که شناسه آن -۱ است
(به KeyCharacterMap.VIRTUAL_KEYBOARD مراجعه کنید). این دستگاه در همه دستگاههای Android
از Android Honeycomb 3.0 وجود دارد. هدف دستگاه صفحهکلید مجازی
ارائه دستگاه ورودی داخلی شناختهشدهای است که میتوان از آن برای تزریق
ضربهکلیدها به برنامهها توسط IME یا ابزار آزمایشی استفاده کرد، حتی
برای دستگاههایی که صفحهکلید داخلی ندارند.
فرض میشود صفحهکلید مجازی دارای چیدمان کامل QWERTY باشد که در همه دستگاهها یکسان است. این کار باعث میشود برنامهها بتوانند بااستفاده از دستگاه صفحهکلید مجازی، ضربهکلیدها را تزریق کنند و همیشه نتایج یکسانی دریافت کنند.
نقشه نویسه کلید مجازی را تغییر ندهید!
نحو
فایل نقشه نویسههای کلیدی یک فایل نوشتاری ساده است که از یک نوع صفحهکلید اعلامیه و مجموعهای از اعلامیههای کلیدی تشکیل شده است.
اعلام نوع صفحهکلید
اعلام نوع صفحهکلید رفتار کلی صفحهکلید را شرح میدهد. فایل نگاشت نویسه باید حاوی اظهارنامه نوع صفحهکلید باشد. برای وضوح بیشتر، اغلب در بالای فایل قرار میگیرد.
type FULL
انواع صفحهکلید زیر تشخیص داده میشود:
-
NUMERIC: صفحهکلید عددی (۱۲ کلیدی).صفحهکلید عددی از ورود نوشتار بااستفاده از روش چندضربه پشتیبانی میکند. ممکن است لازم باشد برای تولید حرف یا نماد موردنظر، چندین بار روی کلید تکضرب بزنید.
این نوع صفحهکلید معمولاً برای تایپ با انگشت شست طراحی شده است.
معادل
KeyCharacterMap.NUMERICاست. -
PREDICTIVE: صفحهکلیدی با همه حروف، اما با بیشاز یک حرف در هر کلید.این نوع صفحهکلید معمولاً برای تایپ با انگشت شست طراحی شده است.
مطابق با
KeyCharacterMap.PREDICTIVE. -
ALPHA: صفحهکلیدی با همه حروف و شاید چند عدد.صفحهکلید الفبایی از ورود مستقیم نوشتار پشتیبانی میکند اما ممکن است چیدمان فشردهای با عامل شکل کوچک داشته باشد. برخلاف صفحهکلید
FULL، برخیاز نمادها ممکن است فقط بااستفاده از انتخابگرهای نویسه مجازی ویژه دردسترس باشند. علاوهبراین، برای بهبود سرعت و دقت تایپ، چارچوب امکانات ویژه برای صفحهکلیدهای الفبایی مثل حروف بزرگ خودکار و کلیدهای SHIFT و ALT تغییر وضعیتدادهشده / قفلشده ارائه میدهد.این نوع صفحهکلید معمولاً برای تایپ با انگشت شست طراحی شده است.
-
FULL: صفحهکلید کامل به سبک رایانه.صفحهکلید کامل مانند صفحهکلید رایانه عمل میکند. همه نمادها مستقیماً با فشار دادن کلیدهای صفحهکلید بدون پشتیبانی یا امکانات روی صفحهنمایش مانند حروف بزرگ خودکار قابل دسترسی هستند.
این نوع صفحهکلید معمولاً برای تایپ کردن با هر دو دست طراحی شده است.
-
SPECIAL_FUNCTION: صفحهکلیدی که فقط برای انجام عملکردهای کنترل سیستم استفاده میشود و نه برای تایپ کردن.صفحهکلید عملکرد ویژه فقط از کلیدهای غیرچاپشونده مثل HOME و POWER تشکیل شده است که درواقع برای تایپ کردن استفاده نمیشوند.
نقشههای نویسه کلید Generic.kcm و Virtual.kcm هر دو صفحهکلید FULL هستند.
بیانیههای کلیدی
هریک از بیانیههای کلید از کلیدواژه key و بهدنبال آن نام کد کلید Android، یک آکولاد باز، مجموعهای از ویژگیها و رفتارها، و یک آکولاد بسته تشکیل شده است.
key A {
label: 'A'
base: 'a'
shift, capslock: 'A'
ctrl, alt, meta: none
}
مشخصات
هر ویژگی کلید، نگاشتی از کلید به رفتار ایجاد میکند. برای فشردهتر کردن فایلهای نقشه نویسه کلید، چندین دارایی را میتوان با جدا کردن آنها با کاما به رفتار یکسانی تخصیص داد.
در مثال بالا، خصوصیت label به رفتار 'A' اختصاص داده شده است.
بهطور مشابه، داراییهای ctrl، alt، و meta همگی بهطور همزمان به رفتار none اختصاص داده میشوند.
ویژگیهای زیر شناسایی میشوند:
-
label: برچسبی را که بهصورت فیزیکی روی کلید چاپ شده است مشخص میکند، وقتی که شامل یک نویسه باشد. این مقداری است که توسط روشKeyCharacterMap.getDisplayLabelبرگردانده میشود. -
number: رفتار (نویسهای که باید تایپ شود) را وقتی نمای نوشتاری عددی کانونی است مشخص میکند، مثلاً وقتی کاربر شماره تلفن تایپ میکند.صفحهکلیدهای فشرده اغلب چندین نماد را در یک کلید ترکیب میکنند، بهطوریکه شاید از یک کلید برای تایپ کردن
'1'و'a'یا'#'و'q'استفاده شود. برای این کلیدها، داراییnumberباید تنظیم شود تا نشان دهد کدام نماد باید در بافت عددی تایپ شود، درصورت وجود.برخیاز نمادهای «عددی» معمول عبارتاند از ارقام
'0'تا'9'،'#'،'+'،'('،')'،','، و'.'. -
base: رفتار (نویسهای که باید تایپ شود) را درصورت فشار ندادن هیچ اصلاحگری مشخص میکند. -
<modifier> یا <modifier1>
+<modifier2>+…: رفتار (حرفی که باید تایپ شود) را وقتی کلید فشار داده میشود و همه تغییردهندههای مشخصشده فعال هستند تعیین میکند.برای مثال، ویژگی اصلاحگر
shiftرفتاری را مشخص میکند که وقتی اصلاحگر LEFT SHIFT یا RIGHT SHIFT فشار داده میشود اعمال میشود.بههمین ترتیب، دارایی اصلاحگر
rshift+raltرفتاری را مشخص میکند که وقتی اصلاحگرهای «شیفت راست» و «متناوب راست» با هم فشار داده میشوند اعمال میشود.
اصلاحگرهای زیر در داراییهای اصلاحگر تشخیص داده میشوند:
shift: وقتی اصلاحگر «کلید چپبَر» یا «کلید راستبَر» فشار داده شود اعمال میشود.lshift: وقتی کلید تبدیل LEFT SHIFT فشار داده شود اعمال میشود.rshift: وقتی اصلاحگر «شیفت راست» فشار داده میشود اعمال میشود.alt: وقتی کلید تغییردهنده «دگرساز چپ» یا «دگرساز راست» فشرده میشود اعمال میشود.lalt: وقتی اصلاحگر «ALT چپ» فشار داده میشود اعمال میشود.ralt: وقتی کلید تغییردهنده ALT راست فشار داده شود اعمال میشود.ctrl: وقتی کلید تغییردهنده «کنترل چپ» یا «کنترل راست» فشرده شود اعمال میشود.lctrl: وقتی کلید اصلاحی LEFT CONTROL فشار داده شود اعمال میشود.rctrl: وقتی اعمال میشود که اصلاحکننده RIGHT CONTROL فشار داده شود.meta: زمانی اعمال میشود که اصلاحگر LEFT META یا RIGHT META فشار داده شود.lmeta: وقتی اصلاحگر LEFT META فشار داده میشود اعمال میشود.rmeta: وقتی اصلاحگر «RIGHT META» فشار داده میشود اعمال میشود.sym: وقتی اصلاحگر «نماد» فشار داده میشود اعمال میشود.fn: وقتی اصلاحگر «عملکرد» فشار داده میشود اعمال میشود.-
capslock: وقتی اصلاحگر «حروف بزرگ» قفل باشد اعمال میشود. -
numlock: وقتی تغییردهنده «قفل عددی» قفل باشد اعمال میشود. -
scrolllock: وقتی اصلاحگر «قفل پیمایش» قفل باشد اعمال میشود.
ترتیب فهرست شدن داراییها مهم است. وقتی کلیدی را به عملکردی نگاشت میکنید، سیستم همه داراییهای مربوطه را بهترتیب اسکن میکند و آخرین عملکرد قابلاعمالی را که پیدا میکند برمیگرداند.
درنتیجه، داراییهایی که بعداً مشخص میشوند، داراییهایی را که قبلاً برای کلید معینی مشخص شدهاند ملغی میکنند.
رفتارها
هر ویژگی به یک رفتار نگاشت میشود. رایجترین رفتار تایپ کردن نویسه است اما رفتارهای دیگری هم وجود دارد.
رفتارهای زیر تشخیص داده میشود:
-
none: نویسهای تایپ نکنید.این رفتار زمانی پیشفرض است که هیچ شخصیتی مشخص نشده باشد. مشخص کردن
noneاختیاری است اما وضوح را بهبود میبخشد. -
'X': نویسه تحتاللفظ مشخصشده را تایپ کنید.این رفتار باعث میشود نویسه مشخصشده در نمای نوشتاری کانونی وارد شود. حرفثابت میتواند هر نویسه ASCII یا یکی از توالیهای گریز زیر باشد:
-
'\\': نویسه واکجخط را تایپ کنید. -
'\n': نویسه خط جدیدی تایپ کنید (از این برای ENTER / RETURN استفاده کنید). -
'\t': نویسه «کلید جهش» را تایپ کنید. '\'': نویسه آپاستروف را تایپ کنید.'\"': نویسه نقلقول را تایپ کنید.-
'\uXXXX': نویسه «یونیکد» را که نقطه کد آن در هگز با XXXX داده شده است تایپ کنید.
-
-
fallback<نام کد کلید Android>: اگر کلید توسط برنامه مدیریت نشود، کنش پیشفرضی انجام میشود.این رفتار باعث میشود که سیستم وقتی برنامهای کلید مشخصشده را بهصورت بومی مدیریت نمیکند، فشار کلید دیگری را شبیهسازی کند. از آن برای پشتیبانی از رفتار پیشفرض برای کلیدهای جدیدی که همه برنامهها نمیدانند چگونه آنها را مدیریت کنند، مثل کلیدهای ESCAPE یا صفحهکلید عددی (وقتی numlock فشرده نشده است) استفاده میشود.
وقتی رفتار جایگزین انجام میشود، برنامه دو فشار کلید دریافت میکند: یکی برای کلید اصلی و دیگری برای کلید جایگزینی که انتخاب شده است. اگر برنامه کلید اصلی را درطول رویداد کلید بالا مدیریت کند، رویداد کلید جایگزین لغو خواهد شد (
KeyEvent.isCanceledمقدارtrueرا برمیگرداند).
سیستم دو نویسه یونیکد را برای انجام عملکردهای ویژه رزرو میکند:
-
'\uef00': وقتی این رفتار انجام میشود، نمای نوشتاری چهار نویسه قبلاز مکاننما را مصرف و حذف میکند، آنها را بهعنوان ارقام هگز تفسیر میکند، و کدپوینت «یونیکد» متناظر را درج میکند. -
'\uef01': وقتی این رفتار انجام میشود، نمای نوشتار کادر گفتگوی انتخابگر نویسهای را نمایش میدهد که حاوی نمادهای متفرقه است.
سیستم نویسههای یونیکد زیر را بهعنوان نویسههای کلید مرده نشانهگذاری ترکیبی تشخیص میدهد:
-
'\u0300': اَکسان گراو. '\u0301': اَکسان اِگو.'\u0302': آکسان هشتک.-
'\u0303': مدک. -
'\u0308': آکسان اوملات.
وقتی کلید مردهای تایپ میشود و پساز آن نویسه دیگری تایپ میشود، کلید مرده و نویسههای بعدی ترکیب میشوند. برای مثال، وقتی کاربر کلید مرده زیر را تایپ میکند و سپس حرف «a» را تایپ میکند، نتیجه «à» میشود.
برای اطلاعات بیشتر درباره مدیریت کلیدهای مرده، به KeyCharacterMap.getDeadChar مراجعه کنید.
نظرات
خطوط نظر با «#» شروع میشوند و تا انتهای خط ادامه مییابند. به این صورت:
# A comment!
خطوط خالی نادیده گرفته میشوند.
نحوه نگاشت ترکیبهای کلیدی به رفتارها
وقتی کاربر کلیدی را فشار میدهد، سیستم عملکرد مرتبط با ترکیب آن فشار کلید و اصلاحکنندههایی را که درحالحاضر فشار داده شدهاند جستجو میکند.
SHIFT + A
فرض کنید کاربر کلیدهای A و SHIFT را باهم فشار داده است. سیستم ابتدا مجموعه داراییها و رفتارهای مرتبط با KEYCODE_A را پیدا میکند.
key A {
label: 'A'
base: 'a'
shift, capslock: 'A'
ctrl, alt, meta: none
}
سیستم داراییها را از اول به آخر و از چپ به راست اسکن میکند و داراییهای label و number را که ویژه هستند نادیده میگیرد.
اولین ویژگیای که با آن مواجه شدیم base است. ویژگی base همیشه برای کلید اعمال میشود،
صرفنظر از اینکه چه کلیدهای توصیفگری فشار داده شده باشد. این مشخصه اساساً رفتار پیشفرض کلید را مشخص میکند، مگر اینکه با ویژگیهای زیر لغو شود.
ازآنجاییکه خصوصیت base برای این فشار کلید اعمال میشود، سیستم
این واقعیت را که عملکرد آن 'a' است (نویسه a را تایپ کنید) یادداشت میکند.
سپس سیستم به اسکن کردن ویژگیهای بعدی ادامه میدهد تا ببیند آیا هیچکدام از آنها
خاصتر از base هستند و آن را لغو میکنند یا نه. با shift مواجه میشود که
برای فشار دادن کلید SHIFT + A نیز اعمال میشود. بنابراین سیستم تصمیم میگیرد رفتار دارایی base را نادیده بگیرد و رفتاری را انتخاب میکند که با دارایی shift مرتبط است، که 'A' است (نویسه A را تایپ کنید).
سپس به اسکن کردن جدول ادامه میدهد، اما هیچ ویژگی دیگری برای این فشار کلید اعمال نمیشود (کلید «حروف بزرگ» قفل نیست، کلید «کنترل» فشار داده نشده است، کلید «متناوب» فشار داده نشده است، و کلید «متا» فشار داده نشده است).
بنابراین رفتار حاصل برای ترکیب کلید SHIFT + A، 'A' است.
CONTROL + A
اکنون درنظر بگیرید اگر کاربر A و CONTROL را با هم فشار دهد چه اتفاقی میافتد.
مانند قبل، سیستم جدول داراییها را اسکن میکند. متوجه میشد که دارایی base اعمال شده است، اما به اسکن کردن ادامه میداد تا درنهایت به دارایی control میرسید. همانطور که اتفاق میافتد، دارایی control
پساز base ظاهر میشود، بنابراین عملکرد آن عملکرد base را ملغی میکند.
بنابراین، رفتار حاصل از ترکیب کلید CONTROL + A none است.
Escape
اکنون فرض کنید کاربر کلید «گریز» را فشار داده است.
key ESCAPE {
base: fallback BACK
alt, meta: fallback HOME
ctrl: fallback MENU
}
این بار سیستم رفتار fallback BACK، یک رفتار جایگزین، را بهدست میآورد.
چون هیچ نویسه حرفیای ظاهر نمیشود، هیچ نویسهای تایپ نخواهد شد.
هنگام پردازش کلید، سیستم ابتدا KEYCODE_ESCAPE را به
برنامه تحویل میدهد. اگر برنامه آن را مدیریت نکند، سیستم دوباره تلاش خواهد کرد اما این بار KEYCODE_BACK را طبق درخواست رفتار جایگزین به برنامه تحویل خواهد داد.
بنابراین برنامههایی که KEYCODE_ESCAPE را تشخیص میدهند و از آن پشتیبانی میکنند
فرصت دارند آن را همانطور که هست مدیریت کنند، اما برنامههای دیگری که نمیتوانند این کار را انجام دهند
میتوانند کنش احتیاطی را انجام دهند و با کلید طوری رفتار کنند که گویی KEYCODE_BACK است.
NUMPAD_0 با یا بدون NUM LOCK
کلیدهای صفحهکلید عددی بسته به اینکه کلید NUM LOCK قفل باشد یا نه، تفسیرهای بسیار متفاوتی دارند.
اعلام کلید زیر تضمین میکند که وقتی NUM LOCK فشار داده میشود،
KEYCODE_NUMPAD_0 0 را تایپ میکند. وقتی NUM LOCK فشار داده نشود، کلید مثل همیشه به برنامه تحویل داده میشود و اگر مدیریت نشود، کلید جایگزین KEYCODE_INSERT تحویل داده میشود.
key NUMPAD_0 {
label, number: '0'
base: fallback INSERT
numlock: '0'
ctrl, alt, meta: none
}
همانطور که میبینیم، اعلام کلیدهای جایگزین سازگاری با برنامههای قدیمیتر را که همه کلیدهای موجود در صفحهکلید کامل سبک رایانه را تشخیص نمیدهند یا مستقیماً پشتیبانی نمیکنند، بهطور قابلتوجهی بهبود میبخشد.
مثالها
صفحهکلید کامل
# This is an example of part of a key character map file for a full keyboard
# include a few fallback behaviors for special keys that few applications
# handle themselves.
type FULL
key C {
label: 'C'
base: 'c'
shift, capslock: 'C'
alt: '\u00e7'
shift+alt: '\u00c7'
ctrl, meta: none
}
key SPACE {
label: ' '
base: ' '
ctrl: none
alt, meta: fallback SEARCH
}
key NUMPAD_9 {
label, number: '9'
base: fallback PAGE_UP
numlock: '9'
ctrl, alt, meta: none
}
صفحهکلید الفباعددی
# This is an example of part of a key character map file for an alphanumeric
# thumb keyboard. Some keys are combined, such as `A` and `2`. Here we
# specify `number` labels to tell the system what to do when the user is
# typing a number into a dial pad.
#
# Also note the special character '\uef01' mapped to ALT+SPACE.
# Pressing this combination of keys invokes an on-screen character picker.
type ALPHA
key A {
label: 'A'
number: '2'
base: 'a'
shift, capslock: 'A'
alt: '#'
shift+alt, capslock+alt: none
}
key SPACE {
label: ' '
number: ' '
base: ' '
shift: ' '
alt: '\uef01'
shift+alt: '\uef01'
}
دسته بازی
# This is an example of part of a key character map file for a game pad.
# It defines fallback actions that enable the user to navigate the user interface
# by pressing buttons.
type SPECIAL_FUNCTION
key BUTTON_A {
base: fallback BACK
}
key BUTTON_X {
base: fallback DPAD_CENTER
}
key BUTTON_START {
base: fallback HOME
}
key BUTTON_SELECT {
base: fallback MENU
}
یادداشت سازگاری
قبلاز Android Honeycomb 3.0، نگاشت نویسه کلید Android بااستفاده از نحو بسیار متفاوتی مشخص میشد و در زمان ساخت در قالب فایل دودویی (.kcm.bin) کامپایل میشد.
اگرچه قالب جدید از همان افزونه .kcm استفاده میکند، نحو آن کاملاً متفاوت (و بسیار قدرتمندتر) است.
از Android Honeycomb 3.0، همه فایلهای نقشه نویسههای کلید Android باید از
نحو جدید و قالب فایل نوشتار ساده که در این سند توضیح داده شده است استفاده کنند.
نحو قدیمی پشتیبانی نمیشود و سیستم فایلهای .kcm.bin قدیمی را تشخیص نمیدهد.
یادداشت زبان
درحالحاضر Android از صفحهکلید چندزبانه پشتیبانی نمیکند. علاوهبراین، نقشه نویسه کلید عمومی داخلی، جانمایی صفحهکلید انگلیسی امریکا را فرض میکند.
تولیدکنندگان اصلی سختافزار تشویق میشوند که اگر صفحهکلیدهایشان برای زبانهای دیگر طراحی شده است، نگاشت نویسه کلید سفارشی برای آنها ارائه دهند.
نسخههای آتی Android ممکن است از صفحهکلیدهای چندزبانه یا چیدمانهای صفحهکلید قابلانتخاب توسط کاربر پشتیبانی بهتری ارائه دهند.
اعتبارسنجی
حتماً فایلهای نگاشت نویسه کلید را بااستفاده از ابزار اعتبارسنجی نگاشتهای کلید اعتبارسنجی کنید.