توافق الإدخال على الشاشات الكبيرة

على الأجهزة ذات الشاشات الكبيرة، يتفاعل المستخدمون في أغلب الأحيان مع التطبيقات باستخدام لوحة المفاتيح أو الماوس أو لوحة اللمس أو قلم الشاشة أو لوحة الألعاب. لتمكين تطبيقك من قبول إدخالات من الأجهزة الخارجية، يمكنك إجراء ما يلي:

  • اختبار التوافق الأساسي مع لوحة المفاتيح، مثلاً التنقّل باستخدام مفتاح التبويب (Tab) ومفتاح السهم في لوحة المفاتيح، وإدخال تأكيد إدخال نص المفتاح، والتشغيل/الإيقاف المؤقت لشريط المسافة في تطبيقات الوسائط
  • إضافة اختصارات لوحة المفاتيح القياسية حيثما أمكن، على سبيل المثال، Ctrl + Z للتراجع وCtrl + S للحفظ
  • اختبر تفاعلات الماوس الأساسية من خلال النقر بزر الماوس الأيمن لقائمة السياق، والتغييرات في الرموز عند التمرير، وأحداث التمرير على عجلة الماوس أو لوحة اللمس في طرق العرض المخصّصة
  • اختبار أجهزة الإدخال الخاصة بالتطبيقات مثل قلم الشاشة لتطبيقات الرسم، ووحدات التحكم في الألعاب للألعاب، ووحدات تحكم MIDI لتطبيقات الموسيقى
  • استخدام أدوات الإدخال المتقدّمة التي قد تُبرز التطبيق في بيئات أجهزة الكمبيوتر المكتبي، مثل لوحة اللمس كأداة لتخفيف الصوت لتطبيقات منسّقي الموسيقى، والتقاط محتوى الماوس للألعاب، واختصارات لوحة المفاتيح الشاملة التي يستفيد منها المستخدمون الذين يتطلّعون إلى استخدام لوحة المفاتيح

لوحة المفاتيح

تساهم الطريقة التي يستجيب بها تطبيقك لإدخال لوحة المفاتيح في تقديم تجربة جيدة على الشاشة الكبيرة. هناك ثلاثة أنواع من إدخالات لوحة المفاتيح: التنقّل وضغطات المفاتيح والاختصارات.

نادرًا ما يتم تنفيذ التنقل بلوحة المفاتيح في التطبيقات التي تركز على اللمس، ولكن المستخدمون يتوقعون ذلك عندما يستخدمون تطبيقًا ويضعون أيديهم على لوحة مفاتيح. ويمكن أن يكون ذلك ضروريًا أيضًا للمستخدمين الذين يعانون من احتياجات سهولة الاستخدام على الهواتف والأجهزة اللوحية والأجهزة القابلة للطي وأجهزة الكمبيوتر المكتبي.

في العديد من التطبيقات، لا تحتاج سوى مفتاح السهم البسيط والتنقل في علامة التبويب إلى كل ما هو مطلوب، ويتم التعامل معه في الغالب تلقائيًا من خلال إطار عمل Android. على سبيل المثال، يمكن التركيز تلقائيًا على عرض Button، ويجب أن يعمل التنقّل باستخدام لوحة المفاتيح بشكل عام بدون أي رمز إضافي. ولتفعيل التنقّل باستخدام لوحة المفاتيح لطرق العرض غير القابلة للتركيز بشكل تلقائي، يجب أن يضع المطوّرون علامة عليها كعناصر قابلة للتركيز، وهو ما يمكن تنفيذه آليًا أو بتنسيق XML، كما هو موضّح أدناه. يُرجى الاطّلاع على مقالة التعامل مع التركيز للحصول على مزيد من المعلومات.

Kotlin

yourView.isFocusable = true

Java

yourView.setFocusable(true);

يمكنك بدلاً من ذلك ضبط السمة focusable في ملف التنسيق:

android:focusable="true"

وبعد تفعيل التركيز، ينشئ إطار عمل Android تعيينًا للتنقل لجميع طرق العرض التي يمكن التركيز عليها بناءً على موضعها. يعمل هذا عادةً كما هو متوقع ولا حاجة إلى مزيد من العمل. عندما لا يكون التعيين الافتراضي صحيحًا لاحتياجات التطبيق، يمكن تجاوزه على النحو التالي:

Kotlin

