Dokunmatik cihazlar

Android, ekran kalemi tabanlı sayısallaştırıcı tabletler de dahil olmak üzere çeşitli dokunmatik ekranları ve dokunmatik yüzeyleri destekler.

Dokunmatik ekranlar, kullanıcının ekrandaki öğeleri doğrudan kontrol ettiği izlenimi verecek şekilde bir ekranla ilişkilendirilmiş dokunmatik cihazlardır.

Dokunmatik yüzeyler, ekranla ilişkili olmayan dokunmatik cihazlardır (ör. sayısallaştırıcı tablet). Dokunmatik alanlar genellikle bir kullanıcı arayüzünü işaret etme veya mutlak dolaylı konumlandırma ya da harekete dayalı kullanıcı arayüzü kontrolü için kullanılır.

Dokunmatik cihazlarda, işlevleri fare düğmelerine benzer düğmeler bulunabilir.

Dokunmatik cihazlar, temel dokunmatik sensör teknolojisine bağlı olarak bazen parmak veya ekran kalemi gibi çeşitli araçlar kullanılarak değiştirilebilir.

Dokunmatik cihazlar bazen sanal tuşlar uygulamak için kullanılır. Örneğin, bazı Android cihazlarda dokunmatik ekran sensör alanı ekranın kenarının dışına uzanır ve dokunmaya duyarlı bir tuş takımının parçası olarak iki işlevi yerine getirir.

Android, dokunmatik cihazların çok çeşitli olması nedeniyle her cihazın özelliklerini ve istenen davranışını tanımlamak için çok sayıda yapılandırma özelliği kullanır.

Dokunmatik cihaz sınıflandırması

Aşağıdaki koşulların her ikisi de geçerliyse giriş cihazı çoklu dokunmatik cihaz olarak sınıflandırılır:

  • Giriş cihazı, ABS_MT_POSITION_X ve ABS_MT_POSITION_Y mutlak eksenlerinin varlığını bildirir.
  • Giriş cihazında oyun kumandası düğmeleri yok. Bu koşul, eksenleri MT eksenleriyle çakışan kodlarla bildiren belirli oyun kumandalarıyla ilgili belirsizliği giderir.

Aşağıdaki koşulların her ikisi de geçerliyse giriş cihazı tek dokunuşlu cihaz olarak sınıflandırılır:

  • Giriş cihazı, çoklu dokunmatik cihaz olarak sınıflandırılmıyor. Giriş cihazları, tek dokunuşlu cihaz veya çok dokunuşlu cihaz olarak sınıflandırılır.
  • Giriş cihazı, ABS_X ve ABS_Y mutlak eksenlerinin ve BTN_TOUCH anahtar kodunun varlığını bildirir.

