Android, ekran kalemi tabanlı sayısallaştırıcı tabletler de dahil olmak üzere çeşitli dokunmatik ekranları ve dokunmatik yüzeyleri destekler.
Dokunmatik ekranlar, kullanıcının ekrandaki öğeleri doğrudan manipüle etme izlenimine sahip olduğu 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 tipik olarak, bir kullanıcı arabiriminin işaret etmek veya mutlak dolaylı konumlandırması 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 ekran kalemi gibi çeşitli farklı araçlar kullanılarak manipüle edilebilir.
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ı
Aşağıdaki koşulların her ikisi de geçerliyse, bir giriş aygıtı çoklu dokunma aygıtı olarak sınıflandırılır:
Giriş cihazı,
ABS_MT_POSITION_Xve
ABS_MT_POSITION_Ymutlak eksenlerinin varlığını bildirir.
Giriş aygıtında herhangi bir gamepad düğmesi yoktur. Bu koşul, eksenleri MT eksenlerininkilerle örtüşen kodlarla bildiren belirli oyun kumandalarındaki bir belirsizliği giderir.
Aşağıdaki koşulların her ikisi de geçerliyse, bir giriş aygıtı tek dokunuşlu aygıt olarak sınıflandırılır:
Giriş cihazı, çoklu dokunmatik cihaz olarak sınıflandırılmamıştır. Bir giriş aygıtı ya tek dokunuşlu aygıt ya da çoklu dokunmatik aygıt olarak sınıflandırılır, asla ikisi birden olmaz.
Giriş cihazı,
ABS_Xve
ABS_Ymutlak eksenlerinin varlığını ve
BTN_TOUCHanahtar kodunun varlığını bildirir.
Bir giriş aygıtı bir dokunmatik aygıt olarak sınıflandırıldığında, sanal anahtarların varlığı, aygıt için sanal anahtar eşleme dosyası yüklenmeye çalışılarak belirlenir. Bir sanal anahtar haritası mevcutsa, cihaz için anahtar yerleşim dosyası da yüklenir.
Sanal anahtar eşleme dosyalarının konumu ve biçimi hakkında aşağıdaki bölüme bakın.
Ardından sistem, dokunmatik cihaz için giriş cihazı yapılandırma dosyasını yükler.
Tüm yerleşik dokunmatik cihazlarda giriş cihazı yapılandırma dosyaları olmalıdır. Giriş aygıtı yapılandırma dosyası yoksa sistem, harici USB veya Bluetooth HID dokunmatik ekranlar veya dokunmatik yüzeyler gibi tipik genel amaçlı dokunmatik çevre birimleri için uygun bir varsayılan yapılandırma seçecektir. Bu varsayılanlar, yerleşik dokunmatik ekranlar için tasarlanmamıştır ve büyük olasılıkla yanlış davranışa yol açacaktır.
Giriş cihazı konfigürasyonu 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 bir dokunmatik ekran cihazı kullanılır. Kullanıcı doğrudan ekrana dokunduğundan, sistem manipüle edilen nesneleri belirtmek için herhangi bir ek olanak gerektirmez.
Belirli bir sensör alanındaki dokunuşlar hakkında 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 faydalı olabilir.
Bir imleç kullanarak ekrandaki nesnelerin dolaylı manipülasyonu için bir işaretçi cihazı kullanılır. Parmaklar, çoklu dokunma işaretçi hareketleri olarak yorumlanır. Kalemler gibi diğer araçlar, mutlak konumlar kullanılarak yorumlanır.
Daha fazla bilgi için Dolaylı Çoklu Dokunma İşaretçi Hareketlerine bakın.
Giriş cihazını dokunmatik ekran , dokunmatik yüzey veya işaretçi cihazı olarak sınıflandırmak için aşağıdaki kurallar kullanılır.
touch.deviceTypeözelliği ayarlanmışsa, cihaz tipi belirtildiği gibi ayarlanacaktır.
Giriş cihazı
INPUT_PROP_DIRECTgiriş özelliğinin varlığını bildirirse (
EVIOCGPROPioctl aracılığıyla), cihaz tipi dokunmatik ekran olarak ayarlanacaktı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_POINTERgiriş özelliğinin varlığını bildirirse (
EVIOCGPROPioctl aracılığıyla), cihaz tipi pointer olarak ayarlanacaktır.
Giriş cihazı,
REL_Xveya
REL_Ygöreli eksenlerinin varlığını bildirirse, cihaz tipi dokunmatik yüzey olarak ayarlanacaktır. Bu koşul, hem fare hem de dokunmatik yüzeyden oluşan giriş aygıtları için bir belirsizliği giderir. Bu durumda, fare zaten onu kontrol ettiği için dokunmatik yüzey işaretçiyi kontrol etmek için kullanılmayacaktır.
Aksi takdirde, cihaz türü işaretçi olarak ayarlanacaktır. Bu varsayılan, başka herhangi bir özel amaç belirlenmemiş dokunmatik yüzeylerin işaretçiyi kontrol etmeye hizmet etmesini sağlar.
Düğmeler
Düğmeler, ek işlevleri gerçekleştirmek için uygulamalar tarafından kullanılabilen isteğe bağlı kontrollerdir. Dokunmatik aygıtlardaki düğmeler, fare düğmelerine benzer şekilde davranır ve çoğunlukla işaretçi tipi dokunmatik aygıtlarla veya ekran kalemi ile kullanılır.
Aşağıdaki düğmeler desteklenir:
BTN_LEFT:
MotionEvent.BUTTON_PRIMARYile eşlendi.
BTN_RIGHT:
MotionEvent.BUTTON_SECONDARYile eşlendi.
BTN_MIDDLE:
MotionEvent.BUTTON_MIDDLEile eşlendi.
BTN_BACKve
BTN_SIDE:
MotionEvent.BUTTON_BACKile eşlendi. Bu düğmeye basmak ayrıca bir tuşa
KeyEvent.KEYCODE_BACKanahtar koduyla sentezler.
BTN_FORWARDve
BTN_EXTRA:
MotionEvent.BUTTON_FORWARDile eşlendi. Bu düğmeye basmak ayrıca bir tuşa
KeyEvent.KEYCODE_FORWARDanahtar koduyla sentezler.
BTN_STYLUS:
MotionEvent.BUTTON_SECONDARYile eşlendi.
BTN_STYLUS2:
MotionEvent.BUTTON_TERTIARYile eşlendi.
Araçlar ve Araç Tipleri
Araç , dokunmatik cihazla etkileşim kurmak için kullanılan bir parmak, ekran kalemi veya başka bir aparattır. Bazı dokunmatik cihazlar, farklı araç türlerini ayırt edebilir.
Android'de başka yerlerde,
MotionEvent API'sinde olduğu gibi, bir araca genellikle işaretçi denir.
Aşağıdaki araç türleri desteklenir:
BTN_TOOL_FINGERve
MT_TOOL_FINGER:
MotionEvent.TOOL_TYPE_FINGERile eşlendi.
BTN_TOOL_PENve
MT_TOOL_PEN:
MotionEvent.TOOL_TYPE_STYLUSile eşlendi.
BTN_TOOL_RUBBER:
MotionEvent.TOOL_TYPE_ERASERile eşlendi.
BTN_TOOL_BRUSH:
MotionEvent.TOOL_TYPE_STYLUSile eşlendi.
BTN_TOOL_PENCIL:
MotionEvent.TOOL_TYPE_STYLUSile eşlendi.
BTN_TOOL_AIRBRUSH:
MotionEvent.TOOL_TYPE_STYLUSile eşlendi.
BTN_TOOL_MOUSE:
MotionEvent.TOOL_TYPE_MOUSEile eşlendi.
BTN_TOOL_LENS:
MotionEvent.TOOL_TYPE_MOUSEile eşlendi.
BTN_TOOL_DOUBLETAP,
BTN_TOOL_TRIPLETAPve
BTN_TOOL_QUADTAP:
MotionEvent.TOOL_TYPE_FINGERile eşlendi.
Gezinme ve Dokunma Araçları
Araçlar, dokunmatik cihazla temas halinde veya menzil içinde ve üzerinde geziniyor olabilir. Tüm dokunmatik cihazlar, dokunmatik cihazın üzerinde gezinen bir aracın varlığını algılayamaz. RF tabanlı stylus sayısallaştırıcılar gibi bunu yapanlar, genellikle aletin sayısallaştırıcının sınırlı bir aralığında olduğunu algılayabilir.
InputReader bileşeni, dokunma araçlarını gezinen araçlardan ayırmaya özen gösterir. Aynı şekilde dokunma araçları ve gezinme araçları da uygulamalara farklı şekillerde bildirilir.
Dokunma araçları,
MotionEvent.ACTION_DOWN ,
MotionEvent.ACTION_MOVE ,
MotionEvent.ACTION_DOWN ,
MotionEvent.ACTION_POINTER_DOWN ve
MotionEvent.ACTION_POINTER_UP kullanılarak uygulamalara dokunma olayları olarak bildirilir.
Gezinme 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 gerçekten destekledikleri eksenler ve düğmeler için eksenleri ve anahtar kodlarını kaydetmelidir. Fazla eksenleri veya anahtar kodlarını kaydetmek, cihaz sınıflandırma algoritmasını karıştırabilir veya sistemin cihazın özelliklerini yanlış algılamasına neden olabilir.
Örneğin, cihaz
BTN_TOUCHanahtar kodunu bildirirse, sistem, aracın gerçekten ekrana dokunup dokunmadığını belirtmek için her zaman
BTN_TOUCHkullanılacağını varsayacaktır. Bu nedenle,
BTN_TOUCH, aracın yalnızca menzil içinde ve havada asılı olduğunu belirtmek için kullanılmamalıdır.
Tek dokunuşlu cihazlar aşağıdaki Linux giriş olaylarını kullanır:
ABS_X: (GEREKLİ) Takımın X koordinatını bildirir.
ABS_Y: (GEREKLİ) Takımın Y koordinatını bildirir.
ABS_PRESSURE: (opsiyonel) Aletin ucuna uygulanan fiziksel basıncı veya dokunmatik kontağın sinyal gücünü bildirir.
ABS_TOOL_WIDTH: (isteğe bağlı) Dokunmatik kontağın veya aracın kendisinin enine kesit alanını veya genişliğini bildirir.
ABS_DISTANCE: (opsiyonel) Aletin dokunmatik cihazın yüzeyinden mesafesini bildirir.
ABS_TILT_X: (isteğe bağlı) X ekseni boyunca dokunmatik cihazın yüzeyinden takımın eğimini bildirir.
ABS_TILT_Y: (isteğe bağlı) Y ekseni boyunca dokunmatik cihazın yüzeyinden takımın eğimini bildirir.
BTN_TOUCH: (GEREKLİ) Aletin cihaza dokunup dokunmadığını gösterir.
BTN_LEFT,
BTN_RIGHT,
BTN_MIDDLE,
BTN_BACK,
BTN_SIDE,
BTN_FORWARD,
BTN_EXTRA,
BTN_STYLUS,
BTN_STYLUS2: (opsiyonel) Düğme durumlarını bildirir.
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_QUADTAPbağlı olarak rapor .
Çoklu dokunmatik cihazlar aşağıdaki Linux giriş olaylarını kullanır:
ABS_MT_POSITION_X: (GEREKLİ) Aracın X koordinatını bildirir.
ABS_MT_POSITION_Y: (GEREKLİ) Aracın Y koordinatını bildirir.
ABS_MT_PRESSURE: (opsiyonel) Aletin ucuna uygulanan fiziksel basıncı veya dokunmatik kontağın sinyal gücünü bildirir.
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 daha kısa boyutunun uzunluğunu bildirir.
ABS_MT_TOUCH_MAJORbir alan ölçümü bildiriyorsa bu eksen kullanılmamalıdır.
ABS_MT_WIDTH_MAJOR: (isteğe bağlı) Aracın kendisinin enine kesit alanını veya aracın kendisinin daha uzun boyutunun uzunluğunu bildirir. Takımın boyutları bilinmiyorsa bu eksen kullanılmamalıdır.
ABS_MT_WIDTH_MINOR: (isteğe bağlı) Aracın kendisinin daha kısa boyutunun uzunluğunu bildirir.
ABS_MT_WIDTH_MAJORbir alan ölçümü bildiriyorsa veya takımın boyutları bilinmiyorsa bu eksen kullanılmamalıdır.
ABS_MT_ORIENTATION: (isteğe bağlı) Aracın yönünü bildirir.
ABS_MT_DISTANCE: (isteğe bağlı) Aletin dokunmatik cihazın yüzeyinden mesafesini bildirir.
ABS_MT_TOOL_TYPE: (opsiyonel) Takım tipini
MT_TOOL_FINGERveya
MT_TOOL_PENolarak 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 keyfi bir tamsayıdır. Örneğin, cihaza birden fazla parmak dokunduğunda, her parmağa, parmak temas halinde kaldığı sürece kullanılan ayrı bir izleme kimliği atanmalıdır. İzleme kimlikleri, ilişkili araçları aralık dışına çıktığında yeniden kullanılabilir.
ABS_MT_SLOT: (isteğe bağlı) Linux çoklu dokunma protokolü 'B' kullanılırken aracın yuva kimliğini raporlar. Daha fazla ayrıntı için Linux çoklu dokunma protokolü belgelerine bakın.
BTN_TOUCH: (GEREKLİ) Aletin cihaza dokunup dokunmadığını gösterir.
BTN_LEFT,
BTN_RIGHT,
BTN_MIDDLE,
BTN_BACK,
BTN_SIDE,
BTN_FORWARD,
BTN_EXTRA,
BTN_STYLUS,
BTN_STYLUS2: (opsiyonel) Düğme durumlarını bildirir.
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_QUADTAPbağlı olarak rapor .
Hem tek dokunuş hem de çoklu dokunma protokolü için eksenler tanımlanırsa, yalnızca çoklu dokunma eksenleri kullanılır ve tek dokunma eksenleri yok sayılır.
ABS_X,
ABS_Y,
ABS_MT_POSITION_Xve
ABS_MT_POSITION_Yeksenlerinin minimum ve maksimum değerleri, cihaza özel 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 kaplayan bölümünü tanımlar.
Bir dokunmatik ekran için sistem, aşağıdaki hesaplamaya göre ekran piksellerinde dokunma konumlarını elde etmek için yüzey birimlerinde rapor edilen dokunma konumlarını otomatik olarak enterpolasyon yapar:
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 dışında başlatılan dokunuşlar uygulamalara iletilmez ancak sanal tuşlar için kullanılabilir.
Aktif alan içinde başlatılan veya görüntü alanına giren ve çıkan dokunuşlar uygulamalara iletilir. Sonuç olarak, bir dokunma bir uygulamanın sınırları içinde başlar ve daha sonra aktif alanın dışına çıkarsa, uygulama, negatif veya ekranın sınırlarının ötesinde olan ekran koordinatlarına sahip dokunma olayları alabilir. Bu beklenen davranıştır.
Bir dokunmatik cihaz, dokunma koordinatlarını asla aktif alanın sınırlarına bağlamamalıdır. Bir dokunuş aktif alandan çıkarsa, aktif alan dışında olduğu bildirilmeli veya hiç bildirilmemelidir.
Örneğin, kullanıcının parmağı dokunmatik ekranın sol üst köşesine yakın bir yere dokunuyorsa, (minX, minY) koordinatını bildirebilir. Parmak aktif alanın dışına doğru hareket etmeye devam ederse, dokunmatik ekran, (minX - 2, minY - 3) gibi minX ve minY'den daha küçük bileşenlerle koordinatları raporlamaya başlamalı veya dokunmayı tamamen bildirmeyi 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 (minX, minY) raporlama yapmamalıdır .
Dokunma koordinatlarını ekran kenarına kenetlemek, ekranın kenarı çevresinde, sistemin görüntü alanının sınırlarına giren veya çıkan hareketleri düzgün bir şekilde izlemesini engelleyen yapay bir sert sınır oluşturur.
ABS_PRESSUREveya
ABS_MT_PRESSUREtarafından rapor edilen değerler, eğer rapor edilmişlerse, takım cihaza dokunduğunda sıfırdan farklı, aksi halde takımın gezindiğini belirtmek için sıfır olmalıdır.
Basınç bilgilerinin bildirilmesi 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_MAJORveya
ABS_MT_WIDTH_MINORtarafından bildirilen değerler, alet cihaza dokunduğunda sıfırdan farklı, aksi takdirde sıfır olmalıdır, ancak bu gerekli değildir. Örneğin, dokunmatik cihaz, parmakla dokunma temas noktalarının boyutunu ölçebilir, ancak kalemle dokunma temas noktalarının boyutunu ölçebilir.
Boyut bilgilerinin bildirilmesi 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_DISTANCEveya
ABS_MT_DISTANCEtarafından bildirilen değerler, alet cihaza dokunduğunda sıfıra yaklaşmalıdır. Alet doğrudan temas halindeyken bile mesafe sıfır olmayabilir. Bildirilen kesin değerler, donanımın mesafeyi ölçme biçimine bağlıdır.
Mesafe bilgilerinin bildirilmesi isteğe bağlıdır , ancak ekran kalemi cihazları için önerilir.
Takım cihaza dik olduğunda
ABS_TILT_Xve
ABS_TILT_Ytarafından bildirilen değerler sıfır olmalıdır. Sıfır olmayan bir eğim, aletin bir eğimde tutulduğunun bir göstergesi olarak alınır.
X ve Y eksenleri boyunca eğim açılarının dikeyden derece olarak belirlendiği varsayılır. Merkez noktası (tam dik) her eksen için
(max + min) / 2ile verilir. Merkez noktasından daha küçük değerler yukarı veya sola eğimi, merkez noktadan daha büyük değerler aşağı veya sağa eğimi temsil eder.
InputReader, X ve Y eğim bileşenlerini 0 ila
PI / 2radyan arasında değişen dikey bir eğim açısına ve
-PIila
PIradyan arasında değişen bir düzlemsel yönlendirme açısına dönüştürür. Bu temsil, parmak dokunuşlarını tarif etmek için kullanılanla uyumlu olan bir yönelim tanımıyla sonuçlanır.
Eğim bilgilerinin bildirilmesi isteğe bağlıdır ancak ekran kalemi aygıtları için önerilir.
Takım tipi
ABS_MT_TOOL_TYPEtarafından bildirilirse,
BTN_TOOL_*tarafından rapor edilen herhangi bir takım tipi bilgisinin yerine geçecektir. Hiçbir takım tipi bilgisi mevcut değilse, takım tipi varsayılan olarak
MotionEvent.TOOL_TYPE_FINGERolur.
Aşağıdaki koşullara göre bir aracın etkin olduğu belirlenir:
Tek dokunuş protokolünü kullanırken,
BTN_TOUCHveya
BTN_TOOL_*1 ise araç etkindir.
Bu koşul,
InputReader, ister dokunmalı olsun ister en azından araç tipi olsun, aracın doğası hakkında en azından bir miktar bilgiye sahip olması gerektiği anlamına gelir. Hiçbir bilgi mevcut değilse, aletin etkin olmadığı (aralık dışında) olduğu varsayılır.
Çoklu dokunma protokolü 'A' kullanılırken, araç en son senkronizasyon raporunda göründüğünde etkindir. Araç, senkronizasyon raporlarında görünmeyi bıraktığında, varlığı da sona erer.
Çoklu dokunma protokolü 'B' kullanılırken, aktif bir yuvası olduğu sürece alet aktiftir. Yuva temizlendiğinde, aracın varlığı sona erer.
Aşağıdaki koşullara göre bir aracın havada asılı kaldığı belirlenir:
Araç
BTN_TOOL_MOUSEveya
BTN_TOOL_LENSise, aşağıdaki koşullardan herhangi biri doğru olsa bile araç gezinmiyor.
Takım etkinse ve sürücü basınç bilgilerini rapor ediyorsa ve rapor edilen basınç sıfırsa, o zaman takım havada geziniyor demektir.
Araç etkinse ve sürücü
BTN_TOUCHanahtar kodunu destekliyorsa ve
BTN_TOUCHsıfır değerine sahipse, araç geziniyor demektir.
InputReader, hem 'A' hem de 'B' çoklu dokunma protokolünü destekler. Yeni sürücüler 'B' protokolünü kullanmalıdır, ancak her ikisi de çalışacaktır.
Android Ice Cream Sandwich 4.0'dan itibaren, Linux giriş protokolü belirtimine uymak için dokunmatik ekran sürücülerinin değiştirilmesi gerekebilir.
Aşağıdaki değişiklikler gerekli olabilir:
Bir araç devre dışı kaldığında (parmak "yukarı" gider), sonraki multi-touch senkronizasyon raporlarında görünmeyi bırakmalıdır. Tüm araçlar devre dışı kaldığında (tüm parmaklar "yukarı" hareket eder), sürücü SYN_MT_REPORT ve ardından
SYN_MT_REPORTgibi boş bir eşitleme raporu paketi
SYN_REPORT.
Android'in önceki sürümleri, 0'lık bir basınç değeri göndererek "yukarı" olaylarının bildirilmesini bekliyordu. Eski davranış, Linux giriş protokolü belirtimi ile uyumlu değildi ve artık desteklenmiyor.
Fiziksel basınç veya sinyal gücü bilgisi
ABS_MT_PRESSUREkullanılarak bildirilmelidir.
Android'in önceki sürümleri,
ABS_MT_TOUCH_MAJORbasınç bilgilerini aldı. Eski davranış, Linux giriş protokolü belirtimi ile uyumlu değildi ve artık desteklenmiyor.
Dokunma boyutu bilgisi
ABS_MT_TOUCH_MAJORkullanılarak bildirilmelidir.
Android'in önceki sürümleri,
ABS_MT_TOOL_MAJORboyut bilgilerini aldı. Eski davranış, Linux giriş protokolü belirtimi ile uyumlu değildi 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 güvenerek, değiştirilmemiş sürücüler kullanarak harici HID çoklu dokunmatik dokunmatik ekranlar gibi çok çeşitli dokunmatik çevre birimlerini destekleyebilir.
Dokunmatik Cihaz Çalışması
Aşağıdakiler, Android'de dokunmatik cihaz işleminin kısa bir özetidir.
EventHub,
evdevsürücüsünden ham olayları okur.
InputReader, ham olayları tüketir ve her aracın konumu ve diğer özellikleriyle ilgili dahili durumu günceller. Ayrıca düğme durumlarını da izler.
GERİ veya İLERİ düğmelerine basıldıysa veya serbest bırakıldıysa,
InputReader,
InputDispatcheranahtar olay hakkında bilgilendirir.
InputReader, bir sanal tuşa basılmasının gerçekleşip gerçekleşmediğini belirler. Eğer öyleyse,
InputDispatcheranahtar olay hakkında bilgilendirir.
InputReader, dokunmanın ekranın sınırları içinde başlatılıp başlatılmadığını belirler. Eğer öyleyse,
InputDispatcherdokunma olayı hakkında bilgi verir.
Dokunma aracı yoksa, ancak en az bir gezinme aracı varsa,
InputReader,
InputDispatchervurgulu olayı hakkında bilgilendirir.
Dokunmatik cihaz türü işaretçi ise,
InputReaderişaretçi hareketi algılamasını gerçekleştirir, işaretçiyi hareket ettirir ve buna göre noktalar belirler ve işaretçi olayı hakkında
InputDispatcherbilgilendirir.
InputDispatcher, olayların gönderilip gönderilmeyeceğini ve aygıtı uyandırıp uyandırmayacağını belirlemek için
WindowManagerPolicykullanır. Ardından,
InputDispatcherolayları uygun uygulamalara iletir.
Dokunmatik Cihaz Yapılandırması
Dokunmatik cihaz davranışı, cihazın eksenleri, düğmeleri, giriş özellikleri, giriş cihazı yapılandırması, sanal tuş haritası ve tuş dü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:
Özellikleri
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ıtlar için aygıt sürücülerinin, genellikle aygıta özel birimler kullanarak dokunmaların özelliklerini bildirmesidir.
Örneğin, birçok dokunmatik cihaz, dokunma tarafından tetiklenen toplam sensör düğümü sayısı gibi dahili bir cihaza özel ölçek kullanarak dokunmatik temas alanını ölçer. Bu ham boyut değeri, dokunmatik cihaz sensör düğümlerinin fiziksel boyutu ve diğer özellikleri hakkında bilgi sahibi olmaları gerekeceğinden, uygulamalar için anlamlı olmayacaktır.
Sistem, dokunmatik cihaz tarafından bildirilen değerleri, uygulamaların anlayabileceği daha basit bir standart temsile dönüştürmek, dönüştürmek ve normalleştirmek için giriş cihazı yapılandırma dosyalarında kodlanmış kalibrasyon parametrelerini kullanır.
Dokümantasyon Sözleşmeleri
Belgeleme amacıyla, kalibrasyon işlemi sırasında sistem tarafından kullanılan değerleri tanımlamak için aşağıdaki kuralları kullanacağız.
Ham Eksen Değerleri
Aşağıdaki ifadeler, dokunmatik aygıt sürücüsü tarafından
EV_ABS olayları olarak rapor edilen ham değerleri belirtir.
-
raw.x
-
ABS_Xveya
ABS_MT_POSITION_Xekseninin değeri.
-
raw.y
-
ABS_Yveya
ABS_MT_POSITION_Yekseninin değeri.
-
raw.pressure
-
ABS_PRESSUREveya
ABS_MT_PRESSUREekseninin değeri veya mevcut değilse 0.
-
raw.touchMajor
-
ABS_MT_TOUCH_MAJORekseninin değeri veya mevcut değilse 0.
-
raw.touchMinor
-
ABS_MT_TOUCH_MINORekseninin değeri veya mevcut değilse
raw.touchMajor.
-
raw.toolMajor
-
ABS_TOOL_WIDTHveya
ABS_MT_WIDTH_MAJORekseninin değeri veya mevcut değilse 0.
-
raw.toolMinor
-
ABS_MT_WIDTH_MINORekseninin değeri veya mevcut değilse
raw.toolMajor.
-
raw.orientation
-
ABS_MT_ORIENTATIONekseninin değeri veya mevcut değilse 0.
-
raw.distance
-
ABS_DISTANCEveya
ABS_MT_DISTANCEekseninin değeri veya mevcut değilse 0.
-
raw.tiltX
-
ABS_TILT_Xekseninin değeri veya mevcut değilse 0.
-
raw.tiltY
-
ABS_TILT_Yekseninin değeri veya mevcut değilse 0.
Ham Eksen Aralıkları
Aşağıdaki ifadeler ham değerlerin sınırlarını belirtir. 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.*.minile eşdeğerdir.
-
raw.*.fuzz
- Ham eksenin doğruluğu. Örneğin. fuzz = 1, değerlerin +/- 1 birime kadar doğru olduğunu gösterir.
-
raw.width
- Dokunma alanının kapsayıcı genişliği,
raw.x.range + 1eşdeğerdir.
-
raw.height
- Dokunma alanının kapsayıcı yüksekliği,
raw.y.range + 1eşdeğerdir.
Çıkış Aralıkları
Aşağıdaki ifadeler, çıktı koordinat sisteminin özelliklerini belirtir. Sistem, dokunmatik cihaz tarafından kullanılan yüzey birimlerinden dokunmatik konum bilgilerini, ekran pikselleri gibi uygulamalara bildirilecek olan çıkış birimlerine çevirmek 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şkilendirilmemiş), çıktı genişliği, enterpolasyon yapılmayacağını belirten
raw.widthdeğerine eşittir.
-
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şkilendirilmemiş), çıkış yüksekliği, enterpolasyon yapılmayacağını belirten
raw.heightdeğerine eşittir.
-
output.diag
- Çıktı koordinat sisteminin köşegen uzunluğu,
sqrt(output.width ^2 + output.height ^2).
Temel yapılandırma
Dokunmatik giriş eşleyici, kalibrasyon değerlerini belirtmek için giriş cihazı konfigürasyon dosyasındaki birçok konfigürasyon ö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 kullandıkları alanlarla birlikte aşağıdaki bölümlerde açıklanmıştır.
touch.deviceType
Tanım:
touch.deviceType =
touchScreen |
touchPad |
pointer |
default
Dokunmatik cihaz türünü belirtir.
Değer
touchScreenise, dokunmatik cihaz bir ekranla ilişkili bir dokunmatik ekrandır.
Değer
touchPadise, dokunmatik cihaz bir ekranla ilişkili olmayan bir dokunmatik yüzeydir.
Değer
pointerise, dokunmatik cihaz bir ekranla ilişkili olmayan bir dokunmatik yüzeydir ve hareketleri dolaylı çoklu dokunmatik işaretçi hareketleri için kullanılır.
Değer
defaultise sistem, sınıflandırma algoritmasına göre cihaz tipini 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.
Honeycomb'dan önce, tüm dokunmatik cihazların dokunmatik ekranlar olduğu varsayılırdı.
touch.orientationAware
Tanım:
touch.orientationAware =
0 |
1
Dokunmatik aygıtın görüntüleme yönü değişikliklerine tepki vermesi gerekip gerekmediğini belirtir.
Değer
1ise, dokunmatik cihaz tarafından bildirilen dokunma konumları, ekran yönü değiştiğinde döndürülür.
Değer
0ise, dokunmatik cihaz tarafından bildirilen dokunma konumları, yön değişikliklerini görüntülemeye karşı bağışıktır.
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öne duyarlı bir dahili dokunmatik ekran, dahili ekranın yönüne göre döndürülür. Yöne duyarlı bir harici dokunmatik ekran, harici ekranın yönüne göre döndürülür.
Yön farkındalığı, Nexus One gibi cihazlarda dokunmatik ekranların döndürülmesini desteklemek için kullanılır. Örneğin, cihaz doğal konumundan saat yönünde 90 derece döndürüldüğünde, dokunmaların mutlak konumları, dokunmatik ekranın mutlak koordinat sisteminin sol üst köşesindeki bir dokunuş, sol üstte bir dokunuş olarak rapor edilecek şekilde 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ıkları aynı koordinat sistemiyle raporlanması için yapılır.
Honeycomb'dan önce, tüm dokunmatik cihazların oryantasyon farkında olduğu varsayılırdı.
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 işaretçi türünde olduğunda geçerlidir.
Değer
pointerise, dokunmatik yüzey hareketleri fare işaretçisine benzer bir imleç aracılığıyla sunulur.
Değer
spotsise, dokunmatik yüzey hareketleri, hareketin merkezini temsil eden bir çapa 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 halde
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 bilgileri, çıktı koordinat sistemine doğrusal olarak enterpolasyon yapılır.
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 Alanları
TouchMajor ve
TouchMinor alanları, çıkış birimlerinde (pikseller) temas alanının yaklaşık boyutlarını tanımlar.
ToolMajor ve
ToolMinor alanları, aracın kendisinin yaklaşık boyutlarını çıktı birimlerinde (pikseller) tanımlar.
Size alanı, dokunmatik aygıtın algılayabileceği olası en büyük dokunmaya göre normalleştirilmiş dokunma boyutunu tanımlar. 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ı daha uzun boyutu,
TouchMinor alanı ise temas alanının daha kısa boyutunu belirtir. Temas alanının yalnızca yaklaşık çapı ölçülebildiğinde,
TouchMajor ve
TouchMinor alanları eşit olacaktır.
Benzer şekilde,
ToolMajor alanı daha uzun boyutu belirtir ve
ToolMinor alanı, takımın enine kesit alanının daha kısa boyutunu belirtir.
Dokunma boyutu mevcut değilse ancak alet boyutu mevcutsa, alet boyutu dokunma boyutuna eşit olarak ayarlanır. Tersine, alet boyutu mevcut değilse ancak dokunmatik boyutu mevcutsa, dokunmatik boyutu alet boyutuna eşit olarak ayarlanacaktır.
Dokunmatik cihazlar, dokunmatik boyutu ve alet boyutunu çeşitli şekillerde ölçer veya raporlar. Mevcut uygulama üç farklı türde ölçümü destekler: yüzey birimlerinde çap, alan ve geometrik sınırlayıcı kutu.
touch.size.calibration
Tanım:
touch.size.calibration =
none |
geometric |
diameter |
area |
default
Dokunma boyutunu ve alet boyutunu bildirmek için dokunmatik sürücü tarafından kullanılan ölçüm türünü belirtir.
Değer
noneise, boyut sıfıra ayarlanır.
Değer
geometricise, boyutun konumla aynı yüzey birimlerinde belirtildiği varsayılır, bu nedenle aynı şekilde ölçeklenir.
Değer
diameterise, boyutun dokunma veya aracın çapı (genişliği) ile orantılı olduğu varsayılır.
Değer
areaise, boyutun dokunma veya aracın alanıyla orantılı olduğu varsayılır.
Değer
defaultise, sistem
raw.touchMajorveya
raw.toolMajorekseni mevcutsa
geometrickalibrasyonu kullanır, aksi takdirde
nonekalibrasyonunu kullanır.
touch.size.scale
Tanım:
touch.size.scale = <negatif olmayan bir kayan noktalı sayı>
Kalibrasyonda kullanılan sabit bir ölçek faktörünü belirtir.
Varsayılan değer
1.0 .
touch.size.bias
Tanım:
touch.size.bias = <negatif olmayan bir kayan noktalı 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ı raporlandığını belirtir.
Değer
1ise, bildirilen boyut kullanımdan önceki kişi sayısına bölünecektir.
Değer
0ise, bildirilen boyut olduğu gibi kullanılacaktır.
Varsayılan değer
0 .
Bazı dokunmatik cihazlar, özellikle "Yarı-MT" cihazlar, birden fazla kontağın bireysel boyutlarını ayırt edemezler, bu nedenle toplam alanlarını veya genişliklerini temsil eden bir boyut ölçümü bildirirler. Bu özellik, bu tür cihazlar için 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
Pressure Alanı
Pressure alanı, dokunmatik cihaza uygulanan yaklaşık fiziksel basıncı 0.0 (dokunma yok) ile 1.0 (tam güç) arasında normalleştirilmiş bir değer olarak tanımlar.
Sıfır basınç, aletin havada asılı kaldığını gösterir.
touch.pressure.calibration
Tanım:
touch.pressure.calibration =
none |
physical |
amplitude |
default
Basıncı bildirmek için dokunmatik sürücü tarafından kullanılan ölçüm türünü belirtir.
Değer
noneise, basınç bilinmiyor, bu nedenle dokunulduğunda 1.0 ve gezinirken 0.0 olarak ayarlanır.
Değer
physicalise, basınç ekseninin dokunmatik yüzeye uygulanan basıncın gerçek fiziksel yoğunluğunu ölçtüğü varsayılır.
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
physicalcalibration 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 .
Calculation
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 may 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.minmaps to
-PI/2and a raw value of
raw.orientation.maxmaps to
PI/2. The center value of
(raw.orientation.min + raw.orientation.max) / 2maps 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
interpolatedcalibration if the orientation axis available, otherwise uses
none.
Calculation
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
scaledcalibration 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 .
Calculation
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
Example
# 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 will 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 may also need to be updated.
Virtual Key Map Files
Touch devices are often 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 ).
Syntax
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 .
Example
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 edge of the display 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_UPand
FLAG_CANCELEDset.
- (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
- In your touch driver, use the
input_abs_set_resmacro 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_MINORis optional. However, if your device does support it, make sure the resolution is set correctly.
-
- To confirm the fields are set correctly, run:
$ adb shell getevent -li
- To enable the feature during runtime, run:
$ adb shell device_config put input_native_boot palm_rejection_enabled 1
- Restart the
system_serverprocess.
$ adb shell stop && adb shell start
- Confirm that
adb shell dumpsys inputshows 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: {}
- To permanently enable the feature, add the corresponding sysprop command in your
init**rcfile:
setprop persist.device_config.input_native_boot.palm_rejection_enabled 1