Dokunmatik cihazlar

Android, dijital kalem 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 değiştirdiği izlenimini uyandıracak şekilde bir ekranla ilişkilendirilen dokunmatik cihazlardır.

Dokunmatik yüzeyler, sayısallaştırıcı tablet gibi bir ekranla ilişkili olmayan dokunmatik cihazlardır. Dokunmatik yüzeyler genellikle bir kullanıcı arayüzünün işaretlenmesi veya mutlak dolaylı konumlandırılması veya jest tabanlı kontrolü için kullanılır.

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

Dokunmatik cihazlar bazen temeldeki dokunmatik sensör teknolojisine bağlı olarak parmaklar veya kalem gibi çeşitli farklı araçlar kullanılarak değiştirilebilir.

Dokunmatik cihazlar bazen sanal anahtarları uygulamak için kullanılır. Örneğin, bazı Android cihazlarda, dokunmatik ekran sensör alanı ekranın kenarının ötesine uzanır ve dokunmaya duyarlı tuş takımının bir parçası olarak iki amaca hizmet eder.

Dokunmatik cihazların çok çeşitli olması nedeniyle Android, her cihazın özelliklerini ve istenen davranışını tanımlamak için çok sayıda yapılandırma özelliğine güvenir.

Dokunmatik cihaz sınıflandırması

Bir giriş aygıtı, aşağıdaki koşulların her ikisi de geçerliyse çoklu dokunmatik aygıt 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 herhangi bir oyun kumandası düğmesi yoktur. Bu durum, eksenleri MT eksenleriyle örtüşen kodlarla bildiren belirli gamepad'lerdeki belirsizliği giderir.

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

  • Giriş cihazı çoklu dokunmatik cihaz olarak sınıflandırılmamıştır. Bir giriş cihazı ya tek dokunuşlu cihaz ya da çoklu dokunmatik cihaz olarak sınıflandırılır; asla her ikisi birden değildir.
  • Giriş cihazı ABS_X ve ABS_Y mutlak eksenlerinin varlığını ve BTN_TOUCH anahtar kodunun varlığını bildirir.

