فایلهای نقشه کاراکترهای کلیدی (فایلهای .kcm
) مسئول نگاشت ترکیبی از کدهای کلید Android با اصلاحکنندههای نویسههای یونیکد هستند.
فایلهای طرحبندی کلید مخصوص دستگاه برای همه دستگاههای ورودی داخلی (سختهشده) که دارای کلید هستند، لازم است، اگر فقط به سیستم بگوییم که دستگاه فقط برای هدف خاص است (نه یک صفحهکلید کامل).
فایلهای چیدمان کلید مخصوص دستگاه برای صفحهکلیدهای خارجی اختیاری هستند و اغلب اصلاً مورد نیاز نیستند. این سیستم یک نقشه کاراکتر کلید عمومی را ارائه می دهد که برای بسیاری از صفحه کلیدهای خارجی مناسب است.
اگر هیچ فایل طرح بندی کلید مخصوص دستگاه موجود نباشد، سیستم به جای آن یک پیش فرض را انتخاب می کند.
مکان
فایلهای نقشه کاراکترهای کلیدی توسط فروشنده 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
هنگام ساخت یک مسیر فایل که حاوی نام دستگاه است، همه کاراکترهای نام دستگاه به غیر از '0'-'9'، 'a'-'z'، 'A'-'Z'، '-' یا '_' با '_' جایگزین می شوند.
فایل نقشه کاراکتر کلید عمومی
این سیستم یک فایل نقشه کاراکتر کلید داخلی مخصوص به نام Generic.kcm
را ارائه می دهد. این نقشه کاراکتر کلیدی برای پشتیبانی از انواع صفحه کلید استاندارد خارجی در نظر گرفته شده است.
نقشه کاراکترهای کلید عمومی را تغییر ندهید!
فایل نقشه کاراکتر کلید مجازی
این سیستم یک فایل نقشه کاراکتر کلید داخلی ویژه به نام Virtual.kcm
را ارائه می دهد که توسط دستگاه های صفحه کلید مجازی استفاده می شود.
دستگاه صفحه کلید مجازی یک دستگاه ورودی مصنوعی است که شناسه آن -1 است (به KeyCharacterMap.VIRTUAL_KEYBOARD
مراجعه کنید). در تمام دستگاه های اندرویدی که با اندروید Honeycomb 3.0 شروع می شود، وجود دارد. هدف دستگاه صفحه کلید مجازی ارائه یک دستگاه ورودی داخلی شناخته شده است که می تواند برای تزریق کلید به برنامه ها توسط IME یا با ابزارهای آزمایشی، حتی برای دستگاه هایی که صفحه کلید داخلی ندارند، استفاده شود.
فرض بر این است که صفحه کلید مجازی دارای طرح بندی کامل QWERTY است که در همه دستگاه ها یکسان است. این امکان را برای برنامهها فراهم میکند که با استفاده از دستگاه کیبورد مجازی، ضربههای کلید را تزریق کنند و همیشه نتایج یکسانی داشته باشند.
نقشه کاراکترهای کلید مجازی را تغییر ندهید!
نحو
فایل نقشه کاراکتر کلیدی یک فایل متنی ساده است که از یک اعلان نوع صفحه کلید و مجموعه ای از اعلانات کلیدی تشکیل شده است.
اعلان نوع صفحه کلید
یک اعلان نوع صفحه کلید رفتار کلی صفحه کلید را توصیف می کند. یک فایل نقشه کاراکتر باید حاوی یک اعلان نوع صفحه کلید باشد. برای وضوح، اغلب در بالای فایل قرار می گیرد.
type FULL
انواع صفحه کلید زیر شناسایی می شوند:
NUMERIC
: یک صفحه کلید عددی (12 کلیدی).صفحه کلید عددی از ورود متن با استفاده از رویکرد چند ضربه ای پشتیبانی می کند. ممکن است لازم باشد چند بار روی یک کلید ضربه بزنید تا حرف یا نماد مورد نظر ایجاد شود.
این نوع کیبورد عموماً برای تایپ انگشت شست طراحی شده است.
مربوط به
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
رفتاری را مشخص میکند که زمانی اعمال میشود که هر دو اصلاحکننده RIGHT SHIFT و RIGHT ALT با هم فشرده شوند.
اصلاح کننده های زیر در ویژگی های اصلاح کننده شناسایی می شوند:
-
shift
: زمانی اعمال می شود که تغییر دهنده LEFT SHIFT یا RIGHT SHIFT فشار داده شود. -
lshift
: زمانی اعمال می شود که اصلاح کننده LEFT SHIFT فشار داده شود. -
rshift
: زمانی اعمال می شود که اصلاح کننده RIGHT SHIFT فشار داده شود. -
alt
: زمانی اعمال می شود که اصلاح کننده LEFT ALT یا RIGHT ALT فشار داده شود. -
lalt
: زمانی اعمال می شود که اصلاح کننده LEFT ALT فشرده شود. -
ralt
: زمانی اعمال می شود که اصلاح کننده RIGHT ALT فشار داده شود. -
ctrl
: زمانی اعمال می شود که اصلاح کننده LEFT CONTROL یا RIGHT CONTROL فشار داده شود. -
lctrl
: زمانی اعمال می شود که اصلاح کننده LEFT CONTROL فشار داده شود. -
rctrl
: زمانی اعمال می شود که اصلاح کننده RIGHT CONTROL فشار داده شود. -
meta
: زمانی اعمال می شود که اصلاح کننده متا چپ یا راست متا فشار داده شود. -
lmeta
: زمانی اعمال می شود که اصلاح کننده LEFT META فشرده شود. -
rmeta
: زمانی اعمال می شود که اصلاح کننده RIGHT META فشرده شود. -
sym
: هنگامی که تغییر دهنده SYMBOL فشار داده می شود اعمال می شود. -
fn
: هنگامی که اصلاح کننده FUNCTION فشار داده می شود اعمال می شود. -
capslock
: زمانی اعمال می شود که اصلاح کننده CAPS LOCK قفل باشد. -
numlock
: زمانی اعمال می شود که اصلاح کننده NUM LOCK قفل باشد. -
scrolllock
: زمانی اعمال می شود که اصلاح کننده SCROLL LOCK قفل باشد.
ترتیب فهرست بندی اموال مهم است. هنگام نگاشت یک کلید برای یک رفتار، سیستم تمام ویژگی های مربوطه را به ترتیب اسکن می کند و آخرین رفتار قابل اجرا را که پیدا کرده است برمی گرداند.
در نتیجه، ویژگی هایی که بعداً مشخص می شوند، ویژگی هایی را که قبلاً برای یک کلید مشخص شده اند لغو می کنند.
رفتارها
هر ویژگی به یک رفتار نگاشت می شود. رایج ترین رفتار تایپ کردن یک کاراکتر است اما موارد دیگری نیز وجود دارد.
رفتارهای زیر شناسایی می شوند:
none
: یک کاراکتر تایپ نکنید.این رفتار زمانی که هیچ کاراکتری مشخص نشده باشد، پیشفرض است. مشخص کردن
none
اختیاری است اما وضوح را بهبود می بخشد.'X'
: کاراکتر مشخص شده را به صورت تحت اللفظی تایپ کنید.این رفتار باعث می شود که کاراکتر مشخص شده در نمای متن متمرکز وارد شود. کاراکتر تحت اللفظی ممکن است هر کاراکتر ASCII یا یکی از دنباله های فرار زیر باشد:
-
'\\'
: یک کاراکتر اسلش تایپ کنید. -
'\n'
: یک کاراکتر خط جدید را تایپ کنید (از این برای ENTER / RETURN استفاده کنید). -
'\t'
: یک کاراکتر TAB تایپ کنید. -
'\''
: یک کاراکتر آپاستروف تایپ کنید. -
'\"'
: یک کاراکتر نقل قول را تایپ کنید. -
'\uXXXX'
: کاراکتر یونیکد را تایپ کنید که نقطه کد آن به صورت هگز با XXXX ارائه شده است.
-
fallback
<نام کد کلید اندروید>: در صورتی که کلید توسط برنامه مدیریت نمیشود، یک اقدام پیشفرض را انجام دهید.این رفتار باعث میشود که وقتی یک برنامه کاربردی کلید مشخصشده را بهطور بومی کنترل نمیکند، سیستم یک فشار کلید متفاوت را شبیهسازی کند. برای پشتیبانی از رفتار پیشفرض کلیدهای جدیدی که همه برنامهها نمیدانند چگونه با آنها کار کنند، مانند ESCAPE یا کلیدهای عددی صفحه کلید (زمانی که numlock فشار داده نشده است) استفاده میشود.
هنگامی که یک رفتار بازگشتی انجام می شود، برنامه دو کلید را فشار می دهد: یکی برای کلید اصلی و دیگری برای کلید بازگشتی که انتخاب شده است. اگر برنامه در حین کلید زدن کلید اصلی را کنترل کند، رویداد کلید بازگشتی لغو خواهد شد (
KeyEvent.isCanceled
بهtrue
باز می گردد).
سیستم دو کاراکتر یونیکد را برای انجام عملکردهای خاص رزرو می کند:
'\uef00'
: هنگامی که این رفتار انجام می شود، نمای متنی چهار کاراکتر قبل از مکان نما را مصرف می کند و حذف می کند، آنها را به صورت ارقام هگزا تفسیر می کند و نقطه کد یونیکد مربوطه را درج می کند.'\uef01'
: هنگامی که این رفتار انجام می شود، نمای متن یک گفتگوی انتخابگر کاراکتر را نشان می دهد که حاوی نمادهای متفرقه است.
این سیستم کاراکترهای یونیکد زیر را به عنوان ترکیبی از نویسههای کلیدی مرده تشخیص میدهد:
-
'\u0300'
: لهجه شدید. -
'\u0301'
: لهجه تند. -
'\u0302'
: لهجه Circumflex. -
'\u0303'
: لهجه تایلد. -
'\u0308'
: لهجه Umlaut.
هنگامی که یک کلید مرده و به دنبال آن کاراکتر دیگری تایپ می شود، کلید مرده و کاراکترهای زیر ساخته می شوند. به عنوان مثال، هنگامی که کاربر یک کلید مرده لهجه قبر و به دنبال آن حرف "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
را تایپ کنید).
سپس به اسکن جدول ادامه میدهد، اما هیچ ویژگی دیگری برای فشار دادن این کلید اعمال نمیشود (CAPS LOCK قفل نمیشود، نه کلید CONTROL فشار داده میشود، نه کلید ALT فشار داده میشود و نه کلید META فشار داده میشود).
بنابراین رفتار حاصل برای ترکیب کلید 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 }
یادداشت سازگاری
قبل از اندروید Honeycomb 3.0، نقشه کاراکترهای کلیدی اندروید با استفاده از نحو بسیار متفاوتی مشخص شده بود و در زمان ساخت در قالب فایل باینری ( .kcm.bin
) کامپایل می شد.
اگرچه فرمت جدید از همان پسوند .kcm
استفاده می کند، نحو کاملاً متفاوت است (و بسیار قدرتمندتر).
از اندروید Honeycomb 3.0، همه فایلهای نقشه کاراکترهای کلیدی اندروید باید از نحو جدید و قالب فایل متنی ساده استفاده کنند که در این سند توضیح داده شده است. سینتکس قدیمی پشتیبانی نمی شود و فایل های قدیمی .kcm.bin
توسط سیستم شناسایی نمی شوند.
یادداشت زبان
اندروید در حال حاضر از صفحه کلید چند زبانه پشتیبانی نمی کند. علاوه بر این، نقشه کاراکترهای کلید عمومی داخلی یک طرح صفحه کلید انگلیسی ایالات متحده را فرض می کند.
OEM ها تشویق می شوند تا نقشه های کاراکتر کلیدی سفارشی را برای صفحه کلید خود ارائه دهند، اگر برای زبان های دیگر طراحی شده اند.
نسخههای آینده Android ممکن است پشتیبانی بهتری از صفحهکلیدهای چند زبانه یا طرحبندی صفحهکلید قابل انتخاب توسط کاربر ارائه دهند.
اعتبار سنجی
مطمئن شوید که فایلهای نقشه کاراکترهای کلیدی خود را با استفاده از ابزار Validate Keymaps تأیید کنید.