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ı) Araç 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ı) Araç 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 raporlanıyorsa, 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ığı veya 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 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 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, dolayısıyla 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 (tam kuvvet) 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 = <a negatif olmayan yüzer nokta numarası>

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.
  • raw.orientation.max interpolated edilirse PI/2 raw.orientation.min -PI/2 bir ham değeri çiğ. (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 genellikle sanal tuşları uygulamak için kullanılır.

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> adlı bir sanal anahtar haritası dosyasını dışa aktarmalıdır. Ö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