Bir giriş cihazı dokunmatik cihaz olarak sınıflandırıldığında sanal anahtarların varlığı, cihaz için sanal anahtar eşleme dosyası yüklenmeye çalışılarak belirlenir. Bir sanal anahtar haritası mevcutsa aygıtın anahtar düzeni dosyası da yüklenir. Bu dosyaların konumu ve formatı hakkında bilgi için [Sanal anahtar harita dosyaları](#virtual-key-map-files) konusuna bakın.

Daha sonra 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ş aygıtı yapılandırma dosyası yoksa sistem, harici USB veya Bluetooth HID dokunmatik ekranlar veya dokunmatik yüzeyler gibi genel amaçlı dokunmatik çevre birimleri için uygun olan varsayılan bir yapılandırmayı seçer. Bu varsayılanlar yerleşik dokunmatik ekranlar için tasarlanmamıştır ve hatalı davranışlara neden olabilir.

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

  • Ekrandaki nesnelerin doğrudan manipülasyonu için dokunmatik ekranlı bir cihaz kullanılır. Kullanıcı doğrudan ekrana dokunur, böylece sistem, manipüle edilen nesneleri belirtmek için herhangi bir ek donanıma ihtiyaç duymaz.
  • Belirli bir sensör alanındaki dokunuşlarla ilgili bir uygulamaya mutlak konumlandırma bilgisi sağlamak için bir dokunmatik yüzey cihazı kullanılır. Sayısallaştırıcı tabletler için yararlı olabilir.
  • Bir işaretçi cihazı, bir imleç kullanılarak ekrandaki nesnelerin dolaylı olarak manipülasyonu için kullanılır. Parmaklar çoklu dokunmalı işaretçi hareketleri olarak yorumlanır. Stiluslar gibi diğer araçlar mutlak konumlar kullanılarak yorumlanır. Daha fazla bilgi için Dolaylı çoklu dokunma işaretçisi hareketleri konusuna bakın.

Giriş aygıtını dokunmatik ekran, dokunmatik yüzey veya işaretçi aygıtı olarak sınıflandırmak için aşağıdaki kurallar kullanılır.

  • touch.deviceType özelliği ayarlandıysa cihaz türü belirtildiği gibi 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şul, doğrudan girişli dokunmatik aygıtların da bağlı olan bir ekrana bağlı olduğunu varsayar.
  • 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 ilgili eksenlerinin varlığını bildirirse cihaz tipi dokunmatik yüzey olarak ayarlanır. Bu durum, hem fare hem de dokunmatik yüzeyden oluşan giriş aygıtlarına yönelik belirsizliği giderir. Bu durumda, fare zaten onu kontrol ettiğinden, dokunmatik yüzey işaretçiyi kontrol etmek için kullanılmaz.
  • Aksi halde aygıt türü pointer olarak ayarlanır. Bu varsayılan, başka herhangi bir özel amaç için atanmamış dokunmatik yüzeylerin 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ı denetimlerdir. Dokunmatik cihazlardaki düğmeler, fare düğmelerine benzer şekilde davranır ve çoğunlukla işaretçi tipi dokunmatik cihazlarla veya kalemle 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 basmak aynı zamanda KeyEvent.KEYCODE_BACK anahtar koduyla bir tuşa basılmasını da sentezler.
  • BTN_FORWARD ve BTN_EXTRA : MotionEvent.BUTTON_FORWARD ile eşlendi. Bu düğmeye basmak aynı zamanda KeyEvent.KEYCODE_FORWARD anahtar koduyla bir tuşa basılmasını da sentezler.
  • 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şimde bulunmak için kullanılan bir parmak, kalem veya başka bir aparattır. Bazı dokunmatik cihazlar farklı araç türlerini ayırt edebilir.

Android'in başka yerlerinde, MotionEvent API'sinde olduğu gibi, bir araca genellikle işaretçi adı verilir.

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

  • BTN_TOOL_FINGER ve MT_TOOL_FINGER : MotionEvent.TOOL_TYPE_FINGER ile eşlendi.
  • BTN_TOOL_PEN ve MT_TOOL_PEN : MotionEvent.TOOL_TYPE_STYLUS ile eşlendi.
  • 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şlendi.

Vurgulu araçlara karşı dokunma araçları

Araçlar dokunmatik cihazla temas halinde olabilir veya menzil içinde olabilir ve cihazın üzerinde gezinebilir. Dokunmatik cihazların tümü, dokunmatik cihazın üzerinde asılı duran bir aracın varlığını algılayamaz. RF tabanlı ekran kalemi sayısallaştırıcıları gibi bunu yapabilenler, aracın sayısallaştırıcının sınırlı bir aralığında olduğunu sıklıkla algılayabilir.

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

Dokunma araçları, uygulamalara MotionEvent.ACTION_DOWN , MotionEvent.ACTION_MOVE , MotionEvent.ACTION_DOWN , MotionEvent.ACTION_POINTER_DOWN ve MotionEvent.ACTION_POINTER_UP kullanılarak dokunma olayları 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 olayları olarak bildirilir.

Dokunmatik aygıt sürücüsü gereksinimleri

  • Dokunmatik aygıt 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 kaydedilmesi, cihaz sınıflandırma algoritmasını karıştırabilir veya sistemin cihazın yeteneklerini yanlış algılamasına neden olabilir. Örneğin, cihaz BTN_TOUCH anahtar kodunu bildirirse sistem, aletin ekrana dokunup dokunmadığını belirtmek için her zaman BTN_TOUCH kullanıldığını varsayar. Bu nedenle BTN_TOUCH , aracın yalnızca aralıkta olduğunu ve gezindiğini belirtmek için kullanılmamalıdır.
  • Tek dokunuşlu cihazlar aşağıdaki Linux giriş olaylarını kullanır:
    • ABS_X : (ZORUNLU) Takımın X koordinatını bildirir.
    • ABS_Y : (GEREKLİ) Takımın Y koordinatını bildirir.
    • ABS_PRESSURE : (isteğe bağlı) Aletin ucuna uygulanan fiziksel basıncı veya dokunma kontağının sinyal gücünü rapor eder.
    • ABS_TOOL_WIDTH : (isteğe bağlı) Dokunmatik kontağın veya aracın kendisinin kesit alanını veya genişliğini bildirir.
    • ABS_DISTANCE : (isteğe bağlı) Aracın dokunmatik cihazın yüzeyine olan mesafesini bildirir.
    • ABS_TILT_X : (isteğe bağlı) Aracın dokunmatik cihazın yüzeyinden X ekseni boyunca eğimini bildirir.
    • ABS_TILT_Y : (isteğe bağlı) Aracın dokunmatik cihazın yüzeyinden Y ekseni boyunca eğimini bildirir.
    • BTN_TOUCH : (GEREKLİ) Aracın cihaza temas edip etmediğini belirtir.
    • BTN_LEFT , BTN_RIGHT , BTN_MIDDLE , BTN_BACK , BTN_SIDE , BTN_FORWARD , BTN_EXTRA , BTN_STYLUS , BTN_STYLUS2 : (isteğe bağlı) Düğme durumlarını raporlar.
    • 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ı) : ) Takım tipini bildirir.
  • Çoklu dokunmatik cihazlar aşağıdaki Linux giriş olaylarını kullanır:
    • ABS_MT_POSITION_X : (GEREKLİ) Takımın X koordinatını bildirir.
    • ABS_MT_POSITION_Y : (REQUIRED) Takımın Y koordinatını bildirir.
    • ABS_MT_PRESSURE : (isteğe bağlı) Aletin ucuna uygulanan fiziksel basıncı veya dokunma kontağının sinyal gücünü rapor eder.
    • ABS_MT_TOUCH_MAJOR : (isteğe bağlı) Dokunmatik kontağın kesit alanını veya dokunmatik kontağın daha uzun boyutunun uzunluğunu bildirir.
    • ABS_MT_TOUCH_MINOR : (isteğe bağlı) Dokunmatik kontağın kısa boyutunun uzunluğunu bildirir. ABS_MT_TOUCH_MAJOR bir alan ölçümü rapor ediyorsa bu eksen kullanılmamalıdır.
    • ABS_MT_WIDTH_MAJOR : (isteğe bağlı) Aracın kendisinin kesit alanını veya aracın daha uzun boyutunun uzunluğunu bildirir. Aletin boyutlarını bilmiyorsanız bu ekseni kullanmayın.
    • ABS_MT_WIDTH_MINOR : (isteğe bağlı) Aracın kendisinin kısa boyutunun uzunluğunu bildirir. ABS_MT_WIDTH_MAJOR bir alan ölçümü bildiriyorsa veya aletin 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ı) Takım tipini 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ç etkin olduğunda her bir aracı bağımsız olarak tanımlamak ve izlemek için kullanılan, negatif olmayan rastgele bir tam sayıdır. Örneğin, cihaza birden fazla parmak dokunduğunda, her parmağa, parmak temas halinde kaldığı sürece kullanılacak ayrı bir izleme kimliği atanmalıdır. İzleme kimlikleri, ilgili araçlar menzil dışına çıktığında yeniden kullanılabilir.
    • ABS_MT_SLOT : (isteğe bağlı) Linux çoklu dokunma protokolü 'B' kullanıldığında aracın yuva kimliğini bildirir. Daha fazla ayrıntı için Linux çoklu dokunma protokolü belgelerine bakın.
    • BTN_TOUCH : (GEREKLİ) Aracın cihaza temas edip etmediğini belirtir.
    • BTN_LEFT , BTN_RIGHT , BTN_MIDDLE , BTN_BACK , BTN_SIDE , BTN_FORWARD , BTN_EXTRA , BTN_STYLUS , BTN_STYLUS2 : (isteğe bağlı) Düğme durumlarını raporlar.
    • 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ı) : ) Takım tipini bildirir.
  • Hem tek dokunma hem de çoklu dokunma protokolü için eksenler tanımlanmışsa, yalnızca çoklu dokunma eksenleri kullanılır ve tek dokunma eksenleri göz ardı edilir.
  • ABS_X , ABS_Y , ABS_MT_POSITION_X ve ABS_MT_POSITION_Y eksenlerinin minimum ve maksimum değerleri, cihazın aktif alanının sınırlarını cihaza özel yüzey birimlerinde tanımlar. Dokunmatik ekran söz konusu olduğunda aktif alan, dokunmatik cihazın aslında ekranı kaplayan kısmını tanımlar.

    Bir dokunmatik ekran için sistem, aşağıdaki hesaplamaya göre ekran piksellerinde dokunma konumlarını elde etmek amacıyla yüzey birimlerinde bildirilen dokunma konumlarını otomatik olarak enterpolasyona tabi tutar:

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

    Bir dokunmatik ekran, rapor edilen aktif alanın dışındaki dokunuşları bildirebilir.

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

    Etkin alan içinde başlatılan veya görüntüleme alanına giren ve çıkan dokunuşlar uygulamalara iletilir. Sonuç olarak, bir dokunma uygulamanın sınırları içinde başlayıp ardından etkin alanın dışına çıkarsa uygulama, negatif veya ekranın sınırlarının ötesinde ekran koordinatlarına sahip dokunma olayları alabilir. Bu beklenen bir davranıştır.

    Bir dokunmatik cihaz asla dokunma koordinatlarını aktif alanın sınırlarına sıkıştırmamalıdır. Bir dokunuş aktif alandan çıkıyorsa aktif alan dışında olarak raporlanmalı veya hiç rapor edilmemelidir.

    Örneğin, kullanıcının parmağı dokunmatik ekranın sol üst köşesine dokunuyorsa (minX, minY) koordinatını bildirebilir. Parmak aktif alanın dışına doğru hareket etmeye devam ederse, dokunmatik ekran ya (minX - 2, minY - 3 gibi) minX ve minY'den daha az bileşenlere sahip koordinatları raporlamaya başlamalı ya da dokunmayı raporlamayı tamamen bırakmalıdır. Başka bir deyişle, kullanıcının parmağı gerçekten aktif alanın dışına dokunduğunda dokunmatik ekranın raporlama (minX, minY) yapmaması gerekir.

    Dokunma koordinatlarının ekranın kenarına sıkıştırılması, ekranın kenarı çevresinde yapay bir sert sınır oluşturur ve bu da sistemin, ekran alanının sınırlarına giren veya bu sınırlarından çıkan hareketleri düzgün bir şekilde izlemesini engeller.

  • ABS_PRESSURE veya ABS_MT_PRESSURE tarafından rapor edilen değerler, eğer rapor ediliyorsa, takım cihaza dokunduğunda sıfırdan farklı olmalı, aksi halde takımın havada durduğunu belirtmek için sıfır olmalıdır.

    Basınç bilgilerinin raporlanması isteğe bağlıdır ancak şiddetle tavsiye edilir. 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ç aygıta dokunduğunda sıfır olmamalı, aksi takdirde sıfır olmalıdır, ancak bu gerekli değildir. Örneğin, dokunmatik cihaz parmakla dokunma temas noktalarının boyutunu ölçebilir ancak kalemle dokunma temas noktalarının boyutunu ölçemeyebilir.

    Boyut bilgilerinin raporlanması isteğe bağlıdır ancak önemle tavsiye edilir. 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, takım cihaza temas ettiğinde sıfıra yaklaşmalıdır. Alet doğrudan temas halindeyken bile mesafe sıfırdan farklı kalabilir. Bildirilen kesin değerler, donanımın mesafeyi ölçme şekline bağlıdır.

    Mesafe bilgilerinin raporlanması isteğe bağlıdır ancak ekran kalemi cihazları için önerilir.

  • ABS_TILT_X ve ABS_TILT_Y tarafından bildirilen değerler, takım cihaza dik olduğunda sıfır olmalıdır. Sıfır olmayan eğim, aletin eğimli tutulduğunu gösterir.

    X ve Y eksenleri boyunca eğim açılarının dikeyden derece cinsinden belirtildiği varsayılır. Merkez noktası (tam olarak dik), her eksen için (max + min) / 2 ile verilir. Merkez noktadan küçük değerler yukarıya veya sola eğimi, merkez noktadan büyük değerler ise aşağı veya sağa eğimi temsil eder.

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

    Eğim bilgilerinin raporlanması isteğe bağlıdır ancak ekran kalemi cihazları için önerilir.

  • Takım tipi ABS_MT_TOOL_TYPE tarafından bildirilirse, BTN_TOOL_* tarafından bildirilen tüm takım tipi bilgilerinin yerine geçer. Hiçbir araç türü bilgisi mevcut değilse, araç türü varsayılan olarak MotionEvent.TOOL_TYPE_FINGER olur.

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

    • Tek dokunuşlu protokolü kullanırken, BTN_TOUCH veya BTN_TOOL_* 1 ise araç etkindir.

      Bu koşul, InputReader aracın doğası hakkında, dokunaklı olup olmadığı ya da en azından araç türü hakkında en azından bazı bilgilere sahip olması gerektiği anlamına gelir. Hiçbir bilgi mevcut değilse, aletin etkin olmadığı (aralık dışında) varsayılır.

    • Çoklu dokunma protokolü 'A' kullanıldığında araç, en son senkronizasyon raporunda göründüğünde etkin olur. Araç, senkronizasyon raporlarında görünmeyi bıraktığında varlığı da sona erer.
    • Çoklu dokunma protokolü 'B' kullanıldığında araç, etkin bir yuvaya sahip olduğu sürece etkindir. Yuva temizlendiğinde aracın varlığı sona erer.
  • Bir aracın aşağıdaki koşullara göre gezindiği belirlenir:
    • Araç BTN_TOOL_MOUSE veya BTN_TOOL_LENS ise, aşağıdaki koşullardan herhangi biri doğru olsa bile araç gezinmiyor.
    • Alet etkinse ve sürücü basınç bilgilerini rapor ediyorsa ve rapor edilen basınç sıfırsa alet havada asılı duruyor demektir.
    • Araç etkinse ve sürücü BTN_TOUCH anahtar kodunu destekliyorsa ve BTN_TOUCH sıfır değerine sahipse araç geziniyor demektir.
  • InputReader hem çoklu dokunma protokolü 'A' hem de 'B'yi destekler. Yeni sürücüler 'B' protokolünü kullanmalıdır ancak her ikisi de işe yarar.
  • Android 4.0'dan itibaren, dokunmatik ekran sürücülerinin Linux giriş protokolü spesifikasyonuna uyacak şekilde değiştirilmesi gerekebilir.

    Aşağıdaki değişiklikler gerekli olabilir:

    • Bir araç devre dışı kaldığında (parmak "yukarı" hareket ettiğinde), sonraki çoklu dokunmatik senkronizasyon raporlarında görünmeyi bırakmalıdır. Tüm araçlar devre dışı kaldığında (tüm parmaklar "yukarı" hareket ettiğinde), sürücünün SYN_MT_REPORT ve ardından SYN_REPORT gibi boş bir senkronizasyon raporu paketi göndermesi gerekir.

      Android'in önceki sürümleri, "yukarı" olaylarının 0 basınç değeri gönderilerek raporlanmasını bekliyordu. Eski davranış, Linux giriş protokolü spesifikasyonuyla uyumsuzdu ve artık desteklenmiyor.

    • Fiziksel basınç veya sinyal gücü bilgileri ABS_MT_PRESSURE kullanılarak rapor edilmelidir.

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

    • Dokunma boyutu bilgileri ABS_MT_TOUCH_MAJOR kullanılarak rapor edilmelidir.

      Android'in önceki sürümleri boyut bilgilerini ABS_MT_TOOL_MAJOR adresinden alıyordu. Eski davranış, Linux giriş protokolü spesifikasyonuyla uyumsuzdu ve artık desteklenmiyor.

    Dokunmatik aygıt sürücülerinin artık Android'e özgü özelleştirmelere ihtiyacı yok. Android, standart Linux giriş protokolüne dayanarak, değiştirilmemiş sürücüleri kullanarak harici HID çoklu dokunmatik dokunmatik ekranlar gibi daha çeşitli dokunmatik çevre birimlerini destekleyebilir.

