Android, ekran kalemi tabanlı sayısallaştırıcı tabletler dahil olmak üzere çeşitli dokunmatik ekranları ve dokunmatik yüzeyleri destekler.
Dokunmatik ekranlar, kullanıcının ekrandaki öğeleri doğrudan manipüle ettiği izlenimine sahip olduğu bir ekranla ilişkilendirilen dokunmatik cihazlardır.
Dokunmatik pedler, sayısallaştırıcı tablet gibi bir ekranla ilişkili olmayan dokunmatik cihazlardır. Dokunmatik yüzeyler tipik olarak bir kullanıcı arayüzünün işaret edilmesi veya mutlak dolaylı konumlandırması veya harekete dayalı kontrolü için kullanılır.
Dokunmatik cihazlarda, işlevleri fare düğmelerine benzeyen 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 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 dokunmatik tuş takımının bir parçası olarak ikili amaca hizmet eder.
Çok çeşitli dokunmatik cihazlar nedeniyle Android, her bir cihazın özelliklerini ve istenen davranışını açıklamak için çok sayıda yapılandırma özelliğine güvenir.
Dokunmatik Cihaz Sınıflandırması
Bir giriş cihazı, aşağıdaki koşulların her ikisi de geçerliyse çoklu dokunmatik cihaz olarak sınıflandırılır:
Giriş cihazı,
ABS_MT_POSITION_X
veABS_MT_POSITION_Y
mutlak eksenlerinin varlığını bildirir.Giriş aygıtında herhangi bir gamepad düğmesi yoktur. Bu durum, MT eksenlerininkilerle örtüşen kodlara sahip eksenleri bildiren belirli oyun kumandalarındaki bir 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ş aygıtı çoklu dokunmatik aygıt 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 ikisi birden değildir.
Giriş cihazı,
ABS_X
veABS_Y
mutlak eksenlerinin varlığını veBTN_TOUCH
anahtar kodunun varlığını bildirir.
Bir giriş cihazı dokunmatik cihaz olarak sınıflandırıldıktan sonra, cihaz için sanal anahtar eşleme dosyası yüklenmeye çalışılarak sanal anahtarların varlığı belirlenir. Bir sanal anahtar eşlemesi mevcutsa, aygıt için anahtar yerleşim dosyası da yüklenir.
Sanal anahtar eşleme dosyalarının konumu ve formatı hakkında aşağıdaki bölüme 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 pedler gibi tipik genel amaçlı dokunmatik çevre birimleri için uygun olan bir varsayılan yapılandırma seçecektir. Bu varsayılan değerler yerleşik dokunmatik ekranlar için tasarlanmamıştır ve büyük olasılıkla yanlış davranışlara neden olacaktır.
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 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 düzenlemeye ihtiyaç duymaz.
Belirli bir sensör alanına dokunmalar 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 yararlı olabilir.
Bir imleç kullanılarak ekrandaki nesnelerin dolaylı olarak değiştirilmesi için bir işaretçi aygıtı kullanılır. Parmaklar, çoklu dokunma işaretçisi hareketleri olarak yorumlanır. Kalemler gibi diğer araçlar, mutlak konumlar kullanılarak yorumlanır.
Daha fazla bilgi için bkz. Dolaylı Çoklu Dokunma İşaretçisi Hareketleri .
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 ayarlanırsa, 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 tipi dokunmatik ekran olarak ayarlanacaktır. Bu koşul, doğrudan girişli dokunmatik aygıtların yine 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 tipi işaretçi olarak ayarlanır.Giriş cihazı,
REL_X
veyaREL_Y
göreli eksenlerinin varlığını bildirirse, cihaz tipi dokunmatik yüzey olarak ayarlanacaktır. Bu durum, hem fare hem de dokunmatik yüzeyden oluşan giriş aygıtları için bir belirsizliği giderir. Bu durumda, fare zaten kontrol ettiği için dokunmatik yüzey işaretçiyi kontrol etmek için kullanılmayacaktır.Aksi takdirde, cihaz tipi işaretçi olarak ayarlanacaktır. Bu varsayılan, başka herhangi bir özel amaç için atanmamış dokunmatik yüzeylerin imleci kontrol etme işlevini görmesini sağlar.
düğmeler
Düğmeler, uygulamalar tarafından ek işlevleri gerçekleştirmek için 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 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
veBTN_SIDE
:MotionEvent.BUTTON_BACK
ile eşlenir. Bu düğmeye basmak ayrıca bir tuşaKeyEvent.KEYCODE_BACK
anahtar koduyla sentezler.BTN_FORWARD
veBTN_EXTRA
:MotionEvent.BUTTON_FORWARD
ile eşlendi. Bu düğmeye basmak ayrıca bir tuşaKeyEvent.KEYCODE_FORWARD
anahtar koduyla sentezler.BTN_STYLUS
:MotionEvent.BUTTON_SECONDARY
ile eşlendi.BTN_STYLUS2
:MotionEvent.BUTTON_TERTIARY
ile eşlendi.
Aletler ve Alet Tipleri
Alet , dokunmatik cihazla etkileşime geçmek için kullanılan bir parmak, kalem veya başka bir aparattır. Bazı dokunmatik cihazlar, farklı araç türleri arasında ayrım yapabilir.
MotionEvent
API'de olduğu gibi, Android'in başka yerlerinde bir araca genellikle işaretçi denir.
Aşağıdaki araç türleri desteklenir:
BTN_TOOL_FINGER
veMT_TOOL_FINGER
:MotionEvent.TOOL_TYPE_FINGER
ile eşlendi.BTN_TOOL_PEN
veMT_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
veBTN_TOOL_QUADTAP
:MotionEvent.TOOL_TYPE_FINGER
ile eşlendi.
Gezinme ve Dokunma Araçları
Aletler, dokunmatik cihazla temas halinde olabilir veya menzil içinde ve üzerinde gezinebilir. Tüm dokunmatik cihazlar, dokunmatik cihazın üzerinde gezinen bir aracın varlığını algılayamaz. RF tabanlı ekran kalemi sayısallaştırıcılar gibi bunu yapanlar, aracın sayısallaştırıcının sınırlı bir aralığında olduğunu genellikle algılayabilir.
InputReader
bileşeni, dokunma araçlarını gezinme araçlarından ayırmaya özen gösterir. Aynı şekilde dokunma araçları ve gezinme araçları da farklı şekillerde uygulamalara raporlanır.
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 raporlanır.
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 fiilen destekledikleri eksenler ve düğmeler için eksenleri ve anahtar kodlarını kaydetmelidir. Fazla eksenlerin veya anahtar kodlarının kaydedilmesi, cihaz sınıflandırma algoritmasının kafasını karıştırabilir veya sistemin cihazın özelliklerini yanlış algılamasına neden olabilir.
Örneğin, cihaz
BTN_TOUCH
anahtar kodunu bildirirse, sistem, aracın gerçekten ekrana dokunup dokunmadığını belirtmek için her zamanBTN_TOUCH
kullanılacağını varsayacaktır. 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
: (GEREKLİ) Aletin X koordinatını bildirir.ABS_Y
: (GEREKLİ) Aletin Y koordinatını bildirir.ABS_PRESSURE
: (isteğe bağlı) 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
: (isteğe bağlı) Aletin 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ı) Aletin dokunmatik cihazın yüzeyinden Y ekseni boyunca eğimini bildirir.BTN_TOUCH
: (GEREKLİ) Aletin cihaza temas edip etmediğini gösterir.BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (opsiyonel) Rapor butonu durumları.BTN_TOOL_FINGER
,BTN_TOOL_PEN
,BTN_TOOL_RUBBER
,BTN_TOOL_BRUSH
,BTN_TOOL_PENCIL
,BTN_TOOL_AIRBRUSH
,BTN_TOOL_MOUSE
,BTN_TOOL_LENS
,BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
,BTN_TOOL_QUADTAP
: (isteğe bağlı) .
Çoklu dokunmatik cihazlar aşağıdaki Linux giriş olaylarını kullanır:
ABS_MT_POSITION_X
: (GEREKLİ) Aletin X koordinatını bildirir.ABS_MT_POSITION_Y
: (GEREKLİ) Aletin Y koordinatını bildirir.ABS_MT_PRESSURE
: (isteğe bağlı) 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 enine 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_MAJOR
bir alan ölçümü bildiriyorsa bu eksen kullanılmamalıdır.ABS_MT_WIDTH_MAJOR
: (isteğe bağlı) Aletin kendisinin enine kesit alanını veya aletin 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ı) Aletin kendisinin daha 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ı) Aletin dokunmatik cihazın yüzeyine olan mesafesini bildirir.ABS_MT_TOOL_TYPE
: (isteğe bağlı) Takım tipiniMT_TOOL_FINGER
veyaMT_TOOL_PEN
olarak bildirir.ABS_MT_TRACKING_ID
: (isteğe bağlı) Aracın izleme kimliğini bildirir. İzleme kimliği, birden fazla araç aktif olduğunda her 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 çok parmak dokunduğunda, her parmağa, temas halinde kaldığı sürece kullanılan ayrı bir izleme kimliği atanmalıdır. İzleme kimlikleri, ilişkili araçları menzil 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 bildirir. Daha fazla ayrıntı için Linux çoklu dokunma protokolü belgelerine bakın.BTN_TOUCH
: (GEREKLİ) Aletin cihaza temas edip etmediğini gösterir.BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (opsiyonel) Rapor butonu durumları.BTN_TOOL_FINGER
,BTN_TOOL_PEN
,BTN_TOOL_RUBBER
,BTN_TOOL_BRUSH
,BTN_TOOL_PENCIL
,BTN_TOOL_AIRBRUSH
,BTN_TOOL_MOUSE
,BTN_TOOL_LENS
,BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
,BTN_TOOL_QUADTAP
: (isteğe bağlı) .
Hem tek dokunma hem de çoklu dokunma protokolü için eksenler tanımlanırsa, yalnızca çoklu dokunma eksenleri kullanılacak ve tek dokunma eksenleri dikkate alınmayacaktır.
ABS_X
,ABS_Y
,ABS_MT_POSITION_X
veABS_MT_POSITION_Y
eksenlerinin minimum ve maksimum değerleri, cihaza özgü yüzey birimlerinde cihazın aktif alanının sınırlarını tanımlar. Dokunmatik ekran söz konusu olduğunda, etkin alan, dokunmatik cihazın ekranı fiilen 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 için yüzey birimlerinde bildirilen 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 dokunmaları bildirebilir.
Etkin alan dışında başlatılan dokunmalar, uygulamalara iletilmez ancak sanal anahtarlar için kullanılabilir.
Aktif alan içinde başlatılan veya görüntüleme alanına giren ve çıkan dokunuşlar uygulamalara iletilir. Sonuç olarak, bir dokunma bir uygulamanın sınırları içinde başlar ve ardından etkin alanın dışına çıkarsa, uygulama, görüntü koordinatları negatif olan veya görüntü sınırlarının ötesinde olan dokunma olayları alabilir. Bu beklenen bir davranıştır.
Bir dokunmatik cihaz, aktif alanın sınırlarına asla dokunma koordinatlarını sıkıştırmamalıdır. Aktif alandan bir dokunuş çıkarsa, aktif alanın dışında olduğu bildirilmeli veya hiç bildirilmemelidir.
Ö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 çıkmaya devam ederse, dokunmatik ekran ya (minX - 2, minY - 3) gibi minX ve minY'den küçük bileşenlerle koordinatları raporlamaya başlamalı ya da dokunmayı raporlamayı tamamen durdurmalı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ın kenarına sıkıştırmak, ekranın kenarında yapay bir sert sınır oluşturarak sistemin ekran alanının sınırlarına giren veya çıkan hareketleri sorunsuz bir şekilde izlemesini engeller.
ABS_PRESSURE
veyaABS_MT_PRESSURE
tarafından rapor edilen değerler, eğer rapor edilmişlerse, takım cihaza temas ettiğinde sıfır olmamalıdır ve aksi halde takımın havada durduğunu belirtmek için sıfır olmalıdır.Baskı bilgisinin 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_MAJOR
veyaABS_MT_WIDTH_MINOR
tarafından bildirilen değerler, araç cihaza temas ettiğinde sıfır, aksi halde sıfır olmalıdır, ancak bu gerekli değildir. Örneğin, dokunmatik cihaz parmakla dokunma temaslarının boyutunu ölçebilir ancak kalemle dokunma temas noktalarını ölçemez.Raporlama boyutu bilgileri isteğe bağlıdır ancak şiddetle tavsiye edilir. Uygulamalar, boyuta duyarlı çizim ve diğer efektleri uygulamak için basınç bilgilerini kullanabilir.
ABS_DISTANCE
veyaABS_MT_DISTANCE
tarafından bildirilen değerler, alet cihaza temas ettiğinde 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 kalemli cihazlar için önerilir.
Takım cihaza dik olduğunda
ABS_TILT_X
veABS_TILT_Y
tarafından bildirilen değerler sıfır olmalıdır. Aletin bir eğimde tutulduğunun bir göstergesi olarak sıfır olmayan bir eğim alınır.X ve Y eksenleri boyunca eğim açılarının dikeyden derece cinsinden belirtildiği varsayılır. Merkez noktası (tamamen dik) her eksen için
(max + min) / 2
ile verilir. Merkez noktadan küçük değerler yukarı veya sola eğimi, merkez noktadan büyük değerler aşağı veya sağa eğimi temsil eder.InputReader
, X ve Y eğim bileşenlerini 0 ilaPI / 2
radyan arasında değişen dikey bir eğim açısına ve-PI
ilaPI
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ı tarif etmek için kullanılanlarla uyumlu bir yönelim tanımıyla sonuçlanır.Eğim bilgilerinin raporlanması isteğe bağlıdır , ancak ekran kalemi cihazları için önerilir.
Araç tipi
ABS_MT_TOOL_TYPE
tarafından bildirilirse,BTN_TOOL_*
tarafından bildirilen tüm araç türü bilgilerinin yerini alacaktır. Hiçbir araç türü bilgisi mevcut değilse, araç türü varsayılan olarakMotionEvent.TOOL_TYPE_FINGER
olur.Bir aracın aşağıdaki koşullara göre etkin olduğu belirlenir:
Tek dokunuş protokolünü kullanırken,
BTN_TOUCH
veyaBTN_TOOL_*
1 ise araç etkindir.Bu koşul,
InputReader
, ister dokunuyor olsun, ister en azından alet tipi olsun, aletin doğası hakkında en azından bazı bilgilere sahip olması gerektiği anlamına gelir. Herhangi bir bilgi mevcut değilse, takımın etkin olmadığı (menzil dışında) olduğu varsayılır.Çoklu dokunma protokolü 'A' kullanılırken, araç en son senkronizasyon raporunda her 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, araç aktif bir yuvaya sahip olduğu sürece aktiftir. 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
veyaBTN_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 bildirirse ve bildirilen basınç sıfırsa, alet geziniyor demektir.
Alet etkinse ve sürücü
BTN_TOUCH
anahtar kodunu destekliyorsa veBTN_TOUCH
değeri sıfırsa, alet 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 ikisi de çalışacaktır.Android Ice Cream Sandwich 4.0'dan itibaren, dokunmatik ekran sürücülerinin Linux giriş protokolü spesifikasyonuna uyması için 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üntülenmeyi durdurmalıdır. Tüm araçlar devre dışı kaldığında (tüm parmaklar "yukarı" hareket ettiğinde), sürücü SYN_MT_REPORT ve ardından
SYN_MT_REPORT
gibi boş bir senkronizasyon raporu paketiSYN_REPORT
.Android'in önceki sürümleri, "yukarı" olaylarının 0 basınç değeri gönderilerek 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_PRESSURE
kullanılarak rapor edilmelidir.Android'in önceki sürümleri,
ABS_MT_TOUCH_MAJOR
basınç bilgilerini aldı. Eski davranış, Linux giriş protokolü belirtimi ile uyumlu değildi ve artık desteklenmiyor.Dokunma boyutu bilgisi
ABS_MT_TOUCH_MAJOR
kullanılarak bildirilmelidir.Android'in önceki sürümleri boyut bilgilerini
ABS_MT_TOOL_MAJOR
. Eski davranış, Linux giriş protokolü belirtimi ile uyumlu değildi ve artık desteklenmiyor.
Dokunmatik aygıt sürücüleri artık Android'e özgü özelleştirmelere ihtiyaç duymaz. Android, standart Linux giriş protokolüne güvenerek, değiştirilmemiş sürücüler kullanan harici HID çoklu dokunmatik dokunmatik ekranlar gibi çok çeşitli dokunmatik çevre birimlerini destekleyebilir.
Dokunmatik Cihaz İşlemi
Aşağıda, Android'deki dokunmatik cihaz işlemlerinin kısa bir özeti bulunmaktadır.
EventHub
,evdev
sürücüsünden ham olayları okur.InputReader
ham olayları kullanır ve her aracın konumu ve diğer özellikleri hakkında dahili durumu günceller. Ayrıca düğme durumlarını da izler.GERİ veya İLERİ düğmelerine basılırsa veya bırakılırsa,
InputReader
,InputDispatcher
anahtar olay hakkında bilgilendirir.InputReader
, sanal bir tuşa basma olup olmadığını belirler. Böyleyse, anahtar olayı hakkındaInputDispatcher
bilgilendirir.InputReader
, dokunmanın ekranın sınırları içinde başlatılıp başlatılmadığını belirler. Böyleyse, dokunma olayı hakkındaInputDispatcher
bilgilendirir.Dokunma aracı yoksa ancak en az bir gezinme aracı varsa,
InputDispatcher
, hover olayı hakkındaInputReader
bilgilendirir.Dokunmatik aygıt türü işaretçi ise,
InputReader
işaretçi hareketi algılaması gerçekleştirir, işaretçiyi hareket ettirir ve buna göre noktalar belirler ve Pointer olayı hakkındaInputDispatcher
bilgilendirir.InputDispatcher
, olayların gönderilip gönderilmeyeceğini ve aygıtı uyandırıp uyandırmayacağını belirlemek içinWindowManagerPolicy
kullanır. Ardından,InputDispatcher
olayları uygun uygulamalara iletir.
Cihaz Yapılandırmasına dokunun
Dokunmatik cihaz davranışı, cihazın eksenleri, düğmeleri, giriş özellikleri, giriş cihazı yapılandırması, sanal anahtar 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 güvenir.
Bunun bir nedeni, dokunmatik aygıtlar için aygıt sürücülerinin genellikle dokunma özelliklerini aygıta özel birimler kullanarak bildirmesidir.
Örneğin, birçok dokunmatik cihaz, dokunmatik temas alanını, dokunma tarafından tetiklenen sensör düğümlerinin toplam sayısı gibi cihaza özgü dahili bir ölçek kullanarak ölçer. Bu ham boyut değeri, uygulamalar için anlamlı olmayacaktır çünkü dokunmatik cihaz algılayıcı düğümlerinin fiziksel boyutu ve diğer özellikleri hakkında bilgi sahibi olmaları gerekecektir.
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 kodlanmış kalibrasyon parametrelerini kullanır.
Dokümantasyon Kuralları
Dokümantasyon amacıyla, kalibrasyon işlemi sırasında sistem tarafından kullanılan değerleri açıklamak 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 bildirilen ham değerleri belirtir.
-
raw.x
-
ABS_X
veyaABS_MT_POSITION_X
ekseninin değeri. -
raw.y
-
ABS_Y
veyaABS_MT_POSITION_Y
ekseninin değeri. -
raw.pressure
-
ABS_PRESSURE
veyaABS_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 yoksaraw.touchMajor
. -
raw.toolMajor
-
ABS_TOOL_WIDTH
veyaABS_MT_WIDTH_MAJOR
ekseninin değeri veya mevcut değilse 0. -
raw.toolMinor
-
ABS_MT_WIDTH_MINOR
ekseninin değeri veya yoksaraw.toolMajor
. -
raw.orientation
-
ABS_MT_ORIENTATION
ekseninin değeri veya mevcut değilse 0. -
raw.distance
-
ABS_DISTANCE
veyaABS_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ı belirtir. Her eksen için EVIOCGABS
ioctl çağrılarak elde edilirler.
-
raw.*.min
- Ham eksenin dahil minimum değeri.
-
raw.*.max
- Ham eksenin kapsadığı maksimum değer.
-
raw.*.range
-
raw.*.max - raw.*.min
ile eşdeğerdir. -
raw.*.fuzz
- Ham eksenin doğruluğu. Örneğin. tüylenme = 1, değerlerin +/- 1 birime kadar doğru olduğunu ima eder.
-
raw.width
-
raw.x.range + 1
eşdeğer, dokunma alanının kapsadığı genişlik. -
raw.height
- Dokunma alanının dahil edilen yüksekliği,
raw.y.range + 1
eşdeğerdir.
Çıkış Aralıkları
Aşağıdaki ifadeler, çıktı koordinat sisteminin özelliklerini gösterir. Sistem, dokunmatik cihaz tarafından kullanılan yüzey birimlerinden dokunmatik konum bilgilerini, ekran pikselleri gibi uygulamalara bildirilecek olan çıktı birimlerine çevirmek için doğrusal enterpolasyonu kullanır.
-
output.width
- Çıkış genişliği. Dokunmatik ekranlar için (ekranla ilişkili), piksel cinsinden ekran genişliğidir. Dokunmatik yüzeyler için (bir ekranla ilişkili değildir), çıktı genişliği, hiçbir enterpolasyonun yapılmayacağını belirten
raw.width
değerine eşittir. -
output.height
- Çıkış yüksekliği. Dokunmatik ekranlar için (ekranla ilişkili), piksel cinsinden ekran yüksekliğidir. Dokunmatik yüzeyler için (bir ekranla ilişkili değildir), çıktı yüksekliği
raw.height
değerine eşittir ve bu, enterpolasyonun yapılmayacağını belirtir. -
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şleyici, kalibrasyon değerlerini belirlemek 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çıklanmıştır.
touch.deviceType
Tanım: touch.deviceType
= touchScreen
| touchPad
| pointer
| default
Dokunmatik cihaz tipini belirtir.
Değer
touchScreen
ise, dokunmatik cihaz bir ekranla ilişkilendirilmiş bir dokunmatik ekrandır.Değer
touchPad
ise, dokunmatik cihaz bir ekranla ilişkilendirilmemiş bir dokunmatik yüzeydir.Değer
pointer
ise, dokunmatik cihaz bir ekranla ilişkilendirilmemiş bir dokunmatik yüzeydir ve hareketleri dolaylı çoklu dokunma işaretçisi hareketleri için kullanılır.Değer
default
ise, 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 ekran olduğu varsayılıyordu.
touch.orientationAware
Tanım: touch.orientationAware
= 0
| 1
Dokunmatik aygıtın ekran yönü değişikliklerine tepki verip vermeyeceğini belirtir.
Değer
1
ise, dokunmatik cihaz tarafından bildirilen dokunma konumları, ekran yönü her değiştiğinde döndürülür.Değer
0
ise, dokunmatik cihaz tarafından bildirilen dokunma konumları, görüntü yönü değişikliklerinden etkilenmez.
Cihaz dokunmatik ekran ise varsayılan değer 1
, aksi halde 0
.
Sistem, dahili ve harici dokunmatik ekranlar ve ekranlar arasında ayrım yapar. Yöne duyarlı dahili dokunmatik ekran, dahili ekranın yönüne göre döndürülür. Oryantasyona duyarlı harici dokunmatik ekran, harici ekranın yönüne göre döndürülür.
Yönlendirme 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şun sol üst köşede bir dokunuş olarak bildirileceği ş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'tan önce, tüm dokunmatik cihazların yönlendirmeye duyarlı olduğu varsayılmıştır.
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
pointer
ise, dokunmatik yüzey hareketleri, fare işaretçisine benzer bir imleç yoluyla sunulur.Değer
spots
ise, 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 spots
halde işaretlenir.
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 enterpolasyonludur.
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ı, temas alanının yaklaşık boyutlarını çıktı birimlerinde (piksel) tanımlar.
ToolMajor
ve ToolMinor
alanları, aracın kendisinin yaklaşık boyutlarını çıktı birimlerinde (piksel) tanımlar.
Size
alanı, dokunmatik cihazın algılayabileceği mümkün olan en büyük dokunuşa 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ş).
Hem yaklaşık uzunluk hem de genişlik ölçülebildiğinde, TouchMajor
alanı temas alanının daha uzun boyutunu ve TouchMinor
alanı 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.
Aynı şekilde ToolMajor
alanı, aletin kesit alanının daha uzun boyutunu ve ToolMinor
alanı daha kısa boyutunu belirtir.
Dokunma boyutu mevcut değilse ancak alet boyutu mevcutsa, araç boyutu dokunma boyutuna eşit olacaktır. Tersine, alet ebadı mevcut değilse ancak dokunma ebadı mevcutsa, o zaman dokunma ebadı alet ebadına eşit olarak ayarlanacaktır.
Dokunmatik cihazlar, dokunma boyutunu ve araç boyutunu çeşitli şekillerde ölçer veya raporlar. Mevcut uygulama üç farklı ölçüm türünü 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 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 dokunma veya aletin çapı (genişliği) ile orantılı olduğu varsayılır.Değer
area
ise, boyutun dokunma veya aracın alanıyla orantılı olduğu varsayılır.Değer
default
ise,raw.touchMajor
veyaraw.toolMajor
ekseni mevcutsa sistemgeometric
kalibrasyonu kullanır, aksi takdirdenone
kalibrasyonunu 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 önyargı 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ı rapor edildiğini belirtir.
Değer
1
ise, bildirilen boyut kullanımdan önce temas sayısına bölünecektir.Değer
0
ise, bildirilen boyut olduğu gibi kullanılacaktır.
Varsayılan değer 0
.
Bazı dokunmatik cihazlar, özellikle "Yarı MT" cihazlar, birden fazla kontağın ayrı ayrı boyutlarını ayırt edemezler, bu nedenle toplam alanlarını veya genişliklerini temsil eden bir boyut ölçümü bildirirler. Bu özellik sadece bu tür cihazlar için 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
none
ise, basınç bilinmez, bu nedenle dokunulduğunda 1,0 ve gezinirken 0,0 olarak ayarlanır.Değer
physical
ise, basınç ekseninin dokunmatik yüzeye uygulanan basıncın gerçek fiziksel yoğunluğunu ölçtüğü varsayılır.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 thephysical
calibration if the pressure axis available, otherwise usesnone
.
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 ofraw.orientation.min
maps to-PI/2
and a raw value ofraw.orientation.max
maps toPI/2
. The center value of(raw.orientation.min + raw.orientation.max) / 2
maps to0
.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 theinterpolated
calibration if the orientation axis available, otherwise usesnone
.
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 thescaled
calibration if the distance axis available, otherwise usesnone
.
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 be0x01
. - <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_UP
andFLAG_CANCELED
set. - (If this is the only pointer) Cancels the pointer with
ACTION_CANCEL
.
A public API, MotionEvent.FLAG_CANCELED
, indicates that the current event shouldn't trigger user action. This flag is set for both ACTION_CANCEL
and ACTION_POINTER_UP
.
If the palm pointer wasn't sent to apps, then the system simply drops the pointer.
Enable palm rejection
- In your touch driver, use the
input_abs_set_res
macro to set the resolutions for the following fields (units are pixels per mm ):-
ABS_MT_POSITION_X
-
ABS_MT_POSITION_Y
-
ABS_MT_TOUCH_MAJOR
-
ABS_MT_TOUCH_MINOR
Support for
ABS_MT_TOUCH_MINOR
is optional. However, if your device does support it, make sure the resolution is set correctly. -
- 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_server
process.$ adb shell stop && adb shell start
- Confirm that
adb shell dumpsys input
shows that there are palm rejectors insideUnwantedInteractionBlocker
. 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**rc
file:setprop persist.device_config.input_native_boot.palm_rejection_enabled 1