// Arrow keys
yourView.nextFocusLeftId = R.id.view_to_left
yourView.nextFocusRightId = R.id.view_to_right
yourView.nextFocusTopId = R.id.view_above
yourView.nextFocusBottomId = R.id.view_below

// Tab key
yourView.nextFocusForwardId = R.id.next_view

Java

// Arrow keys
yourView.setNextFocusLeftId(R.id.view_to_left);
yourView.setNextFocusRightId(R.id.view_to_left);
yourView.setNextFocusTopId(R.id.view_to_left);
yourView.setNextFocusBottomId(R.id.view_to_left);

// Tab key
yourView.setNextFocusForwardId(R.id.next_view);

من الممارسات الجيدة محاولة الوصول إلى كل جزء من وظائف التطبيق قبل استخدام لوحة المفاتيح فقط في كل إصدار. يجب أن يكون من السهل الوصول إلى الإجراءات الأكثر شيوعًا دون الإدخال بالماوس أو اللمس.

تذكر أن دعم لوحة المفاتيح قد يكون ضروريًا للمستخدمين الذين يحتاجون إلى سهولة الوصول.

ضغطات المفاتيح

بالنسبة إلى الإدخال النصي الذي تتم معالجته باستخدام لوحة المفاتيح الافتراضية على الشاشة (IME) مثل EditText، يجب أن تعمل التطبيقات كما هو متوقع على الأجهزة ذات الشاشات الكبيرة بدون أي جهد إضافي من مطوّر البرامج. بالنسبة إلى ضغطات المفاتيح التي لا يمكن توقعها من خلال إطار العمل، تحتاج التطبيقات إلى معالجة السلوك بنفسها. وينطبق ذلك بشكل خاص على التطبيقات ذات طرق العرض المخصّصة.

ومن الأمثلة على ذلك تطبيقات الدردشة التي تستخدم مفتاح Enter لإرسال رسالة، وتطبيقات وسائط تعمل على بدء التشغيل وإيقافه باستخدام مفتاح المسافة، والألعاب التي تتحكم في الحركة باستخدام المفاتيح w وa وs وd.

تلغي معظم التطبيقات معاودة الاتصال في onKeyUp() وتضيف السلوك المتوقّع لكل رمز مفتاح يتم تلقّيه، كما هو موضّح أدناه:

Kotlin

override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean {
    return when (keyCode) {
        KeyEvent.KEYCODE_ENTER -> {
            sendChatMessage()
            true
        }
        KeyEvent.KEYCODE_SPACE -> {
            playOrPauseMedia()
            true
        }
        else -> super.onKeyUp(keyCode, event)
    }
}

Java

@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_ENTER) {
        sendMessage();
        return true;
    } else if (KeyEvent.KEYCODE_SPACE){
        playOrPauseMedia();
        return true;
    } else {
        return super.onKeyUp(keyCode, event);
    }
}

يقع حدث onKeyUp عند تحرير مفتاح. يؤدي استخدام معاودة الاتصال هذا إلى منع التطبيقات من الحاجة إلى معالجة أحداث onKeyDown متعددة إذا تم الضغط على المفتاح أو رفعه ببطء. بالنسبة إلى الألعاب والتطبيقات التي تريد معرفة لحظة الضغط على مفتاح في تلك اللحظة أو التي يتوقع المستخدمون الضغط مع الاستمرار على مفاتيح لوحة المفاتيح، يمكنهم البحث عن حدث onKeyDown() والتعامل مع أحداث onKeyDown المتكرّرة بنفسها.

لمزيد من المعلومات عن إتاحة استخدام لوحة المفاتيح، يمكنك الاطّلاع على التعامل مع إجراءات لوحة المفاتيح.

الاختصارات

من المتوقع استخدام اختصارات شائعة تستند إلى Ctrl وAlt وShift عند استخدام لوحة مفاتيح أجهزة. إذا لم يقم التطبيق بتنفيذها، يمكن أن تشعر التجربة بالاستياء لدى المستخدمين. يقدر المستخدمون المتقدمون أيضًا الاختصارات للمهام الخاصة بالتطبيق التي يتم استخدامها بشكل متكرر. تجعل الاختصارات استخدام التطبيق أسهل وتميزه عن التطبيقات التي لا تحتوي على اختصارات.