Dokunmatik cihazın çalışması

Aşağıda Android'deki dokunmatik cihaz işleminin kısa bir özeti bulunmaktadır.

  1. EventHub evdev sürücüsündeki ham olayları okur.
  2. InputReader ham olayları tüketir ve her bir aracın konumu ve diğer özelliklerine ilişkin dahili durumu günceller. Ayrıca düğme durumlarını da izler.
  3. GERİ veya İLERİ tuşuna basıldığında veya bırakıldığında, InputReader InputDispatcher anahtar olay hakkında bilgi verir.
  4. InputReader sanal bir tuşa basılıp basılmadığını belirler. Eğer öyleyse, InputDispatcher anahtar olay hakkında bilgi verir.
  5. InputReader dokunmanın ekranın sınırları dahilinde başlatılıp başlatılmadığını belirler. Eğer öyleyse, Touch olayı hakkında InputDispatcher bilgilendirir.
  6. Dokunma aracı yoksa ancak en az bir gezinme aracı varsa, InputReader giriş olayı hakkında InputDispatcher bildirimde bulunur.
  7. Dokunmatik aygıt türü pointer ise, InputReader işaretçi hareketi algılamayı gerçekleştirir, işaretçiyi hareket ettirir ve buna göre noktalar belirler ve işaretçi olayı hakkında InputDispatcher bildirimde bulunur.
  8. InputDispatcher olayların gönderilip gönderilmeyeceğini ve aygıtı uyandırıp uyandırmayacağını belirlemek için WindowManagerPolicy kullanır. Daha sonra, InputDispatcher olayları uygun uygulamalara iletir.

Dokunmatik cihaz yapılandırması

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

Klavye yapılandırmasına katılan dosyalar hakkında daha fazla ayrıntı 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ğine dayanır.

Bunun bir nedeni, dokunmatik aygıtlara yönelik aygıt sürücülerinin genellikle aygıta özgü birimleri kullanarak dokunma özelliklerini raporlamasıdır.

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

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

Dokümantasyon 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 aygıt sürücüsü tarafından EV_ABS olayları olarak bildirilen ham değerleri belirtir.

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 veya 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 mevcut değilse raw.touchMajor .
raw.toolMajor
ABS_TOOL_WIDTH veya ABS_MT_WIDTH_MAJOR ekseninin değeri veya mevcut değilse 0.
raw.toolMinor
ABS_MT_WIDTH_MINOR ekseninin değeri veya mevcut değilse 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 veya 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 ham değerlerin sınırlarını göstermektedir. Her eksen için EVIOCGABS ioctl çağrılarak elde edilirler.

raw.*.min
Ham eksenin kapsayıcı minimum değeri.
raw.*.max
Ham eksenin kapsayıcı maksimum değeri.
raw.*.range
raw.*.max - raw.*.min ile eşdeğerdir.
raw.*.fuzz
Ham eksenin doğruluğu. Örneğin. fuzz = 1, değerlerin +/- 1 birime kadar doğru olduğunu belirtir.
raw.width
Dokunma alanının kapsayıcı genişliği; raw.x.range + 1 eşdeğerdir.
raw.height
Dokunma alanının dahil yüksekliği; raw.y.range + 1 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 gelen dokunma konumu bilgilerini, ekran pikselleri gibi uygulamalara rapor edilen çıkış birimlerine dönüştürmek için doğrusal enterpolasyon kullanır.

output.width
Çıkış genişliği. Dokunmatik ekranlar için (bir ekranla ilişkili), bu, piksel cinsinden ekran genişliğidir. Dokunmatik yüzeyler için (bir ekranla ilişkili olmayan), çıktı genişliği raw.width değerine eşittir, bu da hiçbir enterpolasyonun gerçekleştirilmediğini gösterir.
output.height
Çıkış yüksekliği. Dokunmatik ekranlar için (bir ekranla ilişkili), bu, piksel cinsinden ekran yüksekliğidir. Dokunmatik yüzeyler için (bir ekranla ilişkili olmayan), çıkış yüksekliği raw.height değerine eşittir, bu da hiçbir enterpolasyonun gerçekleştirilmediğini gösterir.
output.diag
Çıkış koordinat sisteminin köşegen uzunluğu, sqrt(output.width ^2 + output.height ^2) ile eşdeğerdir.

Temel yapılandırma

Dokunmatik giriş eşleyicisi, kalibrasyon değerlerini belirtmek için giriş cihazı yapılandırma dosyasındaki birçok yapılandırma özelliğini 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, bir ekranla ilişkilendirilmiş bir dokunmatik ekrandır.

  • Değer touchPad Yüzey ise dokunmatik cihaz, ekranla ilişkilendirilmemiş bir dokunmatik yüzeydir.

  • Değer pointer ise, dokunmatik cihaz ekranla ilişkili olmayan bir dokunmatik yüzeydir ve hareketleri dolaylı çoklu dokunma işaretçi hareketleri için kullanılır.

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

Cihaz tipinin dokunmatik cihazın davranışını nasıl etkilediği hakkında daha fazla ayrıntı 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ılmıştı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ü değiştiğinde döndürülür.

  • Değer 0 ise, dokunmatik cihaz tarafından bildirilen dokunma konumları, ekran yönü değişikliklerinden etkilenmez.

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

Sistem, dahili ve harici dokunmatik ekranlar ve ekranlar arasında ayrım yapar. Yön algılamalı dahili dokunmatik ekran, dahili ekranın yönüne göre döndürülür. Yön algılamalı harici dokunmatik ekran, harici ekranın yönüne göre döndürülür.

Oryantasyon farkındalığı, Nexus One gibi cihazlarda dokunmatik ekranların dönmesini desteklemek için kullanılır. Örneğin, cihaz doğal yönünden saat yönünde 90 derece döndürüldüğünde, dokunmatik ekranın mutlak koordinat sisteminin sol üst köşesindeki bir dokunuş, sol üst köşedeki bir dokunuş olarak rapor edilecek şekilde, dokunuşların mutlak konumları yeniden eşlenir. ekranın döndürülmüş koordinat sisteminin köşesi. Bu, dokunuşların uygulamaların görsel öğelerini çizmek için kullandığı koordinat sistemiyle aynı şekilde raporlanması için yapılır.

Honeycomb'dan önce, tüm dokunmatik cihazların yönelime duyarlı olduğu varsayıldı.

touch.gestureMode

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

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

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

  • Değer spots ise, dokunmatik yüzey hareketleri, hareketin ağırlık merkezini temsil eden bir bağlantı ve tek tek parmakların konumunu temsil eden bir dizi dairesel nokta tarafından sunulur.

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

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 bilgisi, çıkış koordinat sistemine doğrusal olarak enterpolasyona tabi tutulur.

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ı, çıkış birimlerindeki (piksel) temas alanının yaklaşık boyutlarını tanımlar.

toolMajor ve toolMinor alanları, aracın yaklaşık boyutlarını çıktı birimleri (piksel) cinsinden tanımlar.

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

Hem yaklaşık uzunluk hem de genişlik ölçülebildiğinde, touchMajor alanı temas alanının daha uzun boyutunu, touchMinor alanı ise daha kısa boyutunu belirtir. Temas alanının yalnızca yaklaşık çapı ölçülebildiğinde touchMajor ve touchMinor alanları eşittir.

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

Dokunma boyutu mevcut değilse ancak araç boyutu mevcutsa, araç boyutu, dokunma boyutuna eşit olarak ayarlanır. Bunun tersine, eğer araç boyutu mevcut değilse ancak dokunma boyutu mevcutsa, o zaman dokunma boyutu, araç boyutuna eşit olarak ayarlanır.

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

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

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

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

  • Değer geometric ise boyutun konumla aynı yüzey birimlerinde belirtildiği varsayılır, dolayısıyla aynı şekilde ölçeklenir.

  • Değer diameter ise, boyutun dokunuşun veya aletin çapıyla (genişliğiyle) orantılı olduğu varsayılır.

  • Değer, area ise, boyutun dokunma veya araç alanıyla orantılı olduğu varsayılır.

  • Değer default ise sistem, raw.touchMajor veya raw.toolMajor ekseni mevcutsa geometric kalibrasyonu kullanır, aksi halde kalibrasyon none seçeneğini kullanır.

dokunmatik.boyut.ölçekli

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

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

Varsayılan değer 1.0 .

dokunma.boyut.bias

Tanım: touch.size.bias = <negatif olmayan kayan noktalı bir sayı>

Kalibrasyonda kullanılan sabit bir sapma değerini belirtir.

Varsayılan değer 0.0 .

touch.size.isSummed

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

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

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

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

Varsayılan değer 0 .

Bazı dokunmatik cihazlar, özellikle de "Yarı-MT" cihazlar, birden fazla temasın bireysel boyutlarını ayırt edemez, bu nedenle toplam alanlarını veya genişliklerini temsil eden bir boyut ölçümü bildirirler. Bu tür cihazlar için bu özellik yalnızca 1 olarak ayarlanmalıdır. Şüpheniz varsa 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ı, dokunmatik cihaza uygulanan yaklaşık fiziksel basıncı, 0,0 (dokunma yok) ile 1,0 (normal basınç) arasında normalleştirilmiş bir değer olarak tanımlar.