Bir giriş cihazı dokunmatik cihaz olarak sınıflandırıldığında, sanal tuşların varlığı cihazın sanal tuş haritası dosyası yüklenmeye çalışılarak belirlenir. Sanal anahtar haritası varsa cihazın anahtar düzeni dosyası da yüklenir. Bu dosyaların konumu ve biçimi hakkında bilgi edinmek için [Sanal anahtar haritası dosyaları](#virtual-key-map-files) bölümüne bakın.

Ardından, sistem dokunmatik cihaz için giriş cihazı yapılandırma dosyasını yükler.

Tüm yerleşik dokunmatik cihazlarda giriş cihazı yapılandırma dosyaları bulunmalıdır. Giriş cihazı yapılandırma dosyası yoksa sistem, harici USB veya Bluetooth HID dokunmatik ekranlar ya da dokunmatik yüzeyler gibi genel amaçlı dokunmatik çevre birimleri için uygun bir varsayılan yapılandırma seçer. Bu varsayılan ayarlar, yerleşik dokunmatik ekranlar için tasarlanmamıştır ve yanlış davranışlara neden olabilir.

Giriş cihazı yapılandırması yüklendikten sonra, sistem giriş cihazını dokunmatik ekran, dokunmatik alan veya işaretçi cihazı olarak sınıflandırır.

  • Ekrandaki nesneleri doğrudan değiştirmek için dokunmatik ekran cihazı kullanılır. Kullanıcı doğrudan ekrana dokunduğundan sistem, üzerinde işlem yapılan nesneleri belirtmek için ek olanaklar gerektirmez.
  • Dokunmatik yüzey cihazı, belirli bir sensör alanındaki dokunuşlarla ilgili mutlak konumlandırma bilgilerini uygulamaya sağlamak için kullanılır. Dijitalleştirici tabletler için faydalı olabilir.
  • İşaretçi cihaz, ekrandaki nesnelerin imleç kullanılarak dolaylı olarak işlenmesi için kullanılır. Parmaklar, çoklu dokunma işaretçi hareketleri olarak yorumlanır. Dokunmatik kalemler gibi diğer araçlar, mutlak konumlar kullanılarak yorumlanır. Daha fazla bilgi için Dolaylı çoklu dokunma işaretçi hareketleri başlıklı makaleyi inceleyin.

Aşağıdaki kurallar, giriş cihazını dokunmatik ekran, dokunmatik alan veya işaretçi cihaz olarak sınıflandırmak için kullanılır.

  • touch.deviceType mülkü ayarlanmışsa cihaz türü belirtildiği şekilde ayarlanır.
  • Giriş cihazı, INPUT_PROP_DIRECT giriş özelliğinin varlığını bildirirse (EVIOCGPROP ioctl aracılığıyla) cihaz türü dokunmatik ekran olarak ayarlanır. Bu koşulda, doğrudan girişli dokunmatik cihazların aynı zamanda bağlı bir ekrana bağlı olduğu varsayılır.
  • Giriş cihazı INPUT_PROP_POINTER giriş özelliğinin varlığını bildirirse (EVIOCGPROP ioctl aracılığıyla) cihaz türü işaretçi olarak ayarlanır.
  • Giriş cihazı REL_X veya REL_Y göreli eksenlerinin varlığını bildirirse cihaz türü dokunmatik yüzey olarak ayarlanır. Bu koşul, hem fare hem de dokunmatik yüzeyden oluşan giriş cihazlarıyla ilgili belirsizliği giderir. Bu durumda, fare zaten işaretçiyi kontrol ettiğinden dokunmatik yüzey işaretçiyi kontrol etmek için kullanılmaz.
  • Aksi takdirde cihaz türü işaretçi olarak ayarlanır. Bu varsayılan değer, başka bir özel amaç tanımlanmamış dokunmatik alanların işaretçiyi kontrol etmesini sağlar.

Düğmeler

Düğmeler, uygulamaların ek işlevleri gerçekleştirmek için kullanabileceği isteğe bağlı kontrollerdir. Dokunmatik cihazlardaki düğmeler, fare düğmelerine benzer şekilde çalışır ve çoğunlukla işaretçi türü dokunmatik cihazlarda veya ekran kalemi ile kullanılır.

Aşağıdaki düğmeler desteklenir:

  • BTN_LEFT: MotionEvent.BUTTON_PRIMARY ile eşlendi.
  • BTN_RIGHT: MotionEvent.BUTTON_SECONDARY ile eşlendi.
  • BTN_MIDDLE: MotionEvent.BUTTON_MIDDLE ile eşlendi.
  • BTN_BACK ve BTN_SIDE: MotionEvent.BUTTON_BACK ile eşlendi. Bu düğmeye basıldığında, KeyEvent.KEYCODE_BACK anahtar koduyla bir tuş basma işlemi de sentezlenir.
  • BTN_FORWARD ve BTN_EXTRA: MotionEvent.BUTTON_FORWARD ile eşlenmiştir. Bu düğmeye basıldığında KeyEvent.KEYCODE_FORWARD anahtar koduyla bir tuş basma işlemi de sentezlenir.
  • BTN_STYLUS: MotionEvent.BUTTON_SECONDARY ile eşlendi.
  • BTN_STYLUS2: MotionEvent.BUTTON_TERTIARY ile eşlendi.

Araçlar ve araç türleri

Araç, dokunmatik cihazla etkileşim kurmak için kullanılan parmak, ekran kalemi veya başka bir aparattır. Bazı dokunmatik cihazlar farklı araç türlerini ayırt edebilir.

Android'in diğer bölümlerinde ve MotionEvent API'de olduğu gibi, araçlar genellikle işaretçi olarak adlandırılır.

Aşağıdaki araç türleri desteklenir:

  • BTN_TOOL_FINGER ve MT_TOOL_FINGER: MotionEvent.TOOL_TYPE_FINGER ile eşlenmiştir.
  • BTN_TOOL_PEN ve MT_TOOL_PEN: MotionEvent.TOOL_TYPE_STYLUS ile eşlenmiştir.
  • BTN_TOOL_RUBBER: MotionEvent.TOOL_TYPE_ERASER ile eşlendi.
  • BTN_TOOL_BRUSH: MotionEvent.TOOL_TYPE_STYLUS ile eşlendi.
  • BTN_TOOL_PENCIL: MotionEvent.TOOL_TYPE_STYLUS ile eşlendi.
  • BTN_TOOL_AIRBRUSH: MotionEvent.TOOL_TYPE_STYLUS ile eşlendi.
  • BTN_TOOL_MOUSE: MotionEvent.TOOL_TYPE_MOUSE ile eşlendi.
  • BTN_TOOL_LENS: MotionEvent.TOOL_TYPE_MOUSE ile eşlendi.
  • BTN_TOOL_DOUBLETAP, BTN_TOOL_TRIPLETAP ve BTN_TOOL_QUADTAP: MotionEvent.TOOL_TYPE_FINGER ile eşlenir.

Fareyle üzerine gelme ve dokunma araçları

Araçlar, dokunmatik cihazla temas halinde veya kapsama alanında olup cihazın üzerinde durabilir. Tüm dokunmatik cihazlar, dokunmatik cihazın üzerinde fareyle gelen bir araç olduğunu algılayamaz. RF tabanlı ekran kalemi dönüştürücüler gibi bu özelliği sunan dönüştürücüler, genellikle kalemin dönüştürücünün sınırlı bir aralığında olduğunda bunu algılayabilir.

InputReader bileşeni, dokunma araçlarını fareyle üzerine gelme araçlarından ayırır. Benzer şekilde, dokunma araçları ve fareyle üzerine gelme araçları da uygulamalara farklı şekillerde bildirilir.

Dokunma araçları, MotionEvent.ACTION_DOWN, MotionEvent.ACTION_MOVE, MotionEvent.ACTION_DOWN, MotionEvent.ACTION_POINTER_DOWN ve MotionEvent.ACTION_POINTER_UP kullanılarak uygulamalara dokunma etkinlikleri olarak bildirilir.

Fareyle üzerine gelme araçları, MotionEvent.ACTION_HOVER_ENTER, MotionEvent.ACTION_HOVER_MOVE ve MotionEvent.ACTION_HOVER_EXIT kullanılarak uygulamalara genel hareket etkinlikleri olarak raporlanır.

Dokunmatik cihaz sürücüsüyle ilgili gereksinimler

  • Dokunmatik cihaz sürücüleri, yalnızca destekledikleri eksenler ve düğmeler için eksenleri ve tuş kodlarını kaydetmelidir. Desteklenmeyen eksenlerin veya anahtar kodlarının kaydedilmesi, cihaz sınıflandırma algoritmasını karıştırabilir ya da sistemin cihazın özelliklerini yanlış algılamasına neden olabilir. Örneğin, cihaz BTN_TOUCH anahtar kodunu bildirirse sistem, aracın ekrana dokunup dokunmadığını belirtmek için her zaman BTN_TOUCH öğesinin kullanıldığını varsayar. Bu nedenle, BTN_TOUCH, aracın yalnızca aralık içinde olduğunu ve fareyle üzerine gelindiğini belirtmek için kullanılmamalıdır.
  • Tek dokunuşlu cihazlar aşağıdaki Linux giriş etkinliklerini kullanır:
    • ABS_X: (ZORUNLU) Aracın X koordinatını bildirir.
    • ABS_Y: (ZORUNLU) Aracı Y koordinatını bildirir.
    • ABS_PRESSURE: (isteğe bağlı) Aracın ucuna uygulanan fiziksel basıncı veya dokunma temas noktasının sinyal gücünü bildirir.
    • ABS_TOOL_WIDTH: (isteğe bağlı) Dokunmatik kişinin veya aracın kendisinin kesit alanını ya da genişliğini bildirir.
    • ABS_DISTANCE: (isteğe bağlı) Araçla dokunmatik cihazın yüzeyi arasındaki mesafeyi bildirir.
    • ABS_TILT_X: (isteğe bağlı) Dokunmatik cihazın yüzeyine göre X ekseni boyunca aracın eğimini bildirir.
    • ABS_TILT_Y: (isteğe bağlı) Y ekseni boyunca dokunmatik cihazın yüzeyinden aracın eğimini bildirir.
    • BTN_TOUCH: (ZORUNLU) Aracın cihaza dokunup dokunmadığını belirtir.
    • BTN_LEFT, BTN_RIGHT, BTN_MIDDLE, BTN_BACK, BTN_SIDE, BTN_FORWARD, BTN_EXTRA, BTN_STYLUS, BTN_STYLUS2: (isteğe bağlı) Raporlar düğmesi durumları.
    • BTN_TOOL_FINGER, BTN_TOOL_PEN, BTN_TOOL_RUBBER, BTN_TOOL_BRUSH, BTN_TOOL_PENCIL, BTN_TOOL_AIRBRUSH, BTN_TOOL_MOUSE, BTN_TOOL_LENS, BTN_TOOL_DOUBLETAP, BTN_TOOL_TRIPLETAP, BTN_TOOL_QUADTAP: (isteğe bağlı) Araç türünü bildirir.
  • Çoklu dokunmatik cihazlar aşağıdaki Linux giriş etkinliklerini kullanır:
    • ABS_MT_POSITION_X: (ZORUNLU) Aracın X koordinatını bildirir.
    • ABS_MT_POSITION_Y: (ZORUNLU) Aracın Y koordinatını bildirir.
    • ABS_MT_PRESSURE: (isteğe bağlı) Aracın ucuna uygulanan fiziksel baskıyı veya dokunma temasının sinyal gücünü bildirir.
    • ABS_MT_TOUCH_MAJOR: (isteğe bağlı) Dokunma temasının enine kesit alanını veya dokunma temasının en uzun boyutunun uzunluğunu raporlar.
    • ABS_MT_TOUCH_MINOR: (isteğe bağlı) Dokunma temasının daha kısa boyutunun uzunluğunu bildirir. ABS_MT_TOUCH_MAJOR bir alan ölçümü raporluyorsa bu eksen kullanılmamalıdır.
    • ABS_MT_WIDTH_MAJOR: (isteğe bağlı) Aracın kesit alanını veya aracın daha uzun olan boyutunun uzunluğunu bildirir. Aracın boyutlarını bilmiyorsanız bu ekseni kullanmayın.
    • ABS_MT_WIDTH_MINOR: (isteğe bağlı) Aracın kısa boyutunun uzunluğunu bildirir. ABS_MT_WIDTH_MAJOR bir alan ölçümünü bildiriyorsa veya aracın boyutları bilinmiyorsa bu eksen kullanılmamalıdır.
    • ABS_MT_ORIENTATION: (isteğe bağlı) Aracın yönünü bildirir.
    • ABS_MT_DISTANCE: (isteğe bağlı) Aracın dokunmatik cihazın yüzeyine olan mesafesini bildirir.
    • ABS_MT_TOOL_TYPE: (isteğe bağlı) Aracı türünü MT_TOOL_FINGER veya MT_TOOL_PEN olarak bildirir.
    • ABS_MT_TRACKING_ID: (isteğe bağlı) Aracın izleme kimliğini bildirir. İzleme kimliği, birden fazla araç etkinken her aracı bağımsız olarak tanımlamak ve izlemek için kullanılan, sıfırdan büyük bir tam sayıdır. Örneğin, birden fazla parmak cihaza dokunduğunda her parmağa, parmak temas halinde kaldığı sürece kullanılan farklı bir izleme kimliği atanmalıdır. Takip kimlikleri, ilişkili araçlar kapsama alanı dışındayken yeniden kullanılabilir.
    • ABS_MT_SLOT: (isteğe bağlı) Linux çoklu dokunma protokolü "B" kullanılırken aracın alan kimliğini bildirir. Daha fazla bilgi için Linux çoklu dokunma protokolü dokümanlarını inceleyin.
    • BTN_TOUCH: (ZORUNLU) Aracın cihaza dokunup dokunmadığını gösterir.
    • BTN_LEFT, BTN_RIGHT, BTN_MIDDLE, BTN_BACK, BTN_SIDE, BTN_FORWARD, BTN_EXTRA, BTN_STYLUS, BTN_STYLUS2: (isteğe bağlı) Raporlar düğmesi durumları.
    • BTN_TOOL_FINGER, BTN_TOOL_PEN, BTN_TOOL_RUBBER, BTN_TOOL_BRUSH, BTN_TOOL_PENCIL, BTN_TOOL_AIRBRUSH, BTN_TOOL_MOUSE, BTN_TOOL_LENS, BTN_TOOL_DOUBLETAP, BTN_TOOL_TRIPLETAP, BTN_TOOL_QUADTAP: (isteğe bağlı) Araç türünü bildirir.
  • Hem tek dokunma hem de çoklu dokunma protokolü için eksenler tanımlanırsa yalnızca çoklu dokunma eksenleri kullanılır ve tek dokunma eksenleri yoksayılır.
  • ABS_X, ABS_Y, ABS_MT_POSITION_X ve ABS_MT_POSITION_Y eksenlerinin minimum ve maksimum değerleri, cihaza özgü yüzey birimlerinde cihazın etkin alanının sınırlarını tanımlar. Dokunmatik ekranlarda etkin alan, dokunmatik cihazın ekranı kaplayan kısmını tanımlar.

    Dokunmatik ekranlarda sistem, ekran piksellerindeki dokunma konumlarını elde etmek için raporlanan dokunma konumlarını yüzey birimlerinde otomatik olarak enterpolasyon yapar. Bu işlem aşağıdaki hesaplamaya göre yapılır:

        displayX = (x - minX) * displayWidth / (maxX - minX + 1)
        displayY = (y - minY) * displayHeight / (maxY - minY + 1)
        

    Dokunmatik ekran, bildirilen etkin alanın dışındaki dokunmaları bildirebilir.

    Etkin alanın dışında başlatılan dokunuşlar uygulamalara iletilmez ancak sanal anahtarlar için kullanılabilir.

    Etkin alanda başlatılan veya görüntüleme alanına girip çıkan dokunuşlar uygulamalara iletilir. Sonuç olarak, bir dokunma bir uygulamanın sınırları içinde başlar ve ardından etkin alanın dışına taşınırsa uygulama, negatif veya ekranın sınırları dışında olan ekran koordinatlarına sahip dokunma etkinlikleri alabilir. Bu, beklenen bir durumdur.

    Dokunmatik cihazlar, dokunma koordinatlarını hiçbir zaman etkin alanın sınırlarına sıkıştırmamalıdır. Bir dokunma eylemi etkin alandan çıkarsa bunun etkin alanın dışında olduğu bildirilmeli veya hiç bildirilmemelidir.

    Örneğin, kullanıcının parmağı dokunmatik ekranın sol üst köşesine yakın bir yerdeyse (minX, minY) koordinatı bildirilebilir. Parmak etkin alanın dışına doğru hareket etmeye devam ederse dokunmatik ekran, minX ve minY'den daha düşük bileşenlere sahip koordinatları (ör. minX - 2, minY - 3) bildirmeye başlamalı veya dokunma bildirimini tamamen durdurmalıdır. Diğer bir deyişle, kullanıcının parmağı etkin alanın dışına gerçekten dokunduğunda dokunmatik ekran bunu bildirmemelidir (minX, minY).

    Dokunma koordinatlarının görüntü kenarına sabitlenmesi, ekranın kenarında yapay bir sert sınır oluşturur. Bu durum, sistemin, görüntüleme alanının sınırlarına giren veya bu sınırlardan çıkan hareketleri sorunsuz bir şekilde izlemesini engeller.

  • ABS_PRESSURE veya ABS_MT_PRESSURE tarafından raporlanan değerler (raporlanıyorlarsa) araç cihaza dokunuyorsa sıfırdan farklı, araç fareyle üzerine gelindiğinde ise sıfır olmalıdır.

    Basınç bilgilerini bildirmek isteğe bağlıdır ancak kesinlikle önerilir. Uygulamalar, basınca duyarlı çizim ve diğer efektleri uygulamak için basınç bilgilerini kullanabilir.

  • ABS_TOOL_WIDTH, ABS_MT_TOUCH_MAJOR, ABS_MT_TOUCH_MINOR, ABS_MT_WIDTH_MAJOR veya ABS_MT_WIDTH_MINOR tarafından bildirilen değerler, araç cihaza dokunduğunda sıfırdan farklı, aksi takdirde sıfır olmalıdır ancak bu gerekli değildir. Örneğin, dokunmatik cihaz parmakla dokunulan kişilerin boyutunu ölçebilir, ancak ekran kalemini dokunan kişilerin boyutunu ölçemeyebilir.

    Raporlama boyut bilgileri isteğe bağlıdır ancak kesinlikle önerilir. Uygulamalar, boyuta duyarlı çizim ve diğer efektleri uygulamak için basınç bilgilerini kullanabilir.

  • ABS_DISTANCE veya ABS_MT_DISTANCE tarafından bildirilen değerler, alet cihaza dokunduğunda sıfıra yaklaşmalıdır. Araç doğrudan temas halindeyken bile mesafe sıfırdan farklı olabilir. Bildirilen tam değerler, donanımın mesafeyi ölçme şekline bağlıdır.

    Mesafe bilgilerini bildirme isteğe bağlıdır ancak ekran kalemi kullanan cihazlar için önerilir.

  • Araç cihaza dik olduğunda ABS_TILT_X ve ABS_TILT_Y tarafından bildirilen değerler sıfır olmalıdır. Eğim sıfırdan farklıysa aracın eğimli bir şekilde tutulduğu

    X ve Y eksenleri boyunca yatırma açılarının dik açıdan derece cinsinden belirtildiği varsayılır. Merkez noktası (tam olarak dik), her eksen için (max + min) / 2 ile belirtilir. Merkez noktadan daha küçük değerler yukarı veya sola, merkez noktadan daha büyük değerler ise aşağı veya sağa eğilme anlamına gelir.

    InputReader, X ve Y eğim bileşenlerini 0 ile PI / 2 radyan arasında değişen dik bir eğim açısına ve -PI ile PI radyan arasında değişen düzlemsel bir yönelim açısına dönüştürür. Bu temsil, parmak dokunuşlarını açıklamak için kullanılanla uyumlu bir oryantasyon açıklamasıyla sonuçlanır.

    Eğilme bilgilerini bildirmek isteğe bağlıdır ancak ekran kalemi kullanan cihazlar için önerilir.

  • Araç türü ABS_MT_TOOL_TYPE tarafından raporlanırsa BTN_TOOL_* tarafından raporlanan tüm araç türü bilgilerinin yerini alır. Hiçbir alet türü bilgisi yoksa alet türü varsayılan olarak MotionEvent.TOOL_TYPE_FINGER olur.

  • Bir aracın etkin olup olmadığı aşağıdaki koşullara göre belirlenir:

    • Tek dokunma protokolü kullanılırken BTN_TOUCH veya BTN_TOOL_* 1 ise araç etkindir.

      Bu koşul, InputReader'ün, dokunup dokunmadığı veya en azından araç türü hakkında en azından bazı bilgilere sahip olması gerektiği anlamına gelir. Hiçbir bilgi yoksa aracın devre dışı olduğu (aralık dışında) varsayılır.

    • "A" çoklu dokunma protokolü kullanıldığında, en son senkronizasyon raporunda göründüğü her zaman araç etkindir. Araç, senkronizasyon raporlarında görünmeyi bıraktığında kullanımdan kaldırılır.
    • "B" çoklu dokunma protokolü kullanıldığında, etkin bir yuvasına sahip olduğu sürece araç etkindir. Yuva açıldığında araç kaldırılır.
  • Bir aracın fareyle üzerine gelindiği belirlenirken aşağıdaki koşullar temel alınır:
    • Araç BTN_TOOL_MOUSE veya BTN_TOOL_LENS ise aşağıdaki koşullardan biri doğru olsa bile araç fareyle üzerine getirilmemiştir.
    • Araç etkinse ve sürücü basınç bilgilerini raporluyorsa ve raporlanan basınç sıfırsa araç havadadır.
    • Araç etkinse ve sürücü BTN_TOUCH anahtar kodunu destekliyorsa ve BTN_TOUCH değeri sıfır ise araç fareyle üzerine geliyordur.
  • InputReader hem "A" hem de "B" çoklu dokunma protokolünü destekler. Yeni sürücülerin "B" protokolünü kullanması gerekir ancak ikisi de çalışır.
  • Android 4.0'tan itibaren, dokunmatik ekran sürücülerinin Linux giriş protokolü spesifikasyonuna uyması için değiştirilmesi gerekebilir.

    Aşağıdaki değişiklikler gerekebilir:

    • Bir araç etkin olmadığında (parmak "yukarı" gider) sonraki çoklu dokunma senkronizasyon raporlarında görünmez. Tüm araçlar devre dışı kaldığında (tüm parmaklar "yukarı" açıldığında) sürücü boş bir senkronizasyon raporu paketi göndermelidir (ör. SYN_MT_REPORT ve ardından SYN_REPORT).

      Android'in önceki sürümlerinde, "yukarı" etkinliklerinin 0 basınç değeri gönderilerek raporlanması bekleniyordu. Eski davranış, Linux giriş protokolü spesifikasyonuyla uyumlu değildi ve artık desteklenmemektedir.

    • Fiziksel baskı veya sinyal gücü bilgileri ABS_MT_PRESSURE kullanılarak bildirilmelidir.

      Android'in önceki sürümleri, basınç bilgilerini ABS_MT_TOUCH_MAJOR'ten alıyordu. Eski davranış, Linux giriş protokolü spesifikasyonuyla uyumlu değildi ve artık desteklenmiyor.

    • Dokunma boyutu bilgileri ABS_MT_TOUCH_MAJOR kullanılarak raporlanmalıdır.

      Android'in önceki sürümleri, boyut bilgilerini ABS_MT_TOOL_MAJOR kaynağından alıyordu. Eski davranış, Linux giriş protokolü spesifikasyonuyla uyumlu değildi ve artık desteklenmiyor.

    Dokunmatik cihaz sürücüleri artık Android'e özel özelleştirmelere ihtiyaç duymuyor. Android, standart Linux giriş protokolüne dayanarak, değiştirilmemiş sürücüleri kullanarak harici HID çoklu dokunmatik ekranlar gibi daha fazla dokunmatik çevre birimi destekleyebilir.

Dokunmatik cihaz işlemi

Aşağıda, Android'deki dokunmatik cihaz işleminin kısa bir özeti verilmiştir.

  1. EventHub, evdev sürücüsünden ham etkinlikleri okur.
  2. InputReader, ham etkinlikleri tüketir ve her aracın konumu ve diğer özellikleriyle ilgili dahili durumu günceller. Ayrıca düğme durumlarını da izler.
  3. GERİ veya İLERİ düğmesine basıldıysa ya da düğme bırakıldıysa InputReader, InputDispatcher'i önemli etkinlik hakkında bilgilendirir.
  4. InputReader, sanal bir tuşa basma işleminin yapılıp yapılmadığını belirler. Bu durumda, InputDispatcher'ü önemli etkinlik hakkında bilgilendirir.
  5. InputReader, dokunmanın ekranın sınırları içinde başlatılıp başlatılmadığını belirler. Bu durumda InputDispatcher uygulamasını dokunma etkinliğiyle ilgili olarak bilgilendirir.
  6. Dokunma aracı yoksa ancak en az bir fareyle üzerine gelme aracı varsa InputReader, fareyle üzerine gelme etkinliği hakkında InputDispatcher'i bilgilendirir.
  7. Dokunma cihazı türü işaretçi ise InputReader, işaretçi hareketi algılar, işaretçiyi ve noktaları buna göre hareket ettirir ve InputDispatcher'ı işaretçi etkinliği hakkında bilgilendirir.
  8. InputDispatcher, etkinliklerin gönderilip gönderilmeyeceğini ve cihazı uyandırıp uyandırmayacağını belirlemek için WindowManagerPolicy kullanır. Ardından InputDispatcher, etkinlikleri uygun uygulamalara yayınlar.

Dokunmatik cihaz yapılandırması

Dokunmatik cihaz davranışı, cihazın eksenleri, düğmeleri, giriş özellikleri, giriş cihazı yapılandırması, sanal tuş haritası ve tuş düzenine göre belirlenir.

Klavye yapılandırmasında yer alan dosyalar hakkında daha fazla bilgi için aşağıdaki bölümlere bakın:

Özellikler

Sistem, dokunmatik cihaz davranışını yapılandırmak ve kalibre etmek için birçok giriş cihazı yapılandırma özelliğinden yararlanır.

Bunun bir nedeni, dokunmatik cihazların cihaz sürücülerinin genellikle dokunma özelliklerini cihaza özgü birimler kullanarak bildirmesidir.

Örneğin, birçok dokunmatik cihaz, dokunma temas alanını cihaza özgü bir ölçek kullanarak ölçer (ör. dokunma ile tetiklenen sensör düğümlerinin toplam sayısı). Bu ham boyut değeri, dokunmatik cihaz sensör düğümlerinin fiziksel boyutu ve diğer özellikleri hakkında bilgi sahibi olmaları gerektiğinden uygulamalar için anlamlı olmaz.

Sistem, dokunmatik cihaz tarafından raporlanan değerlerin kodunu çözmek, dönüştürmek ve normalleştirmek için giriş cihazı yapılandırma dosyalarında kodlanmış kalibrasyon parametrelerini kullanır. Bu değerler, uygulamaların anlayabileceği daha basit bir standart temsile dönüştürülür.

Belgeleme kuralları

Belgelendirme amacıyla, kalibrasyon işlemi sırasında sistem tarafından kullanılan değerleri açıklamak için aşağıdaki kuralları kullanırız.

Ham eksen değerleri

Aşağıdaki ifadeler, dokunmatik cihaz sürücüsü tarafından EV_ABS etkinlikleri olarak bildirilen ham değerleri gösterir.

raw.x
ABS_X veya ABS_MT_POSITION_X ekseninin değeri.
raw.y
ABS_Y veya ABS_MT_POSITION_Y ekseninin değeri.
raw.pressure
ABS_PRESSURE veya ABS_MT_PRESSURE ekseninin değeri ya da mevcut değilse 0.
raw.touchMajor
ABS_MT_TOUCH_MAJOR ekseninin değeri veya mevcut değilse 0.
raw.touchMinor
ABS_MT_TOUCH_MINOR ekseninin değeri veya yoksa raw.touchMajor.
raw.toolMajor
ABS_TOOL_WIDTH veya ABS_MT_WIDTH_MAJOR ekseninin değeri ya da mevcut değilse 0.
raw.toolMinor
ABS_MT_WIDTH_MINOR ekseninin değeri veya yoksa raw.toolMajor.
raw.orientation
ABS_MT_ORIENTATION ekseninin değeri veya mevcut değilse 0.
raw.distance
ABS_DISTANCE veya ABS_MT_DISTANCE ekseninin değeri ya da mevcut değilse 0.
raw.tiltX
ABS_TILT_X ekseninin değeri veya mevcut değilse 0.
raw.tiltY
ABS_TILT_Y ekseninin değeri veya mevcut değilse 0.

Ham eksen aralıkları

Aşağıdaki ifadeler, işlenmemiş değerlerin sınırlarını gösterir. Bu metrikler, her bir eksen için EVIOCGABS ioctl çağrısı yapılarak elde edilir.

raw.*.min
Ham eksenin dahili minimum değeri.
raw.*.max
Ham eksenin kapsayıcı maksimum değeri.
raw.*.range
raw.*.max - raw.*.min etiketine eş değer.
raw.*.fuzz
Ham eksenin doğruluğu. Örneğin fuzz = 1, değerlerin +/- 1 birime doğru olduğunu gösterir.
raw.width
Dokunma alanının kapsayıcı genişliğidir (raw.x.range + 1 ile aynıdır).
raw.height
Dokunma alanının toplam yüksekliği (raw.y.range + 1 ile eşdeğerdir).

Çıkış aralıkları

Aşağıdaki ifadeler, çıkış koordinat sisteminin özelliklerini belirtir. Sistem, dokunmatik cihaz tarafından kullanılan yüzey birimlerinden dokunma konumu bilgilerini, ekran pikselleri gibi uygulamalara bildirilen çıkış birimlerine dönüştürmek için doğrusal interpolasyon kullanır.

output.width
Çıkış genişliği. Dokunmatik ekranlar (bir ekranla ilişkili) için bu, piksel cinsinden ekran genişliğidir. Dokunmatik alanlar için (ekranla ilişkili olmayan) çıkış genişliği, raw.width değerine eşittir. Bu, hiçbir interpolasyon işlemi yapılmadığını gösterir.
output.height
Çıkış yüksekliği. Dokunmatik ekranlar (bir ekranla ilişkili) için bu, ekranın piksel cinsinden yüksekliğidir. Dokunmatik yüzeyler (bir ekranla ilişkili değil) için çıkış yüksekliği raw.height'e eşittir. Bu, hiçbir enterpolasyonun yapılmadığını gösterir.
output.diag
Çıkış koordinat sisteminin köşegen uzunluğudur (sqrt(output.width ^2 + output.height ^2)'e eşittir).

Temel yapılandırma

Dokunmatik giriş eşleyici, kalibrasyon değerlerini belirtmek için giriş cihazı yapılandırma dosyasında birçok yapılandırma özelliği kullanır. Aşağıdaki tabloda bazı genel amaçlı yapılandırma özellikleri açıklanmaktadır. Diğer tüm özellikler, kalibre etmek için kullanıldıkları alanlarla birlikte aşağıdaki bölümlerde açıklanmaktadır.

touch.deviceType

Tanım: touch.deviceType = touchScreen | touchPad | pointer | default

Dokunmatik cihaz türünü belirtir.

  • Değer touchScreen ise dokunmatik cihaz, ekranla ilişkilendirilmiş bir dokunmatik ekrandır.

  • Değer touchPad ise dokunmatik cihaz, ekranla ilişkili olmayan bir dokunmatik

  • Değer pointer ise dokunmatik cihaz, bir ekranla ilişkilendirilmemiş dokunmatik alan olur ve hareketleri dolaylı, çok noktalı işaretleyici hareketleri için kullanılır.

  • Değer default ise sistem, cihaz türünü sınıflandırma algoritmasına göre otomatik olarak algılar.

Cihaz türünün dokunmatik cihazın davranışını nasıl etkilediği hakkında daha fazla bilgi için Sınıflandırma bölümüne bakın.

Android 3 ve önceki sürümlerde tüm dokunmatik cihazların dokunmatik ekran olduğu varsayılır.

touch.orientationAware

Tanım: touch.orientationAware = 0 | 1

Dokunmatik cihazın, ekran yönü değişikliklerine tepki verip vermeyeceğini belirtir.

  • Değer 1 ise dokunmatik cihaz tarafından bildirilen dokunma konumları, ekran yönü her değiştiğinde döndürülür.

  • Değer 0 ise dokunmatik cihaz tarafından raporlanan dokunma konumları, ekran yönünde yapılan değişikliklerden etkilenmez.

Cihaz dokunmatik ekran ise varsayılan değer 1, aksi takdirde 0'tır.

Sistem, dahili ve harici dokunmatik ekranlar ile ekranları birbirinden ayırt eder. Yöne duyarlı dahili dokunmatik ekran, dahili ekranın yönüne göre döndürülür. Yöne duyarlı harici dokunmatik ekran, harici ekranın yönüne göre döndürülür.

Yön farkındalığı, Nexus One gibi cihazlarda dokunmatik ekranların döndürülmesini desteklemek için kullanılır. Örneğin, cihaz doğal yöneliminden saat yönünde 90 derece döndürüldüğünde, dokunmaların mutlak konumları yeniden eşlenir. Böylece, dokunmatik ekranın mutlak koordinat sisteminin sol üst köşesindeki bir dokunma, ekranın döndürülmüş koordinat sisteminin sol üst köşesindeki bir dokunma olarak raporlanır. Bu, dokunmaların uygulamaların görsel öğelerini çizmek için kullandığı koordinat sistemiyle raporlanması için yapılır.

Honeycomb'den önce tüm dokunmatik cihazların yönü algılayabildiği varsayılıyordu.

touch.gestureMode

Tanım: touch.gestureMode = pointer | spots | default

İşaretçi hareketleri için sunu modunu belirtir. Bu yapılandırma özelliği yalnızca dokunmatik cihaz işaretçi türünde olduğunda geçerlidir.

  • Değer pointer ise dokunmatik yüzey hareketleri, fare işaretçisine benzer bir imleçle sunulur.

  • Değer spots ise dokunmatik yüzey hareketleri, hareketin ağırlık merkezini temsil eden bir ankraj ve parmakların konumunu temsil eden bir dizi dairesel noktayla gösterilir.

INPUT_PROP_SEMI_MT giriş özelliği ayarlandığında varsayılan değer pointer, aksi takdirde spots olur.

X ve Y alanları

X ve Y alanları, temas alanının merkezi için konum bilgisi sağlar.

Hesaplama

Hesaplama basittir: Dokunmatik sürücüden gelen konum bilgileri, çıkış koordinat sistemine doğrusal olarak ara yerleştirilir.

xScale = output.width / raw.width
yScale = output.height / raw.height

If not orientation aware or screen rotation is 0 degrees:
output.x = (raw.x - raw.x.min) * xScale
output.y = (raw.y - raw.y.min) * yScale
Else If rotation is 90 degrees:
    output.x = (raw.y - raw.y.min) * yScale
    output.y = (raw.x.max - raw.x) * xScale
Else If rotation is 180 degrees:
    output.x = (raw.x.max - raw.x) * xScale
    output.y = (raw.y.max - raw.y) * yScale
Else If rotation is 270 degrees:
    output.x = (raw.y.max - raw.y) * yScale
    output.y = (raw.x - raw.x.min) * xScale
End If

TouchMajor, TouchMinor, toolMajor, toolMinor, boyut alanları

touchMajor ve touchMinor alanları, temas alanının çıkış birimlerindeki (piksel) yaklaşık boyutlarını tanımlar.

toolMajor ve toolMinor alanları, aracı kendisinin çıkış birimlerindeki (piksel) yaklaşık boyutlarını tanımlar.

size alanı, dokunma cihazının algılayabileceği en büyük dokunmaya göre dokunmanın normalleştirilmiş boyutunu açıklar. Olası en küçük normalleştirilmiş boyut 0, 0'dır (temas yok veya ölçülemez) ve olası en büyük normalleştirilmiş boyut 1,0'dur (sensör alanı doymuştur).

Hem yaklaşık uzunluk hem de genişlik ölçülebilir olduğunda touchMajor alanı temas alanının daha uzun boyutunu, touchMinor alanı ise daha kısa boyutunu belirtir. İletişim alanının yalnızca yaklaşık çapı ölçülebiliyorsa touchMajor ve touchMinor alanları eşit olur.

Benzer şekilde, toolMajor alanı aracın enine kesit alanının uzun boyutunu, toolMinor alanı ise kısa boyutunu belirtir.

Dokunma boyutu kullanılamıyorsa ancak araç boyutu kullanılabiliyorsa araç boyutu, dokunma boyutuna eşit olarak ayarlanır. Buna karşılık, araç boyutu kullanılamıyorsa ancak dokunma boyutu kullanılabiliyorsa dokunma boyutu, araç boyutuna eşit olarak ayarlanır.

Dokunmatik cihazlar, dokunma boyutunu ve araç boyutunu çeşitli şekillerde ölçer veya raporlar. Mevcut uygulama, üç farklı ölçüm türünü desteklemektedir: yüzey birimlerindeki çap, alan ve geometrik sınırlayıcı kutu.

Tanım: touch.size.calibration = none | geometric | diameter | area | default

Dokunma boyutunu ve araç boyutunu bildirmek için dokunma sürücüsü tarafından kullanılan ölçüm türünü belirtir.

  • Değer none ise boyut sıfır olarak ayarlanır.

  • Değer geometric ise boyutun, konumla aynı yüzey birimlerinde belirtildiği varsayılır. Bu nedenle, boyut aynı şekilde ölçeklendirilir.

  • Değer diameter ise boyutun, dokunulan veya aracın çapı (genişliği) ile orantılı olduğu varsayılır.

  • Değer area ise boyutun, dokunma veya aracın alanına orantılı olduğu varsayılır.

  • Değer default ise raw.touchMajor veya raw.toolMajor ekseni kullanılabiliyorsa sistem geometric kalibrasyonunu kullanır, aksi takdirde none kalibrasyonunu kullanır.

touch.size.scale

Tanım: touch.size.scale = <negatif olmayan kayan nokta sayısı>

Kalibrasyonda kullanılan sabit bir ölçeklendirme faktörünü belirtir.

Varsayılan değer: 1.0.

dokunma.size.bias

Tanım: touch.size.bias = <pozitif olmayan kayan nokta sayısı>

Kalibrasyonda kullanılan sabit bir önyargı değerini belirtir.

Varsayılan değer: 0.0.

touch.size.isSummed

Tanım: touch.size.isSummed = 0 | 1

Boyutun, tüm etkin kişilerin boyutlarının toplamı olarak mı yoksa her kişi için ayrı ayrı mı raporlandığını belirtir.

  • Değer 1 ise bildirilen boyut, kullanımdan önceki kişi sayısına bölünür.

  • Değer 0 ise raporlanan boyut olduğu gibi kullanılır.

Varsayılan değer: 0.

Bazı dokunmatik cihazlar (özellikle "Yarı MT" cihazlar) birden fazla temas noktasının boyutlarını ayırt edemediğinden, toplam alanlarını veya genişliklerini temsil eden bir boyut ölçümü raporlar. Bu özellik yalnızca bu tür cihazlar için 1 olarak ayarlanmalıdır. Emin değilseniz bu değeri 0 olarak ayarlayın.

Hesaplama

touchMajor, touchMinor, toolMajor, toolMinor ve size alanlarının hesaplanması, belirtilen kalibrasyon parametrelerine bağlıdır.

If raw.touchMajor and raw.toolMajor are available:
    touchMajor = raw.touchMajor
    touchMinor = raw.touchMinor
    toolMajor = raw.toolMajor
    toolMinor = raw.toolMinor
Else If raw.touchMajor is available:
    toolMajor = touchMajor = raw.touchMajor
    toolMinor = touchMinor = raw.touchMinor
Else If raw.toolMajor is available:
    touchMajor = toolMajor = raw.toolMajor
    touchMinor = toolMinor = raw.toolMinor
Else
    touchMajor = toolMajor = 0
    touchMinor = toolMinor = 0
    size = 0
End If

size = avg(touchMajor, touchMinor)

If touch.size.isSummed == 1:
    touchMajor = touchMajor / numberOfActiveContacts
    touchMinor = touchMinor / numberOfActiveContacts
    toolMajor = toolMajor / numberOfActiveContacts
    toolMinor = toolMinor / numberOfActiveContacts
    size = size / numberOfActiveContacts
End If

If touch.size.calibration == "none":
    touchMajor = toolMajor = 0
    touchMinor = toolMinor = 0
    size = 0
Else If touch.size.calibration == "geometric":
    outputScale = average(output.width / raw.width, output.height / raw.height)
    touchMajor = touchMajor * outputScale
    touchMinor = touchMinor * outputScale
    toolMajor = toolMajor * outputScale
    toolMinor = toolMinor * outputScale
Else If touch.size.calibration == "area":
    touchMajor = sqrt(touchMajor)
    touchMinor = touchMajor
    toolMajor = sqrt(toolMajor)
    toolMinor = toolMajor
Else If touch.size.calibration == "diameter":
    touchMinor = touchMajor
    toolMinor = toolMajor
End If

If touchMajor != 0:
    output.touchMajor = touchMajor * touch.size.scale + touch.size.bias
Else
    output.touchMajor = 0
End If

If touchMinor != 0:
    output.touchMinor = touchMinor * touch.size.scale + touch.size.bias
Else
    output.touchMinor = 0
End If

If toolMajor != 0:
    output.toolMajor = toolMajor * touch.size.scale + touch.size.bias
Else
    output.toolMajor = 0
End If

If toolMinor != 0:
    output.toolMinor = toolMinor * touch.size.scale + touch.size.bias
Else
    output.toolMinor = 0
End If

output.size = size

basınç alanı

pressure alanında, dokunmatik cihaza uygulanan yaklaşık fiziksel basınç 0,0 (dokunma yok) ile 1,0 (normal basınç) arasında normalleştirilmiş bir değer olarak tanımlanır.

Sıfır basınç, aracın imleci üzerinde olduğunu gösterir.

touch.pressure.calibration

Tanım: touch.pressure.calibration = none | physical | amplitude | default

Basıncı bildirmek için dokunmatik sürücü tarafından kullanılan ölçüm türünü belirtir.

  • Değer none ise basınç bilinmediği için dokunulduğunda 1,0 ve fareyle üzerine gelindiğinde 0,0 olarak ayarlanır.

  • Değer physical ise basınç ekseninin, dokunmatik yüzeye uygulanan basıncın gerçek fiziksel yoğunluğunu ölçtüğü varsayılır.

  • Değer amplitude ise basınç ekseninin, temasın boyutu ve uygulanan basınçla ilgili olan sinyal genliğini ölçtüğü varsayılır.

  • Değer default ise sistem, basınç ekseni mevcutsa physical kalibrasyonunu, aksi takdirde none kalibrasyonunu kullanır.

touch.pressure.scale

Tanım: touch.pressure.scale = <pozitif olmayan kayan nokta sayısı>

Kalibrasyonda kullanılan sabit ölçek faktörünü belirtir.

Varsayılan değer: 1.0 / raw.pressure.max.

Hesaplama

pressure alanının hesaplanması, belirtilen kalibrasyon parametrelerine bağlıdır.

If touch.pressure.calibration == "physical" or "amplitude":
    output.pressure = raw.pressure * touch.pressure.scale
Else
    If hovering:
        output.pressure = 0
    Else
        output.pressure = 1
    End If
End If

yön ve yatırma alanları

orientation alanı, dokunma ve aracın yönünü açısal ölçüm olarak tanımlar. 0 yönü, ana eksenin dikey olduğunu, -PI/2 yönü ana eksenin sola, PI/2 yönü ise ana eksenin sağa yönlendirildiğini gösterir. Bir ekran kalemi aracı mevcut olduğunda, yön aralığı -PI veya PI'ten başlayarak tam bir daire aralığında açıklanabilir.

tilt alanı, aracın eğimini açısal ölçüm olarak tanımlar. 0 eğimi, aracın yüzeye dik olduğunu gösterir. PI/2 eğimi, aletin yüzeye düz bir şekilde yerleştirildiğini gösterir.

dokunma.yüzden.kalibrasyon

Tanım: touch.orientation.calibration = none | interpolated | vector | default

Yönlendirmeyi bildirmek için dokunmatik sürücü tarafından kullanılan ölçüm türünü belirtir.

  • Değer none ise yön bilinmediği için 0 olarak ayarlanır.
  • Değer interpolated ise oryantasyon, raw.orientation.min ham değerinin -PI/2 ile, raw.orientation.max ham değerinin ise PI/2 ile eşleşeceği şekilde doğrusal olarak aralanır. (raw.orientation.min + raw.orientation.max) / 2 değerinin orta değeri 0 ile eşlenir.
  • Değer vector ise yön, iki imzalı 4 bit alandan oluşan paketlenmiş bir vektör olarak yorumlanır. Bu gösterim, Atmel Nesne Tabanlı Protokol bölümlerinde kullanılır. Kod çözüldüğünde, vektör bir yön açısı ve güven büyüklüğü verir. Güven düzeyi, geometrik olmadığı sürece boyut bilgilerini ölçeklendirmek için kullanılır.
  • Değer default ise sistem, yön ekseni mevcutsa interpolated kalibrasyonunu, aksi takdirde none değerini kullanır.

Hesaplama

orientation ve tilt alanlarının hesaplanması, belirtilen kalibrasyon parametrelerine ve mevcut girişe bağlıdır.

If touch.tiltX and touch.tiltY are available:
    tiltXCenter = average(raw.tiltX.min, raw.tiltX.max)
    tiltYCenter = average(raw.tiltY.min, raw.tiltY.max)
    tiltXAngle = (raw.tiltX - tiltXCenter) * PI / 180
    tiltYAngle = (raw.tiltY - tiltYCenter) * PI / 180
    output.orientation = atan2(-sin(tiltXAngle), sinf(tiltYAngle))
    output.tilt = acos(cos(tiltXAngle) * cos(tiltYAngle))
Else If touch.orientation.calibration == "interpolated":
    center = average(raw.orientation.min, raw.orientation.max)
    output.orientation = PI / (raw.orientation.max - raw.orientation.min)
    output.tilt = 0
Else If touch.orientation.calibration == "vector":
    c1 = (raw.orientation & 0xF0) >> 4
    c2 = raw.orientation & 0x0F

    If c1 != 0 or c2 != 0:
        If c1 >= 8 Then c1 = c1 - 16
        If c2 >= 8 Then c2 = c2 - 16
        angle = atan2(c1, c2) / 2
        confidence = sqrt(c1*c1 + c2*c2)

        output.orientation = angle

        If touch.size.calibration == "diameter" or "area":
            scale = 1.0 + confidence / 16
            output.touchMajor *= scale
            output.touchMinor /= scale
            output.toolMajor *= scale
            output.toolMinor /= scale
        End If
    Else
        output.orientation = 0
    End If
    output.tilt = 0
Else
    output.orientation = 0
    output.tilt = 0
End If

If orientation aware:
    If screen rotation is 90 degrees:
        output.orientation = output.orientation - PI / 2
    Else If screen rotation is 270 degrees:
        output.orientation = output.orientation + PI / 2
    End If
End If

mesafe alanı

distance alanı, araç ile dokunmatik cihaz yüzeyi arasındaki mesafeyi açıklar. 0,0 değeri doğrudan teması, daha yüksek değerler ise yüzeyden uzaklaşmayı gösterir.

touch.distance.calibration

Tanım: touch.distance.calibration = none | scaled | default

Mesafeyi bildirmek için dokunmatik sürücü tarafından kullanılan ölçüm türünü belirtir.

  • Değer none ise mesafe bilinmediği için 0 olarak ayarlanır.

  • Değer scaled ise bildirilen mesafe, sabit bir ölçek faktörüyle çarpılır.

  • Değer default ise sistem, mesafe ekseni mevcutsa scaled kalibrasyonunu, aksi takdirde none kalibrasyonunu kullanır.

touch.distance.scale

Tanım: touch.distance.scale = <pozitif olmayan kayan nokta sayısı>

Kalibrasyonda kullanılan sabit bir ölçeklendirme faktörünü belirtir.

Varsayılan değer: 1.0.

Hesaplama

distance alanının hesaplanması, belirtilen kalibrasyon parametrelerine bağlıdır.

If touch.distance.calibration == "scaled":
    output.distance = raw.distance * touch.distance.scale
Else
    output.distance = 0
End If

Örnek

# Input device configuration file for a touch screen that supports pressure,
# size and orientation. The pressure and size scale factors were obtained
# by measuring the characteristics of the device itself and deriving
# useful approximations based on the resolution of the touch sensor and the
# display.
#
# Note that these parameters are specific to a particular device model.
# Different parameters need to be used for other devices.

# Basic Parameters
touch.deviceType = touchScreen
touch.orientationAware = 1

# Size
# Based on empirical measurements, we estimate the size of the contact
# using size = sqrt(area) * 28 + 0.
touch.size.calibration = area
touch.size.scale = 28
touch.size.bias = 0
touch.size.isSummed = 0

# Pressure
# Driver reports signal strength as pressure.
#
# A normal index finger touch typically registers about 80 signal strength
# units although we don't expect these values to be accurate.
touch.pressure.calibration = amplitude
touch.pressure.scale = 0.0125

# Orientation
touch.orientation.calibration = vector

Uyumluluk notları

Android Ice Cream Sandwich 4.0'ta dokunmatik cihazların yapılandırma özellikleri önemli ölçüde değişti. Dokunmatik cihazlara ait tüm giriş cihazı yapılandırma dosyaları, yeni yapılandırma özelliklerini kullanacak şekilde güncellenmelidir.

Eski dokunmatik cihaz sürücülerinin de güncellenmesi gerekebilir.

Sanal tuş eşleme dosyaları

Dokunmatik cihazlar, sanal tuşlar uygulamak için kullanılabilir.

Dokunmatik kontrol cihazının özelliklerine bağlı olarak bunu yapmanın birkaç yolu vardır. Bazı dokunmatik kontrolörler, donanım yazılımı kayıtlarını ayarlayarak doğrudan yumuşak tuşlar uygulamak üzere yapılandırılabilir. Bazen de dokunma koordinatlarını anahtar kodlarıyla eşleştirme işleminin yazılımda yapılması istenir.

Sanal anahtarlar yazılıma uygulandığında çekirdek, virtualkeys.<devicename> adlı bir sanal anahtar haritası dosyasını kart mülkü olarak dışa aktarmalıdır. Örneğin, dokunmatik ekran cihaz sürücüleri, adını "touchyfeely" olarak bildiriyorsa sanal anahtar eşleme dosyası /sys/board_properties/virtualkeys.touchyfeely yolunu içermelidir.

Sanal tuş haritası dosyası, dokunmatik ekrandaki sanal tuşların koordinatlarını ve Linux tuş kodlarını açıklar.

Sanal tuş haritası dosyasına ek olarak, Linux tuş kodlarını Android tuş kodlarıyla eşlemek ve klavye cihazının türünü (genellikle SPECIAL_FUNCTION) belirtmek için ilgili bir tuş düzeni dosyası ve tuş karakter haritası dosyası olmalıdır.

Sözdizimi

Sanal anahtar haritası dosyası, yeni satır veya iki nokta işareti ile ayrılmış bir dizi sanal anahtar düzeni açıklamasından oluşan düz metin dosyasıdır.

Yorum satırları "#" ile başlar ve satırın sonuna kadar devam eder.

Her sanal anahtar, iki nokta işaretiyle ayrılmış 6 bileşenle açıklanır:

  • 0x01: Sürüm kodu. Her zaman 0x01 olmalıdır.
  • <Linux anahtar kodu>: Sanal anahtarın Linux anahtar kodu.
  • <centerX>: Sanal anahtarın ortasının X piksel koordinatı.
  • <centerY>: Sanal anahtarın merkezinin Y piksel koordinatı.
  • <width>: Sanal anahtarın piksel cinsinden genişliği.
  • <height>: Sanal anahtarın piksel cinsinden yüksekliği.

Tüm koordinatlar ve boyutlar, görüntü koordinat sistemi açısından belirtilir.

Burada, tamamı tek satırda yazılmış sanal bir anahtar eşleme dosyası gösterilmektedir.

# All on one line
0x01:158:55:835:90:55:0x01:139:172:835:125:55:0x01:102:298:835:115:55:0x01:217:412:835:95:55

Aynı sanal anahtar haritası dosyası birden fazla satıra da yazılabilir.

# One key per line
0x01:158:55:835:90:55
0x01:139:172:835:125:55
0x01:102:298:835:115:55
0x01:217:412:835:95:55

Yukarıdaki örnekte dokunmatik ekranın çözünürlüğü 480x800'dür. Buna göre, tüm sanal tuşların <centerY> koordinatı 835 olup dokunmatik ekranın görünür alanının biraz altındadır.

İlk anahtarın Linux tarama kodu 158 (KEY_BACK), centerX değeri 55, centerY değeri 835, width değeri 90 ve height değeri 55'dir.

Örnek

Sanal anahtar eşleme dosyası: /sys/board_properties/virtualkeys.touchyfeely.

0x01:158:55:835:90:55
0x01:139:172:835:125:55
0x01:102:298:835:115:55
0x01:217:412:835:95:55

Anahtar düzeni dosyası: /system/usr/keylayout/touchyfeely.kl.

key 158 BACK
key 139 MENU
key 172 HOME
key 217 SEARCH

Anahtar karakter haritası dosyası: /system/usr/keychars/touchyfeely.kcm.

type SPECIAL_FUNCTION

Dolaylı çoklu dokunma işaretçi hareketleri

İşaretçi modunda, sistem aşağıdaki hareketleri yorumlar:

  • Tek parmakla dokunma: tıklama.
  • Tek parmakla hareket etme: İşaretçiyi hareket ettirin.
  • Tek parmak hareketi ve düğme basışları: İşaretçiyi sürükleyin.
  • İki parmağın aynı yönde hareket ettiği iki parmak hareketi: İşaretçinin altındaki alanı bu yönde sürükleyin. İşaretçinin kendisi hareket etmez.
  • Her iki parmağınızla ise farklı yönlerde birbirine doğru veya birbirinden uzaklaşarak hareket eden iki parmakla hareket edin: İşaretçinin etrafındaki alanı kaydırma/ölçeklendirme/döndürme. İşaretçinin kendisi hareket etmez.
  • Birden çok parmakla hareket: serbest biçimli hareket.

Avuç içi reddi

Android 13'ten itibaren yerleşik çerçeve etkinleştirildiğinde sistem, avuç içi girişleri otomatik olarak reddedebilir. Şirket içi özel çözümler hâlâ desteklenmektedir ancak avuç içi algılandığında TOOL_TYPE_PALM işaretini döndürecek şekilde değiştirilmesi gerekebilir. Yerleşik çerçeve, özel çözümlerle birlikte de çalışır.

Asıl model, hareket verilerinin ilk 90 ms'sine, geçerli işaretçiye ve etrafındaki işaretçilere bakar, ardından dokunmaların ekran kenarından ne kadar uzakta olduğunu dikkate alır. Ardından, işaretçi bazında hangi işaretçilerin avuç içi olduğunu belirler. Ayrıca, touchMajor ve touchMinor tarafından bildirildiği üzere her bir kişinin boyutunu da dikkate alır. Ardından Android çerçevesi, avuç içi olarak işaretlenen işaretçileri dokunma akışından kaldırır.

Uygulamalara zaten bir işaretçi gönderilmişse sistem:

  • (Etkin başka işaretçiler varsa) ACTION_POINTER_UP ve FLAG_CANCELED ayarlanmışken işaretçiyi iptal eder.
  • (Yalnızca bir işaretçi varsa) İşaretçiyi ACTION_CANCEL ile iptal eder.

Herkese açık bir API (MotionEvent.FLAG_CANCELED), geçerli etkinliğin kullanıcı işlemini tetiklememesi gerektiğini belirtir. Bu işaret hem ACTION_CANCEL hem de ACTION_POINTER_UP için ayarlandı.

Avuç içi işaretçi uygulamalara gönderilmediyse sistem, işaretçiyi bırakır.

Avuç içi reddetme özelliğini etkinleştirme

  1. Dokunmatik sürücünüzde, aşağıdaki alanların çözünürlüğünü ayarlamak için input_abs_set_res makrosunu kullanın (birimler mm başına piksel şeklindedir):
    • ABS_MT_POSITION_X
    • ABS_MT_POSITION_Y
    • ABS_MT_TOUCH_MAJOR
    • ABS_MT_TOUCH_MINOR

    ABS_MT_TOUCH_MINOR için destek isteğe bağlıdır. Ancak cihazınız bu özelliği destekliyorsa çözünürlüğün doğru ayarlandığından emin olun.

  2. Alanların doğru şekilde ayarlandığını onaylamak için şu komutu çalıştırın:
        $ adb shell getevent -li
    
  3. Özelliği çalışma zamanında etkinleştirmek için şunu çalıştırın:
        $ adb shell device_config put input_native_boot palm_rejection_enabled 1
    
  4. system_server işlemini yeniden başlatın.
         $ adb shell stop && adb shell start
        
  5. adb shell dumpsys input'te, UnwantedInteractionBlocker içinde avuç içi reddi cihazları olduğunu onaylayın. Bu işlem işe yaramazsa yanlış yapılandırılmış olabilecek öğelerle ilgili ipuçları bulmak için girişle ilgili günlükleri kontrol edin.

    Referans olarak aşağıdaki örneğe bakın:

    UnwantedInteractionBlocker:
      mEnablePalmRejection: true
      isPalmRejectionEnabled (flag value): true
      mPalmRejectors:
        deviceId = 3:
          mDeviceInfo:
            max_x = 
            max_y = 
            x_res = 11.00
            y_res = 11.00
            major_radius_res = 1.00
            minor_radius_res = 1.00
            minor_radius_supported = true
            touch_major_res = 1
            touch_minor_res = 1
          mSlotState:
            mSlotsByPointerId:
    
            mPointerIdsBySlot:
    
          mSuppressedPointerIds: {}
    
  6. Özelliği kalıcı olarak etkinleştirmek için ilgili sysprop komutunu init**rc dosyanıza ekleyin:

    setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
    

Daha fazla bilgi