تتضمن بعض الاختصارات الشائعة Ctrl + S (حفظ) وCtrl + Z (تراجع) وCtrl + Shift + Z (إعادة). للاطّلاع على مثال عن بعض الاختصارات الأكثر تقدّمًا، يمكنك مراجعة قائمة مفاتيح اختصارات مشغّل الوسائط VLC.

يمكن تنفيذ الاختصارات باستخدام dispatchKeyShortcutEvent(). ويعترض ذلك جميع مجموعات مفاتيح التعريف (Alt وCtrl وShift) لرمز مفتاح معيّن. للتحقّق من وجود مفتاح تعريفي معيّن، استخدِم KeyEvent.isCtrlPressed() أو KeyEvent.isShiftPressed() أو KeyEvent.isAltPressed() أو KeyEvent.hasModifiers().

يمكن أن يؤدي فصل رمز الاختصار عن التعامل مع ضغطات المفاتيح الأخرى (مثل onKeyUp() وonKeyDown()) إلى تسهيل صيانة الرمز وتفعيل القبول التلقائي للمفاتيح الوصفية بدون الحاجة إلى تنفيذ عمليات فحص المفتاح الوصفي يدويًا في كل حالة. قد يكون السماح بجميع مجموعات المفاتيح الوصفية أكثر ملاءمة للمستخدمين الذين اعتادوا على تنسيقات لوحة المفاتيح وأنظمة التشغيل المختلفة.

Kotlin

override fun dispatchKeyShortcutEvent(event: KeyEvent): Boolean {
  return when (event.keyCode) {
    KeyEvent.KEYCODE_O -> {
      openFile() // Ctrl+O, Shift+O, Alt+O
      true
    }
    KeyEvent.KEYCODE_Z-> {
      if (event.isCtrlPressed) {
        if (event.isShiftPressed) {
          redoLastAction() // Ctrl+Shift+Z pressed
          true
        } else {
          undoLastAction() // Ctrl+Z pressed
          true
        }
      }
    }
    else -> {
      return super.dispatchKeyShortcutEvent(event)
    }
  }
}

Java

@Override
public boolean dispatchKeyShortcutEvent(KeyEvent event) {
  if (event.getKeyCode() == KeyEvent.KEYCODE_O) {
      openFile(); // Ctrl+O, Shift+O, Alt+O
      return true;
  } else if(event.getKeyCode() == KeyEvent.KEYCODE_Z) {
      if (event.isCtrlPressed()) {
          if (event.isShiftPressed()) {
              redoLastAction();
              return true;
          }
          else {
              undoLastAction();
              return true;
          }
      }
  }
  return super.dispatchKeyShortcutEvent(event);
}

يمكنك أيضًا تطبيق الاختصارات في onKeyUp() من خلال البحث عن KeyEvent.isCtrlPressed() أوKeyEvent.isShiftPressed() أو KeyEvent.isAltPressed() كما هو موضح أعلاه. قد يكون من الأسهل صيانتها إذا كان سلوك التعريف يمثل تعديلاً لسلوك التطبيق أكثر من كونه اختصارًا. على سبيل المثال، عندما يشير الحرف W إلى "السير إلى الأمام" ويشير Shift + W إلى "الركض للأمام".

Kotlin

override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean {
  return when(keyCode) {
    KeyEvent.KEYCODE_W-> {
      if (event.isShiftPressed) {
        if (event.isCtrlPressed) {
          flyForward() // Ctrl+Shift+W pressed
          true
        } else {
          runForward() // Shift+W pressed
          true
        }
      } else {
        walkForward() // W pressed
        true
      }
    }
    else -> super.onKeyUp(keyCode, event)
  }
}

Java

@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_W) {
        if (event.isShiftPressed()) {
            if (event.isCtrlPressed()) {
                flyForward(); // Ctrl+Shift+W pressed
                return true;
            } else {
                runForward(); // Shift+W pressed
                return true;
            }
        } else {
            walkForward();
            return true;
        }
    }
    return super.onKeyUp(keyCode, event);
}

قلم الشاشة

تأتي العديد من الأجهزة ذات الشاشات الكبيرة بقلم الشاشة، وتتعامل تطبيقات Android مع ذلك كإدخال في الشاشة التي تعمل باللمس. وقد تحتوي بعض الأجهزة أيضًا على جدول رسم عبر USB أو بلوتوث، مثل Wacom Intuos. يمكن لتطبيقات Android تلقّي إدخال البلوتوث، ولكنها لن تعمل مع إدخال USB.