Sıfır basınç, aletin havada durduğunu gösterir.

dokunma.basınç.kalibrasyon

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

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

  • Değer none ise basınç bilinmez, dolayısıyla dokunulduğunda 1,0'a, havada gezinildiğinde ise 0,0'a 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, kontağın boyutuna ve uygulanan basınca bağlı olan sinyal genliğini ölçtüğü varsayılır.

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

dokunmatik basınç ölçeği

Tanım: touch.pressure.scale = <negatif olmayan kayan noktalı sayı>

Kalibrasyonda kullanılan sabit bir ölçek faktörü 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

Oryantasyon ve eğim alanları

orientation alanı, dokunuş ve aracın yönünü açısal bir ölçüm olarak tanımlar. 0 yönü, ana eksenin dikey olarak yönlendirildiğini gösterir, -PI/2 ana eksenin sola yönlendirildiğini gösterir, PI/2 ana eksenin sağa yönlendirildiğini gösterir. Bir kalem aracı mevcut olduğunda, oryantasyon aralığı -PI veya PI aralığında tam bir daire aralığında tanımlanabilir.

tilt alanı, aletin eğimini açısal bir ölçüm olarak tanımlar. 0 eğimi, aletin yüzeye dik olduğunu gösterir. Bir PI/2 eğimi, aletin yüzeyde düz olduğunu gösterir.

Touch.Ortiamation.Calibrasyon

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

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

  • Değer none , oryantasyon bilinmemektedir, böylece 0 olarak ayarlanır.
  • Değer interpolated edilirse, raw.orientation.min -PI/2 bir ham değeri raw.orientation.max PI/2 (raw.orientation.min + raw.orientation.max) / 2 haritalarının merkez değeri 0 ile.
  • Değer vector ise, yönlendirme, imzalı iki 4 bit alandan oluşan paketlenmiş bir vektör olarak yorumlanır. Bu gösterim Atmel nesne tabanlı protokol parçalarında kullanılır. Kod çözüldüğünde, vektör bir yönelim açısı ve güven büyüklüğü verir. Güven büyüklüğü, geometrik olmadığı sürece boyut bilgilerini ölçeklendirmek için kullanılır.
  • Değer default , sistem kullanılabilirse sistem, interpolated kalibrasyonu kullanır, aksi takdirde none kullanmaz.

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ı, alet ve dokunmatik cihaz yüzeyi arasındaki mesafeyi tanımlar. 0.0 değeri doğrudan teması gösterir ve daha büyük değerler yüzeyden artan mesafeyi gösterir.

Touch.Distance.Lalibrasyon

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

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

  • Değer none , mesafe bilinmemektedir, böylece 0 olarak ayarlanır.

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

  • Değer default , sistem mevcutsa scaled kalibrasyonu kullanır, aksi takdirde none kullanmaz.

touch.distance.scale

Tanım: touch.distance.scale = <a negatif olmayan yüzer nokta numarası>

Kalibrasyonda kullanılan sabit bir ölçek faktörü 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ı

Touch cihazları için yapılandırma özellikleri Android Ice Cream Sandwich 4.0'da önemli ölçüde değişti. Touch cihazları için tüm giriş aygıtı yapılandırma dosyaları, yeni yapılandırma özelliklerini kullanmak için güncellenmelidir.

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

Sanal Anahtar Harita Dosyaları

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

Dokunmatik kontrolörün yeteneklerine bağlı olarak bunu yapmanın birkaç yolu vardır. Bazı dokunmatik denetleyiciler, ürün yazılımı kayıtlarını ayarlayarak yumuşak tuşları uygulamak için doğrudan yapılandırılabilir. Diğer zamanlarda, dokunmatik koordinatlardan yazılımdaki anahtar kodlara kadar eşlemeyi gerçekleştirmek arzu edilir.

Sanal anahtarlar yazılımda uygulandığında, çekirdek virtualkeys.<devicename> Örneğin, dokunmatik ekran cihazı sürücüleri adını "TouchyFeely" olarak bildiriyorsa, sanal anahtar harita dosyasının /sys/board_properties/virtualkeys.touchyfeely yoluna sahip olması gerekir.

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

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

Sözdizimi

Sanal anahtar harita dosyası, yeni çizgiler veya kolonlarla ayrılmış bir sanal anahtar düzen açıklamasından oluşan düz bir metin dosyasıdır.

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

Her sanal anahtar, 6 kolon ile ayrılmış bileşen tarafından tanımlanır:

  • 0x01 : Bir sürüm kodu. Her zaman 0x01 olmalıdır.
  • <Linux Anahtar Kodu>: Sanal Anahtarın Linux Anahtar Kodu.
  • <Centerx>: Sanal anahtarın merkezinin X piksel koordinatı.
  • <Centery>: Sanal anahtarın merkezinin y piksel koordinatı.
  • <Width>: Piksellerdeki sanal anahtarın genişliği.
  • <ity>: Piksellerdeki sanal anahtarın yüksekliği.

Tüm koordinatlar ve boyutlar, ekran koordinat sistemi açısından belirtilir.

İşte bir satırda yazılmış bir sanal anahtar haritası dosyası.

# 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 çok satırda 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 480x800 çözünürlüğü vardır. Buna göre, tüm sanal tuşlar, dokunmatik ekranın görünür alanının biraz altında olan 835'in bir <Centery> koordinatına sahiptir.

İlk anahtarın Linux tarama kodu 158 ( KEY_BACK ), Centerx 55 , 835 merkez, 90 genişliği ve 55 yüksekliği vardır.

Örnek

Sanal Anahtar Harita 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üzen 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 dokunuş işaretçisi hareketleri

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

  • Tek Parmak Tap: Tıklayın.
  • Tek parmak hareketi: İşaretçiyi hareket ettirin.
  • Tek Parmak Hareketi Plus Düğme Presleri: İşaretçiyi sürükleyin.
  • İki parmak hareketi her iki parmak da aynı yönde hareket eder: işaretçinin altındaki alanı bu yönde sürükleyin. İşaretçinin kendisi hareket etmiyor.
  • İki parmak hareketi birbirine doğru hareket eden veya farklı yönlerde ayrı hareket eder: Pan/ölçek/işaretçiyi çevreleyen alanı döndürün. İşaretçinin kendisi hareket etmiyor.
  • Çoklu parmak hareketi: Serbest biçimli jest.

Palmiye reddi

Android 13 itibariyle sistem, yerleşik çerçeve etkinleştirildiğinde avuç içi girişlerini otomatik olarak reddedebilir. Şirket içi, özel olarak inşa edilmiş çözümler hala desteklenmektedir, ancak bir avuç içi tespit edildiğinde TOOL_TYPE_PALM bayrağını döndürmek için değiştirilmeleri gerekebilir. Yerleşik çerçeve ayrıca özel çözümlerle birlikte çalışır.

Gerçek model, mevcut işaretçi ve çevredeki işaretçilere ilk 90 ms jest verilerine bakar, daha sonra dokunuşların ekran kenarından ne kadar uzakta olduğunu düşünür. Daha sonra, işaretçilerin hangisinin avuç içi olduğunu belirler. Ayrıca touchMajor ve touchMinor tarafından bildirildiği gibi, her bir kontağın boyutunu da dikkate alır. Android çerçevesi daha sonra dokunma akışından avuç içi olarak işaretlenen işaretçileri kaldırır.

Uygulamalara zaten bir işaretçi gönderildiyse, sistem:

  • (Başka aktif işaretçiler varsa) ACTION_POINTER_UP ve FLAG_CANCELED set ile işaretçiyi iptal eder.
  • (Bu tek işaretçi ise) ACTION_CANCEL ile işaretçiyi iptal eder.

Bir genel API olan MotionEvent.FLAG_CANCELED , mevcut olayın kullanıcı eylemini tetiklememesi gerektiğini gösterir. Bu bayrak hem ACTION_CANCEL hem de ACTION_POINTER_UP için ayarlanmıştır.

Palmiye işaretçisi uygulamalara gönderilmediyse, sistem işaretçiyi düşürür.

Palmiye reddini etkinleştir

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

    ABS_MT_TOUCH_MINOR desteği isteğe bağlıdır. Ancak, cihazınız onu destekliyorsa, çözünürlüğün doğru ayarlandığından emin olun.

  2. Alanların doğru şekilde ayarlandığını doğrulamak için çalıştırın:
        $ adb shell getevent -li
    
  3. Çalışma zamanı sırasında özelliği etkinleştirmek için ç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 UnwantedInteractionBlocker içinde palmiye reddetme olduğunu gösterdiğini doğrulayın. Değilse, neyin yanlış yapılandırılabileceğine dair ipuçlarını bulmak için girişle ilgili günlükleri kontrol edin.

    Referans için 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, init**rc dosyanıza karşılık gelen Sysprop komutunu ekleyin:

    setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
    

daha fazla okuma

,

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

Dokunmatik ekranlar, kullanıcının ekranda doğrudan manipüle etme izlenimi olacak şekilde bir ekranla ilişkili dokunmatik cihazlardır.

Dokunmatik pedler, dijitalleştirici tablet gibi bir ekranla ilişkili olmayan dokunmatik cihazlardır. Dokunmatik pedler tipik olarak bir kullanıcı arayüzünün işaretleme veya mutlak dolaylı konumlandırma veya jest tabanlı kontrolü için kullanılır.

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

Dokunmatik cihazlar bazen temeldeki dokunmatik sensör teknolojisine bağlı olarak parmaklar veya kalem gibi çeşitli farklı araçlar kullanılarak manipüle edilebilir.

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 ötesine uzanır ve dokunma duyarlı bir anahtar pedinin bir parçası olarak ikili amaca hizmet eder.

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

Cihaz sınıflandırması dokunmatik

Aşağıdaki koşulların her ikisi de geçerlise, bir giriş cihazı çoklu dokunuşlu bir 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 herhangi bir gamepad düğmesi yoktur. Bu durum, MT eksenlerininkiyle örtüşen kodlarla eksenleri bildiren belirli gamepad'lerle bir belirsizliği çözer.

Aşağıdaki koşulların her ikisi de geçerli olması durumunda bir giriş aygıtı tek dokunuşlu bir cihaz olarak sınıflandırılır:

  • Giriş cihazı çoklu dokunuşlu bir cihaz olarak sınıflandırılmaz. Giriş aygıtı, tek dokunuşlu bir cihaz veya çoklu dokunuşlu bir cihaz olarak sınıflandırılır, asla ikisi de.
  • Giriş cihazı, ABS_X ve ABS_Y Absolute eksenlerinin varlığını ve BTN_TOUCH anahtar kodunun varlığını bildirir.

Bir giriş aygıtı bir dokunmatik cihazı olarak sınıflandırıldığında, sanal tuşların varlığı, cihaz için sanal anahtar harita dosyasını yüklemeye çalışarak belirlenir. Sanal anahtar haritası mevcutsa, cihaz için anahtar düzen dosyası da yüklenir. Bu dosyaların konumu ve biçimi hakkında bilgi için [sanal anahtar haritası dosyaları] (#sanal-tuş-map-files) adresine bakın.

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

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

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

  • Ekrandaki nesnelerin doğrudan manipülasyonu için bir dokunmatik ekran cihazı kullanılır. Kullanıcı doğrudan ekrana dokunur, böylece sistem manipüle edilen nesneleri belirtmek için ek bir uygunluk gerektirmez.
  • Belirli bir sensör alanındaki dokunuşlar hakkında bir uygulamaya mutlak konumlandırma bilgileri sağlamak için bir dokunmatik ped cihazı kullanılır. Sayısallaştırıcı tabletler için yararlı olabilir.
  • Bir işaretçi cihazı, bir imleç kullanarak ekrandaki nesnelerin dolaylı olarak manipülasyonu için kullanılır. Parmaklar çok dokunaklı işaretçi hareketleri olarak yorumlanır. Styluses gibi diğer araçlar mutlak pozisyonlar kullanılarak yorumlanır. Daha fazla bilgi için dolaylı çoklu dokunuş işaretçisi hareketlerine bakın.

Giriş aygıtını dokunmatik ekran, dokunmatik ped veya işaretçi aygıtı olarak sınıflandırmak için aşağıdaki kurallar kullanılır.

  • touch.deviceType özelliği ayarlanmışsa, cihaz türü belirtildiği gibi ayarlanır.
  • Giriş aygıtı INPUT_PROP_DIRECT Giriş özelliğinin varlığını bildiriyorsa ( EVIOCGPROP IOCTL aracılığıyla), cihaz türü ekran olarak ayarlanmıştır. Bu koşul, doğrudan giriş dokunmatik cihazlarının da bağlı bir ekrana bağlı olduğunu varsayar.
  • Giriş aygıtı INPUT_PROP_POINTER giriş özelliğinin varlığını bildiriyorsa ( EVIOCGPROP IOCTL aracılığıyla), o zaman cihaz türü işaretçiye ayarlanmıştır.
  • Giriş aygıtı REL_X veya REL_Y göreli eksenlerin varlığını bildiriyorsa, cihaz türü ped'e dokunacak şekilde ayarlanır. Bu durum, hem fare hem de dokunmatik pedden oluşan giriş aygıtları için bir belirsizliği çözer. Bu durumda, dokunmatik pedi işaretçiyi kontrol etmek için kullanılmaz, çünkü fare zaten kontrol eder.
  • Aksi takdirde, cihaz türü işaretçiye ayarlanır. Bu varsayılan, başka bir özel amaçlı belirlenmemiş dokunmatik pedlerin işaretçiyi kontrol etmesini sağlar.

Düğmeler

Düğmeler, uygulamaların ek işlevler gerçekleştirmek için kullanabileceği isteğe bağlı kontrollerdir. Dokunmatik cihazlardaki düğmeler fare düğmelerine benzer şekilde davranır ve esas olarak işaretçi tipi dokunmatik cihazlarla veya bir kalemle kullanılır.

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

  • BTN_LEFT : MotionEvent.BUTTON_PRIMARY ile eşlenir.
  • BTN_RIGHT : MotionEvent.BUTTON_SECONDARY ile eşlenir.
  • BTN_MIDDLE : MotionEvent.BUTTON_MIDDLE ile eşlenir.
  • BTN_BACK ve BTN_SIDE : MotionEvent.BUTTON_BACK ile eşlenir. Bu düğmeye basıldığında, tuşa KeyEvent.KEYCODE_BACK basılı tuşuna basılır.
  • BTN_FORWARD ve BTN_EXTRA : MotionEvent.BUTTON_FORWARD ile eşlenmiş. Bu düğmeye basıldığında, tuşa KeyEvent.KEYCODE_FORWARD basılı tuşuna basılır.
  • BTN_STYLUS : MotionEvent.BUTTON_SECONDARY ile eşlenir.
  • BTN_STYLUS2 : MotionEvent.BUTTON_TERTIARY ile eşlenmiş.

Araçlar ve araç türleri

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

Android'de başka yerlerde, MotionEvent API'sinde olduğu gibi, bir araç genellikle bir işaretçi olarak adlandırılır.

Aşağıdaki takım türleri desteklenir:

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

Dokunma Araçlarına Karşı Çekme

Araçlar ya dokunmatik cihazla temas halinde veya menzilde olabilir ve üstünde kalabilir. Tüm dokunmatik cihazlar, dokunmatik cihazın üzerinde dolaşan bir aletin varlığını algılayamaz. RF tabanlı Stylus sayısallaştırıcıları gibi yapılanlar, aracın sayısallaştırıcının sınırlı bir aralığında ne zaman olduğunu tespit edebilir.

InputReader bileşeni, dokunma araçlarını gezinme aletlerinden ayırır. Benzer şekilde, dokunma araçları ve gezinme araçları uygulamalara farklı şekillerde rapor edilir.

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

Hovering araçları, MotionEvent.ACTION_HOVER_ENTER , MotionEvent.ACTION_HOVER_MOVE ve MotionEvent.ACTION_HOVER_EXIT kullanılarak uygulamalara genel hareket etkinlikleri olarak rapor edilir.

Cihaz Sürücü Gereksinimlerine Dokun

  • Dokunma cihaz sürücüleri, destekledikleri eksenler ve düğmeler için yalnızca eksenleri ve anahtar kodları kaydetmelidir. Desteklenmemiş eksenleri veya anahtar kodları kaydetmek, cihaz sınıflandırma algoritmasını karıştırabilir veya sistemin cihazın yeteneklerini yanlış algılamasına neden olabilir. Örneğin, cihaz BTN_TOUCH tuş kodunu bildirirse, sistem BTN_TOUCH her zaman aracın ekrana dokunup dokunmadığını belirtmek için kullanıldığını varsayar. Bu nedenle, BTN_TOUCH aracın sadece aralıkta ve havada kaldığını belirtmek için kullanılmamalıdır.
  • Tek dokunuşlu cihazlar aşağıdaki Linux giriş olaylarını kullanın:
    • ABS_X : (Gerekli) Aracın X koordinatını rapor eder.
    • ABS_Y : (Gerekli) Aracın y koordinatını rapor eder.
    • ABS_PRESSURE : (İsteğe bağlı) Aracın ucuna uygulanan fiziksel basıncı veya dokunma kontağının sinyal mukavemetini bildirir.
    • ABS_TOOL_WIDTH : (İsteğe bağlı) Dokunma kontağının veya aletin kendisinin kesit alanını veya genişliğini bildirir.
    • ABS_DISTANCE : (İsteğe bağlı) Aracın dokunmatik cihazın yüzeyinden uzaklığını bildirir.
    • ABS_TILT_X : (İsteğe bağlı), aletin X ekseni boyunca dokunmatik cihazın yüzeyinden eğimini bildirir.
    • ABS_TILT_Y : (İsteğe bağlı), A aracının y ekseni boyunca dokunmatik cihazın yüzeyinden eğimini bildirir.
    • BTN_TOUCH : (Gerekli) 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_LENS BTN_TOOL_BRUSH , BTN_TOOL_PENCIL , BTN_TOOL_AIRBRUSH , BTN_TOOL_MOUSE , BTN_TOOL_DOUBLETAP , BTN_TOOL_TRIPLETAP Takım BTN_TOOL_QUADTAP .
  • Çoklu dokunuşlu cihazlar aşağıdaki Linux giriş olaylarını kullanır:
    • ABS_MT_POSITION_X : (Gerekli) Aracın X koordinatını rapor eder.
    • ABS_MT_POSITION_Y : (Gerekli) Aracın Y koordinatını rapor eder.
    • ABS_MT_PRESSURE : (İsteğe bağlı) Aracın ucuna uygulanan fiziksel basıncı veya dokunma kontağının sinyal mukavemetini bildirir.
    • ABS_MT_TOUCH_MAJOR : (İsteğe bağlı) Dokunma kontağının enine kesit alanını veya dokunma kontağının daha uzun boyutunun uzunluğunu bildirir.
    • ABS_MT_TOUCH_MINOR : (İsteğe bağlı) dokunmatik temasın daha kısa boyutunun uzunluğunu bildirir. ABS_MT_TOUCH_MAJOR bir alan ölçümü bildiriyorsa bu eksen kullanılmamalıdır.
    • ABS_MT_WIDTH_MAJOR : (İsteğe bağlı) Aracın kendisinin kesit alanını veya aletin kendisinin daha uzun boyutunun uzunluğunu bildirir. Aracın boyutlarını bilmediğiniz sürece bu ekseni kullanmayın.
    • ABS_MT_WIDTH_MINOR : (İsteğe bağlı) Aracın kendisinin daha kısa boyutunun uzunluğunu bildirir. ABS_MT_WIDTH_MAJOR bir alan ölçümü rapor ediyorsa veya aracın boyutları bilinmiyorsa bu eksen kullanılmamalıdır.
    • ABS_MT_ORIENTATION : (İsteğe bağlı) Aracın yönünü bildirir.
    • ABS_MT_DISTANCE : (İsteğe bağlı) Aracın dokunmatik cihazın yüzeyinden uzaklığını bildirir.
    • ABS_MT_TOOL_TYPE : (İsteğe bağlı) Araç türünü MT_TOOL_FINGER veya MT_TOOL_PEN olarak bildirir.
    • ABS_MT_TRACKING_ID : (İsteğe bağlı) Aracın izleme kimliğini rapor eder. İzleme kimliği, birden fazla araç etkin olduğunda her aracı bağımsız olarak tanımlamak ve izlemek için kullanılan keyfi bir negatif olmayan tamsayıdır. Örneğin, cihaza birden fazla parmak dokunurken, her parmağa, parmak temas halinde kaldığı sürece kullanılan farklı bir izleme kimliğine atanmalıdır. İlişkili araçları menzil dışına çıktığında izleme kimlikleri yeniden kullanılabilir.
    • ABS_MT_SLOT : (İsteğe bağlı) Linux çoklu dokunuşlu 'B' kullanılırken aracın yuva kimliğini rapor eder. Daha fazla ayrıntı için Linux Çoklu Dokunlu Protokol Belgeleri'ne bakın.
    • BTN_TOUCH : (Gerekli) 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_LENS BTN_TOOL_BRUSH , BTN_TOOL_PENCIL , BTN_TOOL_AIRBRUSH , BTN_TOOL_MOUSE , BTN_TOOL_DOUBLETAP , BTN_TOOL_TRIPLETAP Takım BTN_TOOL_QUADTAP .
  • Hem tek dokunuşlu hem de çoklu dokunuşlu protokol için eksenler tanımlanırsa, yalnızca çoklu dokunuş eksenleri kullanılır ve tek dokunuşlu eksenler göz ardı edilir.
  • 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 aktif alanının sınırlarını tanımlar. Dokunmatik ekran durumunda, aktif alan dokunmatik cihazın ekranı gerçekten kapsayan kısmını açıklar.

    Bir dokunmatik ekran için, sistem, aşağıdaki hesaplamaya göre ekran piksellerinde dokunmatik konumlar elde etmek için yüzey birimlerinde bildirilen dokunmatik konumları otomatik olarak enterpolasyona sahiptir:

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

    Bir dokunmatik ekran, bildirilen aktif alanın dışındaki dokunuşları bildirebilir.

    Aktif alanın dışında başlatılan dokunuşlar uygulamalara teslim edilmez, ancak sanal anahtarlar için kullanılabilir.

    Aktif alanın içinde başlatılan veya ekran alanına giren ve çıkan dokunuşlar uygulamalara teslim edilir. Sonuç olarak, bir uygulamanın sınırları içinde bir dokunuş başlarsa ve daha sonra aktif alanın dışına hareket ederse, uygulama negatif veya ekranın sınırlarının ötesinde ekran koordinatlarına sahip dokunmatik olaylar alabilir. Bu beklenen bir davranıştır.

    Bir dokunmatik cihaz asla aktif alanın sınırlarına dokunma koordinatlarını sıkıştırmamalıdır. Bir dokunuş aktif alandan çıkarsa, aktif alanın dışında olduğu bildirilmeli veya hiç rapor edilmemelidir.

    Örneğin, kullanıcının parmağı dokunmatik ekranın sol üst köşesine yaklaşıyorsa, (Minx, Miny) koordinatını bildirebilir. Parmak aktif alanın dışında hareket etmeye devam ederse, dokunmatik ekran, (Minx - 2, Miny - 3) gibi Minx ve Miny'den daha düşük bileşenlerle koordinatları bildirmeye başlamalı veya dokunuşu tamamen bildirmeyi bırakmalıdır. Başka bir deyişle, kullanıcının parmağı aktif alanın dışında gerçekten dokunurken dokunmatik ekran raporlamamalıdır (Minx, Miny).

    Ekran kenarına sıkıştırma dokunuşu koordinatları, ekranın kenarında, sistemin ekran alanının sınırlarına giren veya sınırlarına giren sorunsuz bir şekilde izleme hareketlerini önleyen yapay bir sabit sınır oluşturur.

  • ABS_PRESSURE veya ABS_MT_PRESSURE tarafından bildirilen değerler, rapor edilirlerse, alet cihaza dokunurken sıfır olmamalı ve aksi takdirde, aletin sarktığını belirtmek için sıfır olmamalıdır.

    Basınç bilgilerinin raporlanması isteğe bağlıdır , ancak şiddetle tavsiye edilir. 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 ve sıfır olduğunda sıfır olmamalıdır, ancak bu gerekli değildir. Örneğin, dokunmatik cihaz parmak temas kontaklarının boyutunu ölçebilir, ancak kalem temas kontaklarını ölçebilir.

    Boyut bilgilerinin raporlanması isteğe bağlıdır , ancak şiddetle tavsiye edilir. 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, araç cihaza dokunurken sıfıra yaklaşmalıdır. Araç doğrudan temas halindeyken bile mesafe sıfır olmayabilir. Bildirilen kesin değerler, donanımın mesafeyi ölçme şekline bağlıdır.

    Mesafe bilgilerinin raporlanması isteğe bağlıdır , ancak Stylus cihazları için önerilir.

  • ABS_TILT_X ve ABS_TILT_Y tarafından bildirilen değerler, araç cihaza dik olduğunda sıfır olmalıdır. Sıfır olmayan bir eğim, aletin bir eğimde tutulduğunu gösterir.

    X ve Y eksenleri boyunca eğim açılarının dikey derecelerde belirtildiği varsayılır. Merkez nokta (mükemmel dik), her eksen için (max + min) / 2 ile verilir. Merkez noktasından daha küçük değerler, bir eğimi veya solda, merkez noktasından daha büyük değerler, bir eğimi aşağı veya sağda temsil eder.

    InputReader x ve y eğim bileşenlerini 0 ila PI / 2 radyan arasında değişen dikey bir eğim açısına ve -PI ile PI radyanları arasında değişen düzlemsel bir yönlendirme açısına dönüştürür. Bu temsil, parmak dokunuşlarını tanımlamak için kullanılanlarla uyumlu olan bir yönlendirme açıklamasıyla sonuçlanır.

    Tilt bilgilerinin raporlanması isteğe bağlıdır , ancak Stylus cihazları için önerilir.

  • Araç türü ABS_MT_TOOL_TYPE tarafından rapor edilirse, BTN_TOOL_* tarafından bildirilen herhangi bir araç türü bilgilerinin yerini alır. Hiçbir araç türü bilgisi yoksa, araç türü Varsayılan olarak MotionEvent.TOOL_TYPE_FINGER .

  • Bir aracın aşağıdaki koşullara göre aktif olduğu belirlenmiştir:

    • Tek dokunuşlu protokolü kullanırken, BTN_TOUCH veya BTN_TOOL_* 1 ise araç etkindir.

      Bu koşul, InputReader ya da dokunaklı olsun ya da en azından araç türü, aracın doğası hakkında en azından biraz bilgiye sahip olması gerektiğini ima eder. Hiçbir bilgi yoksa, aracın aktif olmadığı varsayılır (menzil dışında).

    • Çok dokunaklı 'A' protokolü kullanırken, araç en son senkronizasyon raporunda göründüğünde etkindir. Araç senkronizasyon raporlarında görünmeyi durdurduğunda, var olması sona erer.
    • Çok dokunaklı 'B' protokolü kullanırken, araç aktif bir yuvaya sahip olduğu sürece etkindir. Yuva temizlendiğinde, araç var olmayı bırakır.
  • Bir aracın aşağıdaki koşullara dayanarak havada kaldığı belirlenir:
    • Araç BTN_TOOL_MOUSE veya BTN_TOOL_LENS ise, aşağıdaki koşullardan herhangi biri doğru olsa bile araç havada kalmaz.
    • Araç etkinse ve sürücü basınç bilgilerini rapor ederse ve bildirilen basınç sıfırsa, araç uçar.
    • Araç etkinse ve sürücü BTN_TOUCH tuş kodunu desteklerse ve BTN_TOUCH sıfır değeri varsa, araç sarkıyor.
  • InputReader hem çoklu dokunuşlu 'A' hem de 'B' protokolünü destekler. Yeni sürücüler 'B' protokolünü kullanmalı ancak her ikisi de işe yarar.
  • Android 4.0 itibariyle, Linux giriş protokolü spesifikasyonuna uymak için dokunmatik ekran sürücülerinin değiştirilmesi gerekebilir.

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

    • Bir araç aktif olmadığında (parmak "yukarı" gider), sonraki çoklu dokunuş senkronizasyon raporlarında görünmeyi bırakmalıdır. Tüm araçlar aktif hale geldiğinde (tüm parmaklar "yukarı" gider), sürücü SYN_MT_REPORT ve ardından SYN_REPORT gibi boş bir senkronizasyon raporu paketi göndermelidir.

      Android'in önceki sürümleri "UP" olaylarının 0'lık bir basınç değeri göndererek rapor edilmesini bekliyor. Eski davranış, Linux giriş protokolü spesifikasyonu ile uyumsuzdu ve artık desteklenmiyor.

    • Fiziksel basınç veya sinyal gücü bilgisi ABS_MT_PRESSURE kullanılarak rapor edilmelidir.

      Android'in önceki sürümleri ABS_MT_TOUCH_MAJOR baskı bilgilerini aldı. Eski davranış Linux giriş protokolü spesifikasyonu ile uyumsuzdu ve artık desteklenmiyor.

    • Dokunma Boyutu bilgileri ABS_MT_TOUCH_MAJOR kullanılarak rapor edilmelidir.

      Android'in önceki sürümleri ABS_MT_TOOL_MAJOR boyut bilgilerini aldı. Eski davranış Linux giriş protokolü spesifikasyonu ile uyumsuzdu ve artık desteklenmiyor.

    Touch cihaz sürücülerinin artık Android'e özgü özelleştirmelerine ihtiyaç duymuyor. Standart Linux giriş protokolüne dayanarak Android, değiştirilmemiş sürücüler kullanarak harici HID çoklu dokunmatik dokunmatik ekranlar gibi daha geniş bir dokunmatik çevre.

Dokunmatik Cihaz İşlemi

Aşağıda Android'deki dokunmatik cihaz işleminin kısa bir özetidir.

  1. EventHub evdev sürücüsünden ham olayları okur.
  2. InputReader ham olayları tüketir ve her bir aracın konumu ve diğer özellikleri hakkındaki dahili durumu günceller. Ayrıca düğme durumlarını da izler.
  3. Geri veya ileri basıldıysa veya serbest bırakıldıysa, InputReader InputDispatcher kilit olay hakkında bildirir.
  4. InputReader sanal bir tuş presinin meydana gelip gelmediğini belirler. Eğer öyleyse, InputDispatcher kilit olay hakkında bilgilendirir.
  5. InputReader dokunuşun ekranın sınırları içinde başlatılıp başlatılmadığını belirler. Eğer öyleyse, InputDispatcher dokunma etkinliği hakkında bilgilendirir.
  6. Dokunma aracı yoksa, ancak en az bir vuruş aracı varsa, InputReader InputDispatcher Hover etkinliği hakkında bilgilendirir.
  7. Dokunmatik aygıt türü işaretçi ise, InputReader işaretçi hareketi algılamasını gerçekleştirir, işaretçiyi ve noktaları buna göre hareket ettirir ve InputDispatcher işaretçi olayı hakkında bildirir.
  8. InputDispatcher olayların 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 teslim eder.

Cihaz Yapılandırması'na Dokunma

Dokunmatik cihaz davranışı cihazın eksenleri, düğmeleri, giriş özellikleri, giriş aygıtı yapılandırması, sanal anahtar haritası ve anahtar düzeni ile belirlenir.

Klavye yapılandırmasına katılan 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ş aygıtı yapılandırma özelliklerine dayanır.

Bunun bir nedeni, dokunmatik cihazlar için cihaz sürücülerinin genellikle cihaza özgü birimleri kullanarak dokunuşların özelliklerini bildirmesidir.

Örneğin, birçok dokunmatik cihaz, dokunuşla tetiklenen toplam sensör düğümleri gibi dahili cihaza özgü bir ölçek kullanarak dokunma temas alanını ölçer. Bu ham boyut değeri uygulamalar için anlamlı olmayacaktır, çünkü dokunmatik aygıt sensörü düğümlerinin fiziksel boyutu ve diğer özellikleri hakkında bilgi sahibi olmaları gerekir.

Sistem, dokunmatik aygıtı tarafından bildirilen değerleri uygulamaların anlayabileceği daha basit bir standart gösterime kodlamak, dönüştürmek ve normalleştirmek için giriş aygıtı yapılandırma dosyalarında kodlanan kalibrasyon parametrelerini kullanır.

Dokümantasyon Sözleşmeleri

Dokümantasyon amacıyla, kalibrasyon işlemi sırasında sistem tarafından kullanılan değerleri tanımlamak için aşağıdaki sözleşmeleri kullanıyoruz.

Ham eksen değerleri

Aşağıdaki ifadeler, dokunmatik aygıt sürücüsü tarafından EV_ABS olayları 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 veya 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 mevcut değilse raw.touchMajor .
raw.toolMajor
ABS_TOOL_WIDTH veya ABS_MT_WIDTH_MAJOR ekseninin değeri veya mevcut değilse 0.
raw.toolMinor
ABS_MT_WIDTH_MINOR ekseninin değeri veya mevcut değilse 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 veya 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.

Çiğ eksen aralıkları

Aşağıdaki ifadeler ham değerlerin sınırlarını gösterir. Her eksen için EVIOCGABS IOCTL çağrılarak elde edilirler.

raw.*.min
Ham eksenin kapsayıcı minimum değeri.
raw.*.max
Ham eksenin kapsayıcı maksimum değeri.
raw.*.range
raw.*.max - raw.*.min .
raw.*.fuzz
Ham eksenin doğruluğu. Örneğin. Fuzz = 1, değerlerin +/- 1 birimine doğru olduğunu ima eder.
raw.width
raw.x.range + 1 eşdeğer dokunmatik alanın kapsayıcı genişliği.
raw.height
raw.y.range + 1 eşdeğer dokunmatik alanın kapsayıcı yüksekliği.

Çıktı aralıkları

Aşağıdaki ifadeler çıktı koordinat sisteminin özelliklerini gösterir. Sistem, dokunmatik cihaz tarafından kullanılan yüzey birimlerinden dokunma konumu bilgilerini, ekran pikselleri gibi uygulamalara bildirilen çıkış birimlerine çevirmek için doğrusal enterpolasyon kullanır.

output.width
Çıkış genişliği. For touch screens (associated with a display), this is the display width in pixels. For touch pads (not associated with a display), the output width equals raw.width , indicating that no interpolation is performed.
output.height
The output height. For touch screens (associated with a display), this is the display height in pixels. For touch pads (not associated with a display), the output height equals raw.height , indicating that no interpolation is performed.
output.diag
The diagonal length of the output coordinate system, equivalent to sqrt(output.width ^2 + output.height ^2) .

Temel yapılandırma

The touch input mapper uses many configuration properties in the input device configuration file to specify calibration values. The following table describes some general purpose configuration properties. All other properties are described in the following sections along with the fields they are used to calibrate.

touch.deviceType

Definition: touch.deviceType = touchScreen | touchPad | pointer | default

Specifies the touch device type.

  • If the value is touchScreen , the touch device is a touch screen associated with a display.

  • If the value is touchPad , the touch device is a touch pad not associated with a display.

  • If the value is pointer , the touch device is a touch pad not associated with a display, and its motions are used for indirect multi-touch pointer gestures .

  • If the value is default , the system automatically detects the device type according to the classification algorithm.

Refer to the Classification section for more details about how the device type influences the behavior of the touch device.

In Android 3 and lower, all touch devices were assumed to be touch screens.

touch.orientationAware

Definition: touch.orientationAware = 0 | 1

Specifies whether the touch device should react to display orientation changes.

  • If the value is 1 , touch positions reported by the touch device are rotated whenever the display orientation changes.

  • If the value is 0 , touch positions reported by the touch device are immune to display orientation changes.

The default value is 1 if the device is a touch screen, 0 otherwise.

The system distinguishes between internal and external touch screens and displays. An orientation aware internal touch screen is rotated based on the orientation of the internal display. An orientation aware external touch screen is rotated based on the orientation of the external display.

Orientation awareness is used to support rotation of touch screens on devices like the Nexus One. For example, when the device is rotated clockwise 90 degrees from its natural orientation, the absolute positions of touches are remapped such that a touch in the top-left corner of the touch screen's absolute coordinate system is reported as a touch in the top-left corner of the display's rotated coordinate system. This is done so that touches are reported with the same coordinate system that apps use to draw their visual elements.

Prior to Honeycomb, all touch devices were assumed to be orientation aware.

touch.gestureMode

Definition: touch.gestureMode = pointer | spots | default

Specifies the presentation mode for pointer gestures. This configuration property is only relevant when the touch device is of type pointer .

  • If the value is pointer , the touch pad gestures are presented by way of a cursor similar to a mouse pointer.

  • If the value is spots , the touch pad gestures are presented by an anchor that represents the centroid of the gesture and a set of circular spots that represent the position of individual fingers.

The default value is pointer when the INPUT_PROP_SEMI_MT input property is set, or spots otherwise.

X and Y fields

The X and Y fields provide positional information for the center of the contact area.

Hesaplama

The calculation is straightforward: positional information from the touch driver is linearly interpolated to the output coordinate system.

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, size fields

The touchMajor and touchMinor fields describe the approximate dimensions of the contact area in output units (pixels).

The toolMajor and toolMinor fields describe the approximate dimensions of the tool itself in output units (pixels).

The size field describes the normalized size of the touch relative to the largest possible touch that the touch device can sense. The smallest possible normalized size is 0.0 (no contact, or it is unmeasurable), and the largest possible normalized size is 1.0 (sensor area is saturated).

When both the approximate length and breadth can be measured, then the touchMajor field specifies the longer dimension and the touchMinor field specifies the shorter dimension of the contact area. When only the approximate diameter of the contact area can be measured, then the touchMajor and touchMinor fields are equal.

Likewise, the toolMajor field specifies the longer dimension and the toolMinor field specifies the shorter dimension of the tool's cross-sectional area.

If the touch size is unavailable but the tool size is available, then the tool size is set equal to the touch size. Conversely, if the tool size is unavailable but the touch size is available, then the touch size is set equal to the tool size.

Touch devices measure or report the touch size and tool size in various ways. The current implementation supports three different kinds of measurements: diameter, area, and geometric bounding box in surface units.

Definition: touch.size.calibration = none | geometric | diameter | area | default

Specifies the kind of measurement used by the touch driver to report the touch size and tool size.

  • If the value is none , the size is set to zero.

  • If the value is geometric , the size is assumed to be specified in the same surface units as the position, so it is scaled in the same manner.

  • If the value is diameter , the size is assumed to be proportional to the diameter (width) of the touch or tool.

  • If the value is area , the size is assumed to be proportional to the area of the touch or tool.

  • If the value is default , the system uses the geometric calibration if the raw.touchMajor or raw.toolMajor axis is available, otherwise it uses the none calibration.

touch.size.scale

Definition: touch.size.scale = <a non-negative floating point number>

Specifies a constant scale factor used in the calibration.

The default value is 1.0 .

touch.size.bias

Definition: touch.size.bias = <a non-negative floating point number>

Specifies a constant bias value used in the calibration.

The default value is 0.0 .

touch.size.isSummed

Definition: touch.size.isSummed = 0 | 1

Specifies whether the size is reported as the sum of the sizes of all active contacts, or is reported individually for each contact.

  • If the value is 1 , the reported size is divided by the number of contacts prior to use.

  • If the value is 0 , the reported size is used as is.

The default value is 0 .

Some touch devices, particularly "Semi-MT" devices cannot distinguish the individual dimensions of multiple contacts so they report a size measurement that represents their total area or width. This property should only be set to 1 for such devices. If in doubt, set this value to 0 .

Hesaplama

The calculation of the touchMajor , touchMinor , toolMajor , toolMinor , and size fields depends on the specified calibration parameters.

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

pressure field

The pressure field describes the approximate physical pressure applied to the touch device as a normalized value between 0.0 (no touch) and 1.0 (normal pressure).

A zero pressure indicates that the tool is hovering.

touch.pressure.calibration

Definition: touch.pressure.calibration = none | physical | amplitude | default

Specifies the kind of measurement used by the touch driver to report the pressure.

  • If the value is none , the pressure is unknown so it is set to 1.0 when touching and 0.0 when hovering.

  • If the value is physical , the pressure axis is assumed to measure the actual physical intensity of pressure applied to the touch pad.

  • If the value is amplitude , the pressure axis is assumed to measure the signal amplitude, which is related to the size of the contact and the pressure applied.

  • If the value is default , the system uses the physical calibration if the pressure axis available, otherwise uses none .

touch.pressure.scale

Definition: touch.pressure.scale = <a non-negative floating point number>

Specifies a constant scale factor used in the calibration.

The default value is 1.0 / raw.pressure.max .

Hesaplama

The calculation of the pressure field depends on the specified calibration parameters.

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

orientation and tilt fields

The orientation field describes the orientation of the touch and tool as an angular measurement. An orientation of 0 indicates that the major axis is oriented vertically, -PI/2 indicates that the major axis is oriented to the left, PI/2 indicates that the major axis is oriented to the right. When a stylus tool is present, the orientation range can be described in a full circle range from -PI or PI .

The tilt field describes the inclination of the tool as an angular measurement. A tilt of 0 indicates that the tool is perpendicular to the surface. A tilt of PI/2 indicates that the tool is flat on the surface.

touch.orientation.calibration

Definition: touch.orientation.calibration = none | interpolated | vector | default

Specifies the kind of measurement used by the touch driver to report the orientation.

  • If the value is none , the orientation is unknown so it is set to 0.
  • If the value is interpolated , the orientation is linearly interpolated such that a raw value of raw.orientation.min maps to -PI/2 and a raw value of raw.orientation.max maps to PI/2 . The center value of (raw.orientation.min + raw.orientation.max) / 2 maps to 0 .
  • If the value is vector , the orientation is interpreted as a packed vector consisiting of two signed 4-bit fields. This representation is used on Atmel Object Based Protocol parts. When decoded, the vector yields an orientation angle and confidence magnitude. The confidence magnitude is used to scale the size information, unless it is geometric.
  • If the value is default , the system uses the interpolated calibration if the orientation axis available, otherwise uses none .

Hesaplama

The calculation of the orientation and tilt fields depends on the specified calibration parameters and available input.

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

distance field

The distance field describes the distance between the tool and the touch device surface. A value of 0.0 indicates direct contact and larger values indicate increasing distance from the surface.

touch.distance.calibration

Definition: touch.distance.calibration = none | scaled | default

Specifies the kind of measurement used by the touch driver to report the distance.

  • If the value is none , the distance is unknown so it is set to 0.

  • If the value is scaled , the reported distance is multiplied by a constant scale factor.

  • If the value is default , the system uses the scaled calibration if the distance axis available, otherwise uses none .

touch.distance.scale

Definition: touch.distance.scale = <a non-negative floating point number>

Specifies a constant scale factor used in the calibration.

The default value is 1.0 .

Hesaplama

The calculation of the distance field depends on the specified calibration parameters.

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

Compatibility notes

The configuration properties for touch devices changed significantly in Android Ice Cream Sandwich 4.0. All input device configuration files for touch devices must be updated to use the new configuration properties.

Older touch device drivers might also need to be updated.

Virtual key map files

Touch devices can be used to implement virtual keys.

There are several ways of doing this, depending on the capabilities of the touch controller. Some touch controllers can be directly configured to implement soft keys by setting firmware registers. Other times it is desirable to perform the mapping from touch coordinates to key codes in software.

When virtual keys are implemented in software, the kernel must export a virtual key map file called virtualkeys.<devicename> as a board property. For example, if the touch screen device drivers reports its name as "touchyfeely" then the virtual key map file must have the path /sys/board_properties/virtualkeys.touchyfeely .

A virtual key map file describes the coordinates and Linux key codes of virtual keys on the touch screen.

In addition to the virtual key map file, there must be a corresponding key layout file and key character map file to map the Linux key codes to Android key codes and to specify the type of the keyboard device (usually SPECIAL_FUNCTION ).

Sözdizimi

A virtual key map file is a plain text file consisting of a sequence of virtual key layout descriptions either separated by newlines or by colons.

Comment lines begin with '#' and continue to the end of the line.

Each virtual key is described by 6 colon-delimited components:

  • 0x01 : A version code. Must always be 0x01 .
  • <Linux key code>: The Linux key code of the virtual key.
  • <centerX>: The X pixel coordinate of the center of the virtual key.
  • <centerY>: The Y pixel coordinate of the center of the virtual key.
  • <width>: The width of the virtual key in pixels.
  • <height>: The height of the virtual key in pixels.

All coordinates and sizes are specified in terms of the display coordinate system.

Here is a virtual key map file all written on one line.

# 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

The same virtual key map file can also be written on multiple lines.

# 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

In the above example, the touch screen has a resolution of 480x800. Accordingly, all of the virtual keys have a <centerY> coordinate of 835, which is a little bit below the visible area of the touch screen.

The first key has a Linux scan code of 158 ( KEY_BACK ), centerX of 55 , centerY of 835 , width of 90 , and height of 55 .

Örnek

Virtual key map file: /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

Key layout file: /system/usr/keylayout/touchyfeely.kl .

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

Key character map file: /system/usr/keychars/touchyfeely.kcm .

type SPECIAL_FUNCTION

Indirect multi-touch pointer gestures

In pointer mode, the system interprets the following gestures:

  • Single finger tap: click.
  • Single finger motion: move the pointer.
  • Single finger motion plus button presses: drag the pointer.
  • Two finger motion both fingers moving in the same direction: drag the area under the pointer in that direction. The pointer itself does not move.
  • Two finger motion both fingers moving towards each other or apart in different directions: pan/scale/rotate the area surrounding the pointer. The pointer itself does not move.
  • Multiple finger motion: freeform gesture.

Palm rejection

As of Android 13, the system can automatically reject inputs from palms when the built-in framework is enabled. In-house, custom-built solutions are still supported, though they might need to be modified to return the TOOL_TYPE_PALM flag when a palm is detected. The built-in framework also works in conjunction with custom solutions.

The actual model looks at the first 90 ms of gesture data, at the current pointer, and at the surrounding pointers, then considers how far away from the display edge the touches are. It then determines, on a per-pointer basis, which of the pointers are palms. It also takes into account the size of each contact, as reported by touchMajor and touchMinor . The Android framework then removes the pointers that are marked as palms from the touch stream.

If a pointer was already sent to the apps, then the system either:

  • (If there are other active pointers) Cancels the pointer with ACTION_POINTER_UP and FLAG_CANCELED set.
  • (If this is the only pointer) Cancels the pointer with ACTION_CANCEL .

A public API, MotionEvent.FLAG_CANCELED , indicates that the current event shouldn't trigger user action. This flag is set for both ACTION_CANCEL and ACTION_POINTER_UP .

If the palm pointer wasn't sent to apps, then the system simply drops the pointer.

Enable palm rejection

  1. In your touch driver, use the input_abs_set_res macro to set the resolutions for the following fields (units are pixels per mm ):
    • ABS_MT_POSITION_X
    • ABS_MT_POSITION_Y
    • ABS_MT_TOUCH_MAJOR
    • ABS_MT_TOUCH_MINOR

    Support for ABS_MT_TOUCH_MINOR is optional. However, if your device does support it, make sure the resolution is set correctly.

  2. To confirm the fields are set correctly, run:
        $ adb shell getevent -li
    
  3. To enable the feature during runtime, run:
        $ adb shell device_config put input_native_boot palm_rejection_enabled 1
    
  4. Restart the system_server process.
         $ adb shell stop && adb shell start
        
  5. Confirm that adb shell dumpsys input shows that there are palm rejectors inside UnwantedInteractionBlocker . If it doesn't, check the input-related logs to find clues on what might be misconfigured.

    See the following example for reference:

    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. To permanently enable the feature, add the corresponding sysprop command in your init**rc file:

    setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
    

daha fazla okuma