يتم الإبلاغ عن حدث قلم الشاشة على أنّه حدث شاشة تعمل باللمس من خلال View.onTouchEvent() أو View.onGenericMotionEvent()، ويحتوي على MotionEvent.getSource() من النوع SOURCE_STYLUS.

سيتضمّن "MotionEvent" أيضًا بيانات إضافية:

نقاط تاريخية

يرسل Android أحداث الإدخال في دفعات ويعرضها مرة واحدة لكل إطار. فبقلم الشاشة، يمكنه الإبلاغ عن الأحداث بمعدّلات تكرار أعلى بكثير من الشاشة. عند إنشاء تطبيقات رسم، من المهم التحقّق من الأحداث التي قد تكون في الماضي باستخدام واجهات برمجة تطبيقات getHistorical:

  • MotionEvent.getHistoricalX()
  • MotionEvent.getHistoricalY()
  • MotionEvent.getHistoricalPressure()
  • MotionEvent.getHistoricalAxisValue()

رفض راحة اليد

عندما يرسم المستخدمون تطبيقك أو يكتبونه أو يتفاعلون معه باستخدام قلم الشاشة، فإنهم أحيانًا يلمسون الشاشة براحة أيديهم. يمكن إبلاغ تطبيقك بحدث اللمس (الضبط على ACTION_DOWN أو ACTION_POINTER_DOWN) قبل أن يتعرّف النظام على لمسة راحة اليد غير المقصودة ويتجاهلها.

يلغي Android أحداث لمس راحة اليد من خلال إرسال MotionEvent. إذا تلقّى تطبيقك الرمز ACTION_CANCEL، عليك إلغاء الإيماءة. إذا كان تطبيقك يتلقّى ACTION_POINTER_UP، تحقَّق ممّا إذا تم ضبط FLAG_CANCELED. إذا كان الأمر كذلك، ألغِ الإيماءة.

لا تبحث عن FLAG_CANCELED فقط. بدءًا من نظام التشغيل Android 13، يضبط النظام السمة FLAG_CANCELED لأحداث ACTION_CANCEL، ولكن الإصدارات السابقة لا تفعل ذلك.

Android 12

في نظام التشغيل Android 12 (مستوى واجهة برمجة التطبيقات 32) والإصدارات الأقدم، لا يمكن رصد رفض راحة اليد إلا في أحداث اللمس الأحادي المؤشر. وإذا كانت لمسة راحة اليد هي المؤشر الوحيد، سيلغي النظام الحدث من خلال ضبط ACTION_CANCEL على عنصر حدث الحركة. إذا كانت المؤشرات الأخرى معطلة، يضبط النظام السمة ACTION_POINTER_UP، وهي قيمة غير كافية لرصد رفض راحة اليد.

Android 13

في نظام التشغيل Android 13 (المستوى 33 لواجهة برمجة التطبيقات) والإصدارات الأحدث، إذا كانت لمسة راحة اليد هي المؤشر الوحيد، سيلغي النظام الحدث من خلال ضبط ACTION_CANCEL وFLAG_CANCELED على كائن حدث الحركة. وإذا كانت المؤشرات الأخرى معطلة، سيضبط النظام السمتَين ACTION_POINTER_UP وFLAG_CANCELED.

عندما يتلقّى تطبيقك حدث حركة باستخدام ACTION_POINTER_UP، تحقَّق من FLAG_CANCELED لتحديد ما إذا كان الحدث يشير إلى رفض راحة اليد (أو إلغاء حدث آخر).

تطبيقات تدوين الملاحظات

يهدف نظام التشغيل ChromeOS إلى عرض تطبيقات تدوين الملاحظات المسجّلة للمستخدمين. لتسجيل تطبيق باعتباره تطبيق تدوين ملاحظات، أضف ما يلي إلى بيان Android:

<intent-filter>
    <action android:name="org.chromium.arc.intent.action.CREATE_NOTE" />
    <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

عند تسجيل تطبيق، يمكن للمستخدم اختياره كتطبيق تلقائي لتدوين الملاحظات. وعند طلب ملاحظة جديدة، يجب أن ينشئ التطبيق ملاحظة فارغة جاهزة للإدخال بقلم الشاشة. عندما يريد المستخدم إضافة تعليق توضيحي إلى صورة (مثل لقطة شاشة أو صورة تم تنزيلها)، يتم تشغيل التطبيق بعبارة ClipData تحتوي على عنصر واحد أو أكثر باستخدام معرّفات الموارد المنتظمة (URI) content://. يجب أن ينشئ التطبيق ملاحظة تستخدم أول صورة مرفقة كصورة خلفية وإدخال وضع حيث يمكن للمستخدم الرسم على الشاشة بقلم الشاشة.

اختبار أهداف تدوين الملاحظات بدون قلم الشاشة

لاختبار ما إذا كان أحد التطبيقات يستجيب بشكل صحيح لأهداف تدوين الملاحظات بدون قلم شاشة نشط، يمكنك استخدام الطريقة التالية لعرض خيارات تدوين الملاحظات على نظام التشغيل ChromeOS:

  1. التبديل إلى وضع المطوّر وجعل الجهاز قابلاً للكتابة
  2. اضغط على Ctrl + Alt + F2 لفتح نافذة طرفية
  3. نفِّذ الأمر sudo vi /etc/chrome_dev.conf.
  4. اضغط على i لتعديل النص وإضافة --ash-enable-palette إلى سطر جديد في نهاية الملف.
  5. الحفظ بالضغط على Esc ثم كتابة : وw وq والضغط على Enter
  6. اضغط على Ctrl + Alt + F1 للرجوع إلى واجهة المستخدم العادية في نظام التشغيل ChromeOS
  7. تسجيل الخروج ثم تسجيل الدخول مرة أخرى

من المفترض أن تظهر الآن قائمة بقلم الشاشة على الرف:

  • انقر على زر قلم الشاشة على الرف واختر ملاحظة جديدة. يُفترض أن يؤدي هذا إلى فتح ملاحظة رسم فارغة.
  • خذ لقطة شاشة. من الرف، اختَر زر قلم الشاشة > التقاط الشاشة أو نزِّل صورة. يجب أن يكون هناك خيار "إضافة تعليق توضيحي للصورة" في الإشعار. ينبغي أن يؤدي ذلك إلى تشغيل التطبيق بالصورة جاهزة للتعليق التوضيحي.

التوافق مع الماوس ولوحة اللمس

تحتاج معظم التطبيقات بشكل عام إلى معالجة ثلاثة أحداث كبيرة تتمحور حول الشاشة: النقر بزر الماوس الأيمن، والتمرير، والسحب والإفلات.

النقر بزر الماوس الأيمن

يجب أن تتفاعل أيضًا أي إجراءات تؤدي إلى عرض التطبيق لقائمة سياقات، مثل النقر مع الاستمرار على عنصر في القائمة، مع أحداث النقر بزر الماوس الأيمن. لمعالجة أحداث النقر بزر الماوس الأيمن، يجب أن تسجِّل التطبيقات View.OnContextClickListener. ولمزيد من التفاصيل حول إنشاء قائمة سياقات، يُرجى الاطّلاع على إنشاء قوائم سياقية.

Kotlin

yourView.setOnContextClickListener {
  showContextMenu()
  true
}

Java

yourView.setOnContextClickListener(v -> {
    showContextMenu();
    return true;
});

المرور فوق

يمكن للمطورين جعل تخطيطات تطبيقاتهم تبدو أنيقة وسهلة الاستخدام من خلال التعامل مع أحداث التمرير. وينطبق هذا الأمر بوجه خاص على طرق العرض المخصّصة. المثالان الأكثر شيوعًا على ذلك هما:

  • الإشارة للمستخدمين إلى ما إذا كان العنصر يحتوي على سلوك تفاعلي، مثل أن يكون قابلاً للنقر أو قابلاً للتعديل، عن طريق تغيير أيقونة مؤشر الماوس
  • إضافة ملاحظات مرئية إلى العناصر الموجودة في قائمة كبيرة أو شبكة عند تحريك المؤشر فوقها

Kotlin

// Change the icon to a "hand" pointer on hover,
// Highlight the view by changing the background.
yourView.setOnHoverListener { view, _ ->
  addVisualHighlighting(true)
  view.pointerIcon =
    PointerIcon.getSystemIcon(view.context,
    PointerIcon.TYPE_HAND)
  false // listener did not consume the event.
}

Java

yourView.setOnHoverListener((view, event) -> {
    addVisualHighlighting(true);
    view.setPointerIcon(PointerIcon
            .getSystemIcon(view.getContext(), PointerIcon.TYPE_HAND));
    return true;
});

سحب وإفلات

في بيئة متعددة النوافذ، يتوقّع المستخدمون أن يتمكّنوا من سحب العناصر وإفلاتها بين التطبيقات. ينطبق ذلك على أجهزة الكمبيوتر المكتبي وكذلك الأجهزة اللوحية والهواتف والأجهزة القابلة للطي في وضع تقسيم الشاشة.

على المطوّرين التفكير في ما إذا كان من المحتمل أن يسحب المستخدمون عناصر إلى تطبيقهم. وتشمل بعض الأمثلة الشائعة ما يلي: من المفترض أن يتلقّى محرِّرو الصور الصور، ومن المفترض أن تتوقّع برامج تشغيل الصوت استلام الملفات الصوتية، وأنّ برامج الرسم من المفترض أن تتلقّى الصور.

لإتاحة إمكانية السحب والإفلات، يمكنك الاطّلاع على مستندات السحب والإفلات في أجهزة Android والاطّلاع على مشاركة مدونة ChromeOS هذه.

اعتبارات خاصة لنظام التشغيل ChromeOS

  • تذكر طلب إذن عبر requestDragAndDropPermissions للوصول إلى العناصر التي تم سحبها من خارج التطبيق
  • يجب أن يتضمّن العنصر العلامة View.DRAG_FLAG_GLOBAL ليتم سحبه إلى التطبيقات الأخرى.

دعم المؤشر المتقدّم

على التطبيقات التي تعالج إدخالاً بالماوس ولوحة اللمس اتّباع مستندات Android الخاصة بـ View.onGenericMotionEvent() واستخدام MotionEvent.getSource() للتمييز بين SOURCE_MOUSE و SOURCE_TOUCHSCREEN.

افحص MotionEvent لتنفيذ السلوك المطلوب:

  • تُنشئ الحركة حدثَين (ACTION_HOVER_MOVE).
  • تُنشئ الأزرار حدثَين ACTION_BUTTON_PRESS وACTION_BUTTON_RELEASE. يمكنك أيضًا التحقق من الحالة الحالية لجميع أزرار الماوس/لوحة اللمس باستخدام getButtonState().
  • يؤدي التمرير بعجلة الماوس إلى إنشاء حدثَين (ACTION_SCROLL).

وحدات تحكُّم في الألعاب

تتوافق بعض أجهزة Android ذات الشاشات الكبيرة مع ما يصل إلى أربع وحدات تحكّم في الألعاب. على المطوّرين استخدام واجهات برمجة التطبيقات القياسية لوحدات التحكّم في الألعاب على نظام التشغيل Android للتعامل معها (راجع دعم وحدات تحكّم الألعاب).

يتم ربط الأزرار بقيم شائعة بعد تعيين مشترك. لسوء الحظ، لا تتبع جميع الشركات المصنعة لوحدات التحكم في الألعاب اصطلاحات التعيين ذاتها. يمكنك توفير تجربة أفضل بكثير إذا سمحت للمستخدمين باختيار تعيينات وحدة تحكم شائعة مختلفة. راجع معالجة الضغطات على أزرار لوحة الألعاب للحصول على مزيد من المعلومات.

وضع الترجمة المُدخَل

يفعِّل نظام التشغيل ChromeOS وضع ترجمة الإدخال تلقائيًا. بالنسبة إلى معظم تطبيقات Android، يساعد هذا الوضع التطبيقات على العمل كما هو متوقع في بيئة سطح المكتب. تشمل بعض الأمثلة تمكين التمرير بإصبعين تلقائيًا على لوحة اللمس، وتمرير عجلة الماوس، وتعيين إحداثيات العرض الأولية لإحداثيات النوافذ. عمومًا، لا يحتاج مطورو التطبيقات إلى تنفيذ أي من هذه السلوكيات بأنفسهم.

إذا نفّذ أحد التطبيقات سلوك إدخال مخصّصًا، مثل تحديد إجراء مخصّص للتصغير أو التكبير بإصبعين على لوحة اللمس، أو لم توفّر ترجمات الإدخال هذه أحداث الإدخال التي يتوقعها التطبيق، يمكنك إيقاف وضع ترجمة الإدخال من خلال إضافة العلامة التالية إلى بيان Android:

<uses-feature
    android:name="android.hardware.type.pc"
    android:required="false" />

مراجع إضافية