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
veABS_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
veABS_Y
mutlak eksenlerinin varlığını veBTN_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
veyaREL_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
veBTN_SIDE
:MotionEvent.BUTTON_BACK
ile eşlendi. Bu düğmeye basmak aynı zamandaKeyEvent.KEYCODE_BACK
anahtar koduyla bir tuşa basılmasını da sentezler. -
BTN_FORWARD
veBTN_EXTRA
:MotionEvent.BUTTON_FORWARD
ile eşlendi. Bu düğmeye basmak aynı zamandaKeyEvent.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
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.
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 zamanBTN_TOUCH
kullanıldığını varsayar. Bu nedenleBTN_TOUCH
, aracın yalnızca aralıkta olduğunu ve gezindiğini belirtmek için kullanılmamalıdır. - Tek dokunuşlu cihazlar aşağıdaki Linux giriş olaylarını kullanır:
-
ABS_X
: (ZORUNLU) Takımın X koordinatını bildirir. -
ABS_Y
: (GEREKLİ) Takımın Y koordinatını bildirir. -
ABS_PRESSURE
: (isteğe bağlı) Aletin ucuna uygulanan fiziksel basıncı veya dokunma kontağının sinyal gücünü rapor eder. -
ABS_TOOL_WIDTH
: (isteğe bağlı) Dokunmatik kontağın veya aracın kendisinin kesit alanını veya genişliğini bildirir. -
ABS_DISTANCE
: (isteğe bağlı) Aracın dokunmatik cihazın yüzeyine olan mesafesini bildirir. -
ABS_TILT_X
: (isteğe bağlı) Aracın dokunmatik cihazın yüzeyinden X ekseni boyunca eğimini bildirir. -
ABS_TILT_Y
: (isteğe bağlı) Aracın dokunmatik cihazın yüzeyinden Y ekseni boyunca eğimini bildirir. -
BTN_TOUCH
: (GEREKLİ) Aracın cihaza temas edip etmediğini belirtir. -
BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (isteğe bağlı) Düğme durumlarını raporlar. -
BTN_TOOL_FINGER
,BTN_TOOL_PEN
,BTN_TOOL_RUBBER
,BTN_TOOL_BRUSH
,BTN_TOOL_PENCIL
,BTN_TOOL_AIRBRUSH
,BTN_TOOL_MOUSE
,BTN_TOOL_LENS
,BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
,BTN_TOOL_QUADTAP
(isteğe bağlı) : ) Takım tipini bildirir.
-
- Çoklu dokunmatik cihazlar aşağıdaki Linux giriş olaylarını kullanır:
-
ABS_MT_POSITION_X
: (GEREKLİ) Takımın X koordinatını bildirir. -
ABS_MT_POSITION_Y
: (REQUIRED) Takımın Y koordinatını bildirir. -
ABS_MT_PRESSURE
: (isteğe bağlı) Aletin ucuna uygulanan fiziksel basıncı veya dokunma kontağının sinyal gücünü rapor eder. -
ABS_MT_TOUCH_MAJOR
: (isteğe bağlı) Dokunmatik kontağın kesit alanını veya dokunmatik kontağın daha uzun boyutunun uzunluğunu bildirir. -
ABS_MT_TOUCH_MINOR
: (isteğe bağlı) Dokunmatik kontağın kısa boyutunun uzunluğunu bildirir.ABS_MT_TOUCH_MAJOR
bir alan ölçümü rapor ediyorsa bu eksen kullanılmamalıdır. -
ABS_MT_WIDTH_MAJOR
: (isteğe bağlı) Aracın kendisinin kesit alanını veya aracın daha uzun boyutunun uzunluğunu bildirir. Aletin boyutlarını bilmiyorsanız bu ekseni kullanmayın. -
ABS_MT_WIDTH_MINOR
: (isteğe bağlı) Aracın kendisinin kısa boyutunun uzunluğunu bildirir.ABS_MT_WIDTH_MAJOR
bir alan ölçümü bildiriyorsa veya aletin boyutları bilinmiyorsa bu eksen kullanılmamalıdır. -
ABS_MT_ORIENTATION
: (isteğe bağlı) Aracın yönünü bildirir. -
ABS_MT_DISTANCE
: (isteğe bağlı) Aracın dokunmatik cihazın yüzeyine olan mesafesini bildirir. -
ABS_MT_TOOL_TYPE
: (isteğe bağlı) Takım 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ç etkin olduğunda her bir aracı bağımsız olarak tanımlamak ve izlemek için kullanılan, negatif olmayan rastgele bir tam sayıdır. Örneğin, cihaza birden fazla parmak dokunduğunda, her parmağa, parmak temas halinde kaldığı sürece kullanılacak ayrı bir izleme kimliği atanmalıdır. İzleme kimlikleri, ilgili araçlar menzil dışına çıktığında yeniden kullanılabilir. -
ABS_MT_SLOT
: (isteğe bağlı) Linux çoklu dokunma protokolü 'B' kullanıldığında aracın yuva kimliğini bildirir. Daha fazla ayrıntı için Linux çoklu dokunma protokolü belgelerine bakın. -
BTN_TOUCH
: (GEREKLİ) Aracın cihaza temas edip etmediğini belirtir. -
BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (isteğe bağlı) Düğme durumlarını raporlar. -
BTN_TOOL_FINGER
,BTN_TOOL_PEN
,BTN_TOOL_RUBBER
,BTN_TOOL_BRUSH
,BTN_TOOL_PENCIL
,BTN_TOOL_AIRBRUSH
,BTN_TOOL_MOUSE
,BTN_TOOL_LENS
,BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
,BTN_TOOL_QUADTAP
(isteğe bağlı) : ) Takım tipini bildirir.
-
- Hem tek dokunma hem de çoklu dokunma protokolü için eksenler tanımlanmışsa, yalnızca çoklu dokunma eksenleri kullanılır ve tek dokunma eksenleri göz ardı edilir.
ABS_X
,ABS_Y
,ABS_MT_POSITION_X
veABS_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
veyaABS_MT_PRESSURE
tarafından rapor edilen değerler, eğer rapor ediliyorsa, takım cihaza dokunduğunda sıfırdan farklı olmalı, aksi halde takımın havada durduğunu belirtmek için sıfır olmalıdır.Basınç bilgilerinin raporlanması isteğe bağlıdır ancak şiddetle tavsiye edilir. Uygulamalar, basınca duyarlı çizim ve diğer efektleri uygulamak için basınç bilgilerini kullanabilir.
ABS_TOOL_WIDTH
,ABS_MT_TOUCH_MAJOR
,ABS_MT_TOUCH_MINOR
,ABS_MT_WIDTH_MAJOR
veyaABS_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
veyaABS_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
veABS_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 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ı 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 olarakMotionEvent.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
veyaBTN_TOOL_*
1 ise araç etkindir.Bu koşul,
InputReader
aracın doğası hakkında, dokunaklı olup olmadığı ya da en azından araç türü hakkında en azından bazı bilgilere sahip olması gerektiği anlamına gelir. Hiçbir bilgi mevcut değilse, aletin etkin olmadığı (aralık dışında) varsayılır.- Çoklu dokunma protokolü 'A' kullanıldığında araç, en son senkronizasyon raporunda göründüğünde etkin olur. Araç, senkronizasyon raporlarında görünmeyi bıraktığında varlığı da sona erer.
- Çoklu dokunma protokolü 'B' kullanıldığında araç, etkin bir yuvaya sahip olduğu sürece etkindir. Yuva temizlendiğinde aracın varlığı sona erer.
- Bir aracın aşağıdaki koşullara göre gezindiği belirlenir:
- Araç
BTN_TOOL_MOUSE
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 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 veBTN_TOUCH
sıfır değerine sahipse araç geziniyor demektir.
- Araç
-
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ındanSYN_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 cihazın çalışması
Aşağıda Android'deki dokunmatik cihaz işleminin kısa bir özeti bulunmaktadır.
-
EventHub
evdev
sürücüsündeki ham olayları okur. -
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. - GERİ veya İLERİ tuşuna basıldığında veya bırakıldığında,
InputReader
InputDispatcher
anahtar olay hakkında bilgi verir. -
InputReader
sanal bir tuşa basılıp basılmadığını belirler. Eğer öyleyse,InputDispatcher
anahtar olay hakkında bilgi verir. -
InputReader
dokunmanın ekranın sınırları dahilinde başlatılıp başlatılmadığını belirler. Eğer öyleyse, Touch olayı hakkındaInputDispatcher
bilgilendirir. - Dokunma aracı yoksa ancak en az bir gezinme aracı varsa,
InputReader
giriş olayı hakkındaInputDispatcher
bildirimde bulunur. - 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ındaInputDispatcher
bildirimde bulunur. -
InputDispatcher
olayların gönderilip gönderilmeyeceğini ve aygıtı uyandırıp uyandırmayacağını belirlemek içinWindowManagerPolicy
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
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 mevcut değilseraw.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 mevcut değilseraw.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ı göstermektedir. Her eksen için EVIOCGABS
ioctl çağrılarak elde edilirler.
-
raw.*.min
- Ham eksenin kapsayıcı minimum değeri.
-
raw.*.max
- Ham eksenin kapsayıcı maksimum değeri.
-
raw.*.range
-
raw.*.max - raw.*.min
ile eşdeğerdir. -
raw.*.fuzz
- Ham eksenin doğruluğu. Örneğin. fuzz = 1, değerlerin +/- 1 birime kadar doğru olduğunu belirtir.
-
raw.width
- Dokunma alanının kapsayıcı genişliği;
raw.x.range + 1
eşdeğerdir. -
raw.height
- Dokunma alanının dahil yüksekliği;
raw.y.range + 1
eşdeğerdir.
Çıkış aralıkları
Aşağıdaki ifadeler çıkış koordinat sisteminin özelliklerini belirtir. Sistem, dokunmatik cihaz tarafından kullanılan yüzey birimlerinden gelen dokunma konumu bilgilerini, ekran pikselleri gibi uygulamalara rapor edilen çıkış birimlerine dönüştürmek için doğrusal enterpolasyon kullanır.
-
output.width
- Çıkış genişliği. Dokunmatik ekranlar için (bir ekranla ilişkili), bu, piksel cinsinden ekran genişliğidir. Dokunmatik yüzeyler için (bir ekranla ilişkili olmayan), çıktı genişliği
raw.width
değerine eşittir, bu da hiçbir enterpolasyonun gerçekleştirilmediğini gösterir. -
output.height
- Çıkış yüksekliği. Dokunmatik ekranlar için (bir ekranla ilişkili), bu, piksel cinsinden ekran yüksekliğidir. Dokunmatik yüzeyler için (bir ekranla ilişkili olmayan), çıkış yüksekliği
raw.height
değerine eşittir, bu da hiçbir enterpolasyonun gerçekleştirilmediğini gösterir. -
output.diag
- Çıkış koordinat sisteminin köşegen uzunluğu,
sqrt(output.width ^2 + output.height ^2)
ile eşdeğerdir.
Temel yapılandırma
Dokunmatik giriş eşleyicisi, kalibrasyon değerlerini belirtmek için giriş cihazı yapılandırma dosyasındaki birçok yapılandırma özelliğini kullanır. Aşağıdaki tabloda bazı genel amaçlı yapılandırma özellikleri açıklanmaktadır. Diğer tüm özellikler, kalibre etmek için kullanıldıkları alanlarla birlikte aşağıdaki bölümlerde açıklanmaktadır.
touch.deviceType
Tanım: touch.deviceType
= touchScreen
| touchPad
| pointer
| default
Dokunmatik cihaz türünü belirtir.
Değer
touchScreen
ise dokunmatik cihaz, bir ekranla ilişkilendirilmiş bir dokunmatik ekrandır.Değer
touchPad
Yüzey ise dokunmatik cihaz, ekranla ilişkilendirilmemiş bir dokunmatik yüzeydir.Değer
pointer
ise, dokunmatik cihaz ekranla ilişkili olmayan bir dokunmatik yüzeydir ve hareketleri dolaylı çoklu dokunma işaretçi hareketleri için kullanılır.Değer
default
ise sistem, cihaz tipini sınıflandırma algoritmasına göre otomatik olarak algılar.
Cihaz tipinin dokunmatik cihazın davranışını nasıl etkilediği hakkında daha fazla ayrıntı için Sınıflandırma bölümüne bakın.
Android 3 ve önceki sürümlerde tüm dokunmatik cihazların dokunmatik ekran olduğu varsayılmıştır.
touch.orientationAware
Tanım: touch.orientationAware
= 0
| 1
Dokunmatik cihazın ekran yönü değişikliklerine tepki verip vermeyeceğini belirtir.
Değer
1
ise dokunmatik cihaz tarafından bildirilen dokunma konumları, ekran yönü değiştiğinde döndürülür.Değer
0
ise, dokunmatik cihaz tarafından bildirilen dokunma konumları, ekran yönü değişikliklerinden etkilenmez.
Cihaz dokunmatik ekran ise varsayılan değer 1
, aksi takdirde 0
.
Sistem, dahili ve harici dokunmatik ekranlar ve ekranlar arasında ayrım yapar. Yön algılamalı dahili dokunmatik ekran, dahili ekranın yönüne göre döndürülür. Yön algılamalı harici dokunmatik ekran, harici ekranın yönüne göre döndürülür.
Oryantasyon farkındalığı, Nexus One gibi cihazlarda dokunmatik ekranların dönmesini desteklemek için kullanılır. Örneğin, cihaz doğal yönünden saat yönünde 90 derece döndürüldüğünde, dokunmatik ekranın mutlak koordinat sisteminin sol üst köşesindeki bir dokunuş, sol üst köşedeki bir dokunuş olarak rapor edilecek şekilde, dokunuşların mutlak konumları yeniden eşlenir. ekranın döndürülmüş koordinat sisteminin köşesi. Bu, dokunuşların uygulamaların görsel öğelerini çizmek için kullandığı koordinat sistemiyle aynı şekilde raporlanması için yapılır.
Honeycomb'dan önce, tüm dokunmatik cihazların yönelime duyarlı olduğu varsayıldı.
touch.gestureMode
Tanım: touch.gestureMode
= pointer
| spots
| default
İşaretçi hareketleri için sunum modunu belirtir. Bu yapılandırma özelliği yalnızca dokunmatik cihazın işaretçi türünde olması durumunda geçerlidir.
Değer
pointer
ise, dokunmatik yüzey hareketleri fare işaretçisine benzer bir imleç aracılığıyla sunulur.Değer
spots
ise, dokunmatik yüzey hareketleri, hareketin ağırlık merkezini temsil eden bir bağlantı ve tek tek parmakların konumunu temsil eden bir dizi dairesel nokta tarafından sunulur.
INPUT_PROP_SEMI_MT
giriş özelliği ayarlandığında varsayılan değer pointer
veya aksi takdirde spots
.
X ve Y alanları
X ve Y alanları temas alanının merkezi için konum bilgisi sağlar.
Hesaplama
Hesaplama basittir: Dokunmatik sürücüden gelen konum bilgisi, çıkış koordinat sistemine doğrusal olarak enterpolasyona tabi tutulur.
xScale = output.width / raw.width yScale = output.height / raw.height If not orientation aware or screen rotation is 0 degrees: output.x = (raw.x - raw.x.min) * xScale output.y = (raw.y - raw.y.min) * yScale Else If rotation is 90 degrees: output.x = (raw.y - raw.y.min) * yScale output.y = (raw.x.max - raw.x) * xScale Else If rotation is 180 degrees: output.x = (raw.x.max - raw.x) * xScale output.y = (raw.y.max - raw.y) * yScale Else If rotation is 270 degrees: output.x = (raw.y.max - raw.y) * yScale output.y = (raw.x - raw.x.min) * xScale End If
touchMajor, touchMinor, toolMajor, toolMinor, boyut alanları
touchMajor
ve touchMinor
alanları, çıkış birimlerindeki (piksel) temas alanının yaklaşık boyutlarını tanımlar.
toolMajor
ve toolMinor
alanları, aracın yaklaşık boyutlarını çıktı birimleri (piksel) cinsinden tanımlar.
size
alanı, dokunmatik cihazın algılayabileceği mümkün olan en büyük dokunmaya göre normalleştirilmiş dokunma boyutunu açıklar. Mümkün olan en küçük normalleştirilmiş boyut 0,0'dır (temas yok veya ölçülemez) ve mümkün olan en büyük normalleştirilmiş boyut 1,0'dır (sensör alanı doymuştur).
Hem yaklaşık uzunluk hem de genişlik ölçülebildiğinde, touchMajor
alanı temas alanının daha uzun boyutunu, touchMinor
alanı ise daha kısa boyutunu belirtir. Temas alanının yalnızca yaklaşık çapı ölçülebildiğinde touchMajor
ve touchMinor
alanları eşittir.
Benzer şekilde, toolMajor
alanı aracın kesit alanının daha uzun boyutunu, toolMinor
alanı ise daha kısa boyutunu belirtir.
Dokunma boyutu mevcut değilse ancak araç boyutu mevcutsa, araç boyutu, dokunma boyutuna eşit olarak ayarlanır. Bunun tersine, eğer araç boyutu mevcut değilse ancak dokunma boyutu mevcutsa, o zaman dokunma boyutu, araç boyutuna eşit olarak ayarlanır.
Dokunmatik cihazlar, dokunma boyutunu ve araç boyutunu çeşitli yollarla ölçer veya bildirir. Mevcut uygulama üç farklı ölçüm türünü desteklemektedir: çap, alan ve yüzey birimlerindeki geometrik sınırlayıcı kutu.
Tanım: touch.size.calibration
= none
| geometric
| diameter
| area
| default
Dokunma boyutunu ve araç boyutunu raporlamak için dokunmatik sürücü tarafından kullanılan ölçüm türünü belirtir.
Değer
none
ise boyut sıfıra ayarlanır.Değer
geometric
ise boyutun konumla aynı yüzey birimlerinde belirtildiği varsayılır, dolayısıyla aynı şekilde ölçeklenir.Değer
diameter
ise, boyutun dokunuşun veya aletin çapıyla (genişliğiyle) orantılı olduğu varsayılır.Değer,
area
ise, boyutun dokunma veya araç alanıyla orantılı olduğu varsayılır.Değer
default
ise sistem,raw.touchMajor
veyaraw.toolMajor
ekseni mevcutsageometric
kalibrasyonu kullanır, aksi halde kalibrasyonnone
seçeneğini kullanır.
dokunmatik.boyut.ölçekli
Tanım: touch.size.scale
= <negatif olmayan kayan noktalı sayı>
Kalibrasyonda kullanılan sabit ölçek faktörünü belirtir.
Varsayılan değer 1.0
.
dokunma.boyut.bias
Tanım: touch.size.bias
= <negatif olmayan kayan noktalı bir sayı>
Kalibrasyonda kullanılan sabit bir sapma değerini belirtir.
Varsayılan değer 0.0
.
touch.size.isSummed
Tanım: touch.size.isSummed
= 0
| 1
Boyutun, tüm etkin ilgili kişilerin boyutlarının toplamı olarak mı yoksa her ilgili kişi için ayrı ayrı mı raporlanacağını belirtir.
Değer
1
ise bildirilen boyut, kullanım öncesindeki kişi sayısına bölünür.Değer
0
ise bildirilen boyut olduğu gibi kullanılır.
Varsayılan değer 0
.
Bazı dokunmatik cihazlar, özellikle de "Yarı-MT" cihazlar, birden fazla temasın bireysel boyutlarını ayırt edemez, bu nedenle toplam alanlarını veya genişliklerini temsil eden bir boyut ölçümü bildirirler. Bu tür cihazlar için bu özellik yalnızca 1
olarak ayarlanmalıdır. Şüpheniz varsa bu değeri 0
olarak ayarlayın.
Hesaplama
touchMajor
, touchMinor
, toolMajor
, toolMinor
ve size
alanlarının hesaplanması, belirtilen kalibrasyon parametrelerine bağlıdır.
If raw.touchMajor and raw.toolMajor are available: touchMajor = raw.touchMajor touchMinor = raw.touchMinor toolMajor = raw.toolMajor toolMinor = raw.toolMinor Else If raw.touchMajor is available: toolMajor = touchMajor = raw.touchMajor toolMinor = touchMinor = raw.touchMinor Else If raw.toolMajor is available: touchMajor = toolMajor = raw.toolMajor touchMinor = toolMinor = raw.toolMinor Else touchMajor = toolMajor = 0 touchMinor = toolMinor = 0 size = 0 End If size = avg(touchMajor, touchMinor) If touch.size.isSummed == 1: touchMajor = touchMajor / numberOfActiveContacts touchMinor = touchMinor / numberOfActiveContacts toolMajor = toolMajor / numberOfActiveContacts toolMinor = toolMinor / numberOfActiveContacts size = size / numberOfActiveContacts End If If touch.size.calibration == "none": touchMajor = toolMajor = 0 touchMinor = toolMinor = 0 size = 0 Else If touch.size.calibration == "geometric": outputScale = average(output.width / raw.width, output.height / raw.height) touchMajor = touchMajor * outputScale touchMinor = touchMinor * outputScale toolMajor = toolMajor * outputScale toolMinor = toolMinor * outputScale Else If touch.size.calibration == "area": touchMajor = sqrt(touchMajor) touchMinor = touchMajor toolMajor = sqrt(toolMajor) toolMinor = toolMajor Else If touch.size.calibration == "diameter": touchMinor = touchMajor toolMinor = toolMajor End If If touchMajor != 0: output.touchMajor = touchMajor * touch.size.scale + touch.size.bias Else output.touchMajor = 0 End If If touchMinor != 0: output.touchMinor = touchMinor * touch.size.scale + touch.size.bias Else output.touchMinor = 0 End If If toolMajor != 0: output.toolMajor = toolMajor * touch.size.scale + touch.size.bias Else output.toolMajor = 0 End If If toolMinor != 0: output.toolMinor = toolMinor * touch.size.scale + touch.size.bias Else output.toolMinor = 0 End If output.size = size
basınç alanı
pressure
alanı, dokunmatik cihaza uygulanan yaklaşık fiziksel basıncı, 0,0 (dokunma yok) ile 1,0 (normal basınç) arasında normalleştirilmiş bir değer olarak tanımlar.
Sıfır basınç, aletin havada durduğunu gösterir.
dokunma.basınç.kalibrasyon
Tanım: touch.pressure.calibration
= none
| physical
| amplitude
| default
Basıncı raporlamak için dokunmatik sürücü tarafından kullanılan ölçüm türünü belirtir.
Değer
none
ise basınç bilinmez, dolayısıyla dokunulduğunda 1,0'a, havada gezinildiğinde ise 0,0'a ayarlanır.Değer
physical
ise, basınç ekseninin dokunmatik yüzeye uygulanan basıncın gerçek fiziksel yoğunluğunu ölçtüğü varsayılır.Değer
amplitude
ise basınç ekseninin, kontağın boyutuna ve uygulanan basınca bağlı olan sinyal genliğini ölçtüğü varsayılır.Değer
default
ise sistem, basınç ekseni mevcutsaphysical
kalibrasyonu kullanır, aksi haldenone
kullanmaz.
dokunmatik basınç ölçeği
Tanım: touch.pressure.scale
= <negatif olmayan kayan noktalı sayı>
Kalibrasyonda kullanılan sabit bir ölçek faktörü belirtir.
Varsayılan değer 1.0 / raw.pressure.max
.
Hesaplama
pressure
alanının hesaplanması belirtilen kalibrasyon parametrelerine bağlıdır.
If touch.pressure.calibration == "physical" or "amplitude": output.pressure = raw.pressure * touch.pressure.scale Else If hovering: output.pressure = 0 Else output.pressure = 1 End If End If
Oryantasyon ve eğim alanları
orientation
alanı, dokunuş ve aracın yönünü açısal bir ölçüm olarak tanımlar. 0
yönü, ana eksenin dikey olarak yönlendirildiğini gösterir, -PI/2
ana eksenin sola yönlendirildiğini gösterir, PI/2
ana eksenin sağa yönlendirildiğini gösterir. Bir kalem aracı mevcut olduğunda, oryantasyon aralığı -PI
veya PI
aralığında tam bir daire aralığında tanımlanabilir.
tilt
alanı, aletin eğimini açısal bir ölçüm olarak tanımlar. 0
eğimi, aletin yüzeye dik olduğunu gösterir. Bir PI/2
eğimi, aletin yüzeyde düz olduğunu gösterir.
Touch.Ortiamation.Calibrasyon
Tanım: touch.orientation.calibration
= none
| interpolated
| vector
| default
Dokunmatik sürücü tarafından yönlendirmeyi bildirmek için kullanılan ölçüm türünü belirtir.
- Değer
none
, oryantasyon bilinmemektedir, böylece 0 olarak ayarlanır. - Değer
interpolated
edilirse,raw.orientation.min
-PI/2
bir ham değeriraw.orientation.max
PI/2
(raw.orientation.min + raw.orientation.max) / 2
haritalarının merkez değeri0
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 takdirdenone
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 mevcutsascaled
kalibrasyonu kullanır, aksi takdirdenone
kullanmaz.
touch.distance.scale
Tanım: touch.distance.scale
= <a negatif olmayan yüzer nokta numarası>
Kalibrasyonda kullanılan sabit bir ölçek faktörü belirtir.
Varsayılan değer 1.0
.
Hesaplama
distance
alanının hesaplanması belirtilen kalibrasyon parametrelerine bağlıdır.
If touch.distance.calibration == "scaled": output.distance = raw.distance * touch.distance.scale Else output.distance = 0 End If
Örnek
# Input device configuration file for a touch screen that supports pressure, # size and orientation. The pressure and size scale factors were obtained # by measuring the characteristics of the device itself and deriving # useful approximations based on the resolution of the touch sensor and the # display. # # Note that these parameters are specific to a particular device model. # Different parameters need to be used for other devices. # Basic Parameters touch.deviceType = touchScreen touch.orientationAware = 1 # Size # Based on empirical measurements, we estimate the size of the contact # using size = sqrt(area) * 28 + 0. touch.size.calibration = area touch.size.scale = 28 touch.size.bias = 0 touch.size.isSummed = 0 # Pressure # Driver reports signal strength as pressure. # # A normal index finger touch typically registers about 80 signal strength # units although we don't expect these values to be accurate. touch.pressure.calibration = amplitude touch.pressure.scale = 0.0125 # Orientation touch.orientation.calibration = vector
Uyumluluk notları
Touch cihazları için yapılandırma özellikleri Android Ice Cream Sandwich 4.0'da önemli ölçüde değişti. Touch cihazları için tüm giriş aygıtı yapılandırma dosyaları, yeni yapılandırma özelliklerini kullanmak için güncellenmelidir.
Eski dokunmatik cihaz sürücülerinin de güncellenmesi gerekebilir.
Sanal Anahtar Harita Dosyaları
Dokunmatik cihazlar sanal tuşları uygulamak için kullanılabilir.
Dokunmatik kontrolörün yeteneklerine bağlı olarak bunu yapmanın birkaç yolu vardır. Bazı dokunmatik denetleyiciler, ürün yazılımı kayıtlarını ayarlayarak yumuşak tuşları uygulamak için doğrudan yapılandırılabilir. Diğer zamanlarda, dokunmatik koordinatlardan yazılımdaki anahtar kodlara kadar eşlemeyi gerçekleştirmek arzu edilir.
Sanal anahtarlar yazılımda uygulandığında, çekirdek virtualkeys.<devicename>
Örneğin, dokunmatik ekran cihazı sürücüleri adını "TouchyFeely" olarak bildiriyorsa, sanal anahtar harita dosyasının /sys/board_properties/virtualkeys.touchyfeely
yoluna sahip olması gerekir.
Sanal anahtar haritası dosyası, dokunmatik ekrandaki sanal tuşların koordinatlarını ve Linux anahtar kodlarını açıklar.
Sanal anahtar haritası dosyasına ek olarak, Linux anahtar kodlarını Android tuş kodlarıyla eşlemek ve klavye cihazının türünü (genellikle SPECIAL_FUNCTION
) belirtmek için ilgili bir anahtar düzen dosyası ve anahtar karakter haritası dosyası olmalıdır.
Sözdizimi
Sanal anahtar harita dosyası, yeni çizgiler veya kolonlarla ayrılmış bir sanal anahtar düzen açıklamasından oluşan düz bir metin dosyasıdır.
Yorum satırları '#' ile başlar ve satırın sonuna devam eder.
Her sanal anahtar, 6 kolon ile ayrılmış bileşen tarafından tanımlanır:
-
0x01
: Bir sürüm kodu. Her zaman0x01
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
veFLAG_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
- 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. -
- Alanların doğru şekilde ayarlandığını doğrulamak için çalıştırın:
$ adb shell getevent -li
- Ç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
-
system_server
işlemini yeniden başlatın.$ adb shell stop && adb shell start
-
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: {} - Özelliği kalıcı olarak etkinleştirmek için,
init**rc
dosyanıza karşılık gelen Sysprop komutunu ekleyin:setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
daha fazla okuma
,Android, Stylus tabanlı sayısallaştırıcı tabletler de dahil olmak üzere çeşitli dokunmatik ekranları ve dokunmatik pedleri destekler.
Dokunmatik ekranlar, kullanıcının ekranda doğrudan manipüle etme izlenimi olacak şekilde bir ekranla ilişkili dokunmatik cihazlardır.
Dokunmatik pedler, dijitalleştirici tablet gibi bir ekranla ilişkili olmayan dokunmatik cihazlardır. Dokunmatik pedler tipik olarak bir kullanıcı arayüzünün işaretleme veya mutlak dolaylı konumlandırma veya jest tabanlı kontrolü için kullanılır.
Dokunmatik cihazlarda işlevleri fare düğmelerine benzer düğmeler olabilir.
Dokunmatik cihazlar bazen temeldeki dokunmatik sensör teknolojisine bağlı olarak parmaklar veya kalem gibi çeşitli farklı araçlar kullanılarak manipüle edilebilir.
Dokunmatik cihazlar bazen sanal tuşları uygulamak için kullanılır. Örneğin, bazı Android cihazlarda, dokunmatik ekran sensörü alanı ekranın kenarının ötesine uzanır ve dokunma duyarlı bir anahtar pedinin bir parçası olarak ikili amaca hizmet eder.
Çok çeşitli dokunmatik cihazlar nedeniyle, Android her cihazın özelliklerini ve istenen davranışlarını tanımlamak için çok sayıda yapılandırma özelliğine dayanır.
Cihaz sınıflandırması dokunmatik
Aşağıdaki koşulların her ikisi de geçerlise, bir giriş cihazı çoklu dokunuşlu bir cihaz olarak sınıflandırılır:
- Giriş cihazı,
ABS_MT_POSITION_X
veABS_MT_POSITION_Y
mutlak eksenlerinin varlığını bildirir. - Giriş cihazında herhangi bir gamepad düğmesi yoktur. Bu durum, MT eksenlerininkiyle örtüşen kodlarla eksenleri bildiren belirli gamepad'lerle bir belirsizliği çözer.
Aşağıdaki koşulların her ikisi de geçerli olması durumunda bir giriş aygıtı tek dokunuşlu bir cihaz olarak sınıflandırılır:
- Giriş cihazı çoklu dokunuşlu bir cihaz olarak sınıflandırılmaz. Giriş aygıtı, tek dokunuşlu bir cihaz veya çoklu dokunuşlu bir cihaz olarak sınıflandırılır, asla ikisi de.
- Giriş cihazı,
ABS_X
veABS_Y
Absolute eksenlerinin varlığını veBTN_TOUCH
anahtar kodunun varlığını bildirir.
Bir giriş aygıtı bir dokunmatik cihazı olarak sınıflandırıldığında, sanal tuşların varlığı, cihaz için sanal anahtar harita dosyasını yüklemeye çalışarak belirlenir. Sanal anahtar haritası mevcutsa, cihaz için anahtar düzen dosyası da yüklenir. Bu dosyaların konumu ve biçimi hakkında bilgi için [sanal anahtar haritası dosyaları] (#sanal-tuş-map-files) adresine bakın.
Ardından, sistem dokunmatik aygıtı için giriş aygıtı yapılandırma dosyasını yükler.
Tüm yerleşik dokunmatik cihazlarda giriş cihazı yapılandırma dosyaları olmalıdır. Giriş aygıtı yapılandırma dosyası yoksa, sistem harici USB veya Bluetooth HID HID dokunmatik ekranları veya dokunmatik pedler gibi genel amaçlı dokunmatik çevre birimleri için uygun olan varsayılan bir yapılandırma seçer. Bu varsayılanlar yerleşik dokunmatik ekranlar için tasarlanmamıştır ve yanlış davranışa neden olabilir.
Giriş aygıtı yapılandırması yüklendikten sonra, sistem giriş aygıtını dokunmatik ekran , dokunmatik ped veya işaretçi cihazı olarak sınıflandırır.
- Ekrandaki nesnelerin doğrudan manipülasyonu için bir dokunmatik ekran cihazı kullanılır. Kullanıcı doğrudan ekrana dokunur, böylece sistem manipüle edilen nesneleri belirtmek için ek bir uygunluk gerektirmez.
- Belirli bir sensör alanındaki dokunuşlar hakkında bir uygulamaya mutlak konumlandırma bilgileri sağlamak için bir dokunmatik ped cihazı kullanılır. Sayısallaştırıcı tabletler için yararlı olabilir.
- Bir işaretçi cihazı, bir imleç kullanarak ekrandaki nesnelerin dolaylı olarak manipülasyonu için kullanılır. Parmaklar çok dokunaklı işaretçi hareketleri olarak yorumlanır. Styluses gibi diğer araçlar mutlak pozisyonlar kullanılarak yorumlanır. Daha fazla bilgi için dolaylı çoklu dokunuş işaretçisi hareketlerine bakın.
Giriş aygıtını dokunmatik ekran, dokunmatik ped veya işaretçi aygıtı olarak sınıflandırmak için aşağıdaki kurallar kullanılır.
-
touch.deviceType
özelliği ayarlanmışsa, cihaz türü belirtildiği gibi ayarlanır. - Giriş aygıtı
INPUT_PROP_DIRECT
Giriş özelliğinin varlığını bildiriyorsa (EVIOCGPROP
IOCTL aracılığıyla), cihaz türü ekran olarak ayarlanmıştır. Bu koşul, doğrudan giriş dokunmatik cihazlarının da bağlı bir ekrana bağlı olduğunu varsayar. - Giriş aygıtı
INPUT_PROP_POINTER
giriş özelliğinin varlığını bildiriyorsa (EVIOCGPROP
IOCTL aracılığıyla), o zaman cihaz türü işaretçiye ayarlanmıştır. - Giriş aygıtı
REL_X
veyaREL_Y
göreli eksenlerin varlığını bildiriyorsa, cihaz türü ped'e dokunacak şekilde ayarlanır. Bu durum, hem fare hem de dokunmatik pedden oluşan giriş aygıtları için bir belirsizliği çözer. Bu durumda, dokunmatik pedi işaretçiyi kontrol etmek için kullanılmaz, çünkü fare zaten kontrol eder. - Aksi takdirde, cihaz türü işaretçiye ayarlanır. Bu varsayılan, başka bir özel amaçlı belirlenmemiş dokunmatik pedlerin işaretçiyi kontrol etmesini sağlar.
Düğmeler
Düğmeler, uygulamaların ek işlevler gerçekleştirmek için kullanabileceği isteğe bağlı kontrollerdir. Dokunmatik cihazlardaki düğmeler fare düğmelerine benzer şekilde davranır ve esas olarak işaretçi tipi dokunmatik cihazlarla veya bir kalemle kullanılır.
Aşağıdaki düğmeler desteklenir:
-
BTN_LEFT
:MotionEvent.BUTTON_PRIMARY
ile eşlenir. -
BTN_RIGHT
:MotionEvent.BUTTON_SECONDARY
ile eşlenir. -
BTN_MIDDLE
:MotionEvent.BUTTON_MIDDLE
ile eşlenir. -
BTN_BACK
veBTN_SIDE
:MotionEvent.BUTTON_BACK
ile eşlenir. Bu düğmeye basıldığında, tuşaKeyEvent.KEYCODE_BACK
basılı tuşuna basılır. -
BTN_FORWARD
veBTN_EXTRA
:MotionEvent.BUTTON_FORWARD
ile eşlenmiş. Bu düğmeye basıldığında, tuşaKeyEvent.KEYCODE_FORWARD
basılı tuşuna basılır. -
BTN_STYLUS
:MotionEvent.BUTTON_SECONDARY
ile eşlenir. -
BTN_STYLUS2
:MotionEvent.BUTTON_TERTIARY
ile eşlenmiş.
Araçlar ve araç türleri
Araç, dokunmatik cihazla etkileşim kurmak için kullanılan bir parmak, kalem veya başka bir cihazdır. Bazı dokunmatik cihazlar farklı araç türlerini ayırt edebilir.
Android'de başka yerlerde, MotionEvent
API'sinde olduğu gibi, bir araç genellikle bir işaretçi olarak adlandırılır.
Aşağıdaki takım türleri desteklenir:
-
BTN_TOOL_FINGER
veMT_TOOL_FINGER
:MotionEvent.TOOL_TYPE_FINGER
ile eşlenmiş. -
BTN_TOOL_PEN
VEMT_TOOL_PEN
:MotionEvent.TOOL_TYPE_STYLUS
ile eşlenmiş. -
BTN_TOOL_RUBBER
:MotionEvent.TOOL_TYPE_ERASER
ile eşlenmiş. -
BTN_TOOL_BRUSH
:MotionEvent.TOOL_TYPE_STYLUS
ile eşlenir. -
BTN_TOOL_PENCIL
:MotionEvent.TOOL_TYPE_STYLUS
ile eşleştirildi. -
BTN_TOOL_AIRBRUSH
:MotionEvent.TOOL_TYPE_STYLUS
ile eşlenir. -
BTN_TOOL_MOUSE
:MotionEvent.TOOL_TYPE_MOUSE
ile eşlenir. -
BTN_TOOL_LENS
:MotionEvent.TOOL_TYPE_MOUSE
ile eşlenir. -
BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
veBTN_TOOL_QUADTAP
:MotionEvent.TOOL_TYPE_FINGER
ile eşlenir.
Dokunma Araçlarına Karşı Çekme
Araçlar ya dokunmatik cihazla temas halinde veya menzilde olabilir ve üstünde kalabilir. Tüm dokunmatik cihazlar, dokunmatik cihazın üzerinde dolaşan bir aletin varlığını algılayamaz. RF tabanlı Stylus sayısallaştırıcıları gibi yapılanlar, aracın sayısallaştırıcının sınırlı bir aralığında ne zaman olduğunu tespit edebilir.
InputReader
bileşeni, dokunma araçlarını gezinme aletlerinden ayırır. Benzer şekilde, dokunma araçları ve gezinme araçları uygulamalara farklı şekillerde rapor edilir.
Dokunma araçları, MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_MOVE
, MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_POINTER_DOWN
ve MotionEvent.ACTION_POINTER_UP
kullanılarak Touch Etkinlikleri olarak uygulamalara bildirilir.
Hovering araçları, MotionEvent.ACTION_HOVER_ENTER
, MotionEvent.ACTION_HOVER_MOVE
ve MotionEvent.ACTION_HOVER_EXIT
kullanılarak uygulamalara genel hareket etkinlikleri olarak rapor edilir.
Cihaz Sürücü Gereksinimlerine Dokun
- Dokunma cihaz sürücüleri, destekledikleri eksenler ve düğmeler için yalnızca eksenleri ve anahtar kodları kaydetmelidir. Desteklenmemiş eksenleri veya anahtar kodları kaydetmek, cihaz sınıflandırma algoritmasını karıştırabilir veya sistemin cihazın yeteneklerini yanlış algılamasına neden olabilir. Örneğin, cihaz
BTN_TOUCH
tuş kodunu bildirirse, sistemBTN_TOUCH
her zaman aracın ekrana dokunup dokunmadığını belirtmek için kullanıldığını varsayar. Bu nedenle,BTN_TOUCH
aracın sadece aralıkta ve havada kaldığını belirtmek için kullanılmamalıdır. - Tek dokunuşlu cihazlar aşağıdaki Linux giriş olaylarını kullanın:
-
ABS_X
: (Gerekli) Aracın X koordinatını rapor eder. -
ABS_Y
: (Gerekli) Aracın y koordinatını rapor eder. -
ABS_PRESSURE
: (İsteğe bağlı) Aracın ucuna uygulanan fiziksel basıncı veya dokunma kontağının sinyal mukavemetini bildirir. -
ABS_TOOL_WIDTH
: (İsteğe bağlı) Dokunma kontağının veya aletin kendisinin kesit alanını veya genişliğini bildirir. -
ABS_DISTANCE
: (İsteğe bağlı) Aracın dokunmatik cihazın yüzeyinden uzaklığını bildirir. -
ABS_TILT_X
: (İsteğe bağlı), aletin X ekseni boyunca dokunmatik cihazın yüzeyinden eğimini bildirir. -
ABS_TILT_Y
: (İsteğe bağlı), A aracının y ekseni boyunca dokunmatik cihazın yüzeyinden eğimini bildirir. -
BTN_TOUCH
: (Gerekli) Aracın cihaza dokunup dokunmadığını gösterir. -
BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (isteğe bağlı) raporlar düğmesi durumları. -
BTN_TOOL_FINGER
,BTN_TOOL_PEN
,BTN_TOOL_RUBBER
BTN_TOOL_LENS
BTN_TOOL_BRUSH
,BTN_TOOL_PENCIL
,BTN_TOOL_AIRBRUSH
,BTN_TOOL_MOUSE
,BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
TakımBTN_TOOL_QUADTAP
.
-
- Çoklu dokunuşlu cihazlar aşağıdaki Linux giriş olaylarını kullanır:
-
ABS_MT_POSITION_X
: (Gerekli) Aracın X koordinatını rapor eder. -
ABS_MT_POSITION_Y
: (Gerekli) Aracın Y koordinatını rapor eder. -
ABS_MT_PRESSURE
: (İsteğe bağlı) Aracın ucuna uygulanan fiziksel basıncı veya dokunma kontağının sinyal mukavemetini bildirir. -
ABS_MT_TOUCH_MAJOR
: (İsteğe bağlı) Dokunma kontağının enine kesit alanını veya dokunma kontağının daha uzun boyutunun uzunluğunu bildirir. -
ABS_MT_TOUCH_MINOR
: (İsteğe bağlı) dokunmatik temasın daha kısa boyutunun uzunluğunu bildirir.ABS_MT_TOUCH_MAJOR
bir alan ölçümü bildiriyorsa bu eksen kullanılmamalıdır. -
ABS_MT_WIDTH_MAJOR
: (İsteğe bağlı) Aracın kendisinin kesit alanını veya aletin kendisinin daha uzun boyutunun uzunluğunu bildirir. Aracın boyutlarını bilmediğiniz sürece bu ekseni kullanmayın. -
ABS_MT_WIDTH_MINOR
: (İsteğe bağlı) Aracın kendisinin daha kısa boyutunun uzunluğunu bildirir.ABS_MT_WIDTH_MAJOR
bir alan ölçümü rapor ediyorsa veya aracın boyutları bilinmiyorsa bu eksen kullanılmamalıdır. -
ABS_MT_ORIENTATION
: (İsteğe bağlı) Aracın yönünü bildirir. -
ABS_MT_DISTANCE
: (İsteğe bağlı) Aracın dokunmatik cihazın yüzeyinden uzaklığını bildirir. -
ABS_MT_TOOL_TYPE
: (İsteğe bağlı) Araç türünüMT_TOOL_FINGER
veyaMT_TOOL_PEN
olarak bildirir. -
ABS_MT_TRACKING_ID
: (İsteğe bağlı) Aracın izleme kimliğini rapor eder. İzleme kimliği, birden fazla araç etkin olduğunda her aracı bağımsız olarak tanımlamak ve izlemek için kullanılan keyfi bir negatif olmayan tamsayıdır. Örneğin, cihaza birden fazla parmak dokunurken, her parmağa, parmak temas halinde kaldığı sürece kullanılan farklı bir izleme kimliğine atanmalıdır. İlişkili araçları menzil dışına çıktığında izleme kimlikleri yeniden kullanılabilir. -
ABS_MT_SLOT
: (İsteğe bağlı) Linux çoklu dokunuşlu 'B' kullanılırken aracın yuva kimliğini rapor eder. Daha fazla ayrıntı için Linux Çoklu Dokunlu Protokol Belgeleri'ne bakın. -
BTN_TOUCH
: (Gerekli) Aracın cihaza dokunup dokunmadığını gösterir. -
BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (isteğe bağlı) raporlar düğmesi durumları. -
BTN_TOOL_FINGER
,BTN_TOOL_PEN
,BTN_TOOL_RUBBER
BTN_TOOL_LENS
BTN_TOOL_BRUSH
,BTN_TOOL_PENCIL
,BTN_TOOL_AIRBRUSH
,BTN_TOOL_MOUSE
,BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
TakımBTN_TOOL_QUADTAP
.
-
- Hem tek dokunuşlu hem de çoklu dokunuşlu protokol için eksenler tanımlanırsa, yalnızca çoklu dokunuş eksenleri kullanılır ve tek dokunuşlu eksenler göz ardı edilir.
ABS_X
,ABS_Y
,ABS_MT_POSITION_X
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 durumunda, aktif alan dokunmatik cihazın ekranı gerçekten kapsayan kısmını açıklar.Bir dokunmatik ekran için, sistem, aşağıdaki hesaplamaya göre ekran piksellerinde dokunmatik konumlar elde etmek için yüzey birimlerinde bildirilen dokunmatik konumları otomatik olarak enterpolasyona sahiptir:
displayX = (x - minX) * displayWidth / (maxX - minX + 1) displayY = (y - minY) * displayHeight / (maxY - minY + 1)
Bir dokunmatik ekran, bildirilen aktif alanın dışındaki dokunuşları bildirebilir.
Aktif alanın dışında başlatılan dokunuşlar uygulamalara teslim edilmez, ancak sanal anahtarlar için kullanılabilir.
Aktif alanın içinde başlatılan veya ekran alanına giren ve çıkan dokunuşlar uygulamalara teslim edilir. Sonuç olarak, bir uygulamanın sınırları içinde bir dokunuş başlarsa ve daha sonra aktif alanın dışına hareket ederse, uygulama negatif veya ekranın sınırlarının ötesinde ekran koordinatlarına sahip dokunmatik olaylar alabilir. Bu beklenen bir davranıştır.
Bir dokunmatik cihaz asla aktif alanın sınırlarına dokunma koordinatlarını sıkıştırmamalıdır. Bir dokunuş aktif alandan çıkarsa, aktif alanın dışında olduğu bildirilmeli veya hiç rapor edilmemelidir.
Örneğin, kullanıcının parmağı dokunmatik ekranın sol üst köşesine yaklaşıyorsa, (Minx, Miny) koordinatını bildirebilir. Parmak aktif alanın dışında hareket etmeye devam ederse, dokunmatik ekran, (Minx - 2, Miny - 3) gibi Minx ve Miny'den daha düşük bileşenlerle koordinatları bildirmeye başlamalı veya dokunuşu tamamen bildirmeyi bırakmalıdır. Başka bir deyişle, kullanıcının parmağı aktif alanın dışında gerçekten dokunurken dokunmatik ekran raporlamamalıdır (Minx, Miny).
Ekran kenarına sıkıştırma dokunuşu koordinatları, ekranın kenarında, sistemin ekran alanının sınırlarına giren veya sınırlarına giren sorunsuz bir şekilde izleme hareketlerini önleyen yapay bir sabit sınır oluşturur.
ABS_PRESSURE
veyaABS_MT_PRESSURE
tarafından bildirilen değerler, rapor edilirlerse, alet cihaza dokunurken sıfır olmamalı ve aksi takdirde, aletin sarktığını belirtmek için sıfır olmamalıdır.Basınç bilgilerinin raporlanması isteğe bağlıdır , ancak şiddetle tavsiye edilir. Uygulamalar, basınca duyarlı çizim ve diğer efektleri uygulamak için basınç bilgilerini kullanabilir.
ABS_TOOL_WIDTH
,ABS_MT_TOUCH_MAJOR
,ABS_MT_TOUCH_MINOR
,ABS_MT_WIDTH_MAJOR
veyaABS_MT_WIDTH_MINOR
tarafından bildirilen değerler, araç cihaza dokunduğunda ve sıfır olduğunda sıfır olmamalıdır, ancak bu gerekli değildir. Örneğin, dokunmatik cihaz parmak temas kontaklarının boyutunu ölçebilir, ancak kalem temas kontaklarını ölçebilir.Boyut bilgilerinin raporlanması isteğe bağlıdır , ancak şiddetle tavsiye edilir. Uygulamalar, boyuta duyarlı çizim ve diğer efektleri uygulamak için basınç bilgilerini kullanabilir.
ABS_DISTANCE
veyaABS_MT_DISTANCE
tarafından bildirilen değerler, araç cihaza dokunurken sıfıra yaklaşmalıdır. Araç doğrudan temas halindeyken bile mesafe sıfır olmayabilir. Bildirilen kesin değerler, donanımın mesafeyi ölçme şekline bağlıdır.Mesafe bilgilerinin raporlanması isteğe bağlıdır , ancak Stylus cihazları için önerilir.
ABS_TILT_X
veABS_TILT_Y
tarafından bildirilen değerler, araç cihaza dik olduğunda sıfır olmalıdır. Sıfır olmayan bir eğim, aletin bir eğimde tutulduğunu gösterir.X ve Y eksenleri boyunca eğim açılarının dikey derecelerde belirtildiği varsayılır. Merkez nokta (mükemmel dik), her eksen için
(max + min) / 2
ile verilir. Merkez noktasından daha küçük değerler, bir eğimi veya solda, merkez noktasından daha büyük değerler, bir eğimi aşağı veya sağda temsil eder.InputReader
x ve y eğim bileşenlerini 0 ilaPI / 2
radyan arasında değişen dikey bir eğim açısına ve-PI
ilePI
radyanları arasında değişen düzlemsel bir yönlendirme açısına dönüştürür. Bu temsil, parmak dokunuşlarını tanımlamak için kullanılanlarla uyumlu olan bir yönlendirme açıklamasıyla sonuçlanır.Tilt bilgilerinin raporlanması isteğe bağlıdır , ancak Stylus cihazları için önerilir.
Araç türü
ABS_MT_TOOL_TYPE
tarafından rapor edilirse,BTN_TOOL_*
tarafından bildirilen herhangi bir araç türü bilgilerinin yerini alır. Hiçbir araç türü bilgisi yoksa, araç türü Varsayılan olarakMotionEvent.TOOL_TYPE_FINGER
.Bir aracın aşağıdaki koşullara göre aktif olduğu belirlenmiştir:
Tek dokunuşlu protokolü kullanırken,
BTN_TOUCH
veyaBTN_TOOL_*
1 ise araç etkindir.Bu koşul,
InputReader
ya da dokunaklı olsun ya da en azından araç türü, aracın doğası hakkında en azından biraz bilgiye sahip olması gerektiğini ima eder. Hiçbir bilgi yoksa, aracın aktif olmadığı varsayılır (menzil dışında).- Çok dokunaklı 'A' protokolü kullanırken, araç en son senkronizasyon raporunda göründüğünde etkindir. Araç senkronizasyon raporlarında görünmeyi durdurduğunda, var olması sona erer.
- Çok dokunaklı 'B' protokolü kullanırken, araç aktif bir yuvaya sahip olduğu sürece etkindir. Yuva temizlendiğinde, araç var olmayı bırakır.
- Bir aracın aşağıdaki koşullara dayanarak havada kaldığı belirlenir:
- Araç
BTN_TOOL_MOUSE
veyaBTN_TOOL_LENS
ise, aşağıdaki koşullardan herhangi biri doğru olsa bile araç havada kalmaz. - Araç etkinse ve sürücü basınç bilgilerini rapor ederse ve bildirilen basınç sıfırsa, araç uçar.
- Araç etkinse ve sürücü
BTN_TOUCH
tuş kodunu desteklerse veBTN_TOUCH
sıfır değeri varsa, araç sarkıyor.
- Araç
-
InputReader
hem çoklu dokunuşlu 'A' hem de 'B' protokolünü destekler. Yeni sürücüler 'B' protokolünü kullanmalı ancak her ikisi de işe yarar. Android 4.0 itibariyle, Linux giriş protokolü spesifikasyonuna uymak için dokunmatik ekran sürücülerinin değiştirilmesi gerekebilir.
Aşağıdaki değişiklikler gerekebilir:
Bir araç aktif olmadığında (parmak "yukarı" gider), sonraki çoklu dokunuş senkronizasyon raporlarında görünmeyi bırakmalıdır. Tüm araçlar aktif hale geldiğinde (tüm parmaklar "yukarı" gider), sürücü
SYN_MT_REPORT
ve ardındanSYN_REPORT
gibi boş bir senkronizasyon raporu paketi göndermelidir.Android'in önceki sürümleri "UP" olaylarının 0'lık bir basınç değeri göndererek rapor edilmesini bekliyor. Eski davranış, Linux giriş protokolü spesifikasyonu ile uyumsuzdu ve artık desteklenmiyor.
Fiziksel basınç veya sinyal gücü bilgisi
ABS_MT_PRESSURE
kullanılarak rapor edilmelidir.Android'in önceki sürümleri
ABS_MT_TOUCH_MAJOR
baskı bilgilerini aldı. Eski davranış Linux giriş protokolü spesifikasyonu ile uyumsuzdu ve artık desteklenmiyor.- Dokunma Boyutu bilgileri
ABS_MT_TOUCH_MAJOR
kullanılarak rapor edilmelidir.Android'in önceki sürümleri
ABS_MT_TOOL_MAJOR
boyut bilgilerini aldı. Eski davranış Linux giriş protokolü spesifikasyonu ile uyumsuzdu ve artık desteklenmiyor.
Dokunmatik Cihaz İşlemi
Aşağıda Android'deki dokunmatik cihaz işleminin kısa bir özetidir.
-
EventHub
evdev
sürücüsünden ham olayları okur. -
InputReader
ham olayları tüketir ve her bir aracın konumu ve diğer özellikleri hakkındaki dahili durumu günceller. Ayrıca düğme durumlarını da izler. - Geri veya ileri basıldıysa veya serbest bırakıldıysa,
InputReader
InputDispatcher
kilit olay hakkında bildirir. -
InputReader
sanal bir tuş presinin meydana gelip gelmediğini belirler. Eğer öyleyse,InputDispatcher
kilit olay hakkında bilgilendirir. -
InputReader
dokunuşun ekranın sınırları içinde başlatılıp başlatılmadığını belirler. Eğer öyleyse,InputDispatcher
dokunma etkinliği hakkında bilgilendirir. - Dokunma aracı yoksa, ancak en az bir vuruş aracı varsa,
InputReader
InputDispatcher
Hover etkinliği hakkında bilgilendirir. - Dokunmatik aygıt türü işaretçi ise,
InputReader
işaretçi hareketi algılamasını gerçekleştirir, işaretçiyi ve noktaları buna göre hareket ettirir veInputDispatcher
işaretçi olayı hakkında bildirir. -
InputDispatcher
olayların gönderilip gönderilmeyeceğini ve cihazı uyandırıp uyandırmayacağını belirlemek içinWindowManagerPolicy
kullanır. Ardından,InputDispatcher
etkinlikleri uygun uygulamalara teslim eder.
Cihaz Yapılandırması'na Dokunma
Dokunmatik cihaz davranışı cihazın eksenleri, düğmeleri, giriş özellikleri, giriş aygıtı yapılandırması, sanal anahtar haritası ve anahtar düzeni ile belirlenir.
Klavye yapılandırmasına katılan dosyalar hakkında daha fazla bilgi için aşağıdaki bölümlere bakın:
Özellikler
Sistem, dokunmatik cihaz davranışını yapılandırmak ve kalibre etmek için birçok giriş aygıtı yapılandırma özelliklerine dayanır.
Bunun bir nedeni, dokunmatik cihazlar için cihaz sürücülerinin genellikle cihaza özgü birimleri kullanarak dokunuşların özelliklerini bildirmesidir.
Örneğin, birçok dokunmatik cihaz, dokunuşla tetiklenen toplam sensör düğümleri gibi dahili cihaza özgü bir ölçek kullanarak dokunma temas alanını ölçer. Bu ham boyut değeri uygulamalar için anlamlı olmayacaktır, çünkü dokunmatik aygıt sensörü düğümlerinin fiziksel boyutu ve diğer özellikleri hakkında bilgi sahibi olmaları gerekir.
Sistem, dokunmatik aygıtı tarafından bildirilen değerleri uygulamaların anlayabileceği daha basit bir standart gösterime kodlamak, dönüştürmek ve normalleştirmek için giriş aygıtı yapılandırma dosyalarında kodlanan kalibrasyon parametrelerini kullanır.
Dokümantasyon Sözleşmeleri
Dokümantasyon amacıyla, kalibrasyon işlemi sırasında sistem tarafından kullanılan değerleri tanımlamak için aşağıdaki sözleşmeleri kullanıyoruz.
Ham eksen değerleri
Aşağıdaki ifadeler, dokunmatik aygıt sürücüsü tarafından EV_ABS
olayları olarak bildirilen ham değerleri gösterir.
-
raw.x
-
ABS_X
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 mevcut değilseraw.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 mevcut değilseraw.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.
Çiğ eksen aralıkları
Aşağıdaki ifadeler ham değerlerin sınırlarını gösterir. Her eksen için EVIOCGABS
IOCTL çağrılarak elde edilirler.
-
raw.*.min
- Ham eksenin kapsayıcı minimum değeri.
-
raw.*.max
- Ham eksenin kapsayıcı maksimum değeri.
-
raw.*.range
-
raw.*.max - raw.*.min
. -
raw.*.fuzz
- Ham eksenin doğruluğu. Örneğin. Fuzz = 1, değerlerin +/- 1 birimine doğru olduğunu ima eder.
-
raw.width
-
raw.x.range + 1
eşdeğer dokunmatik alanın kapsayıcı genişliği. -
raw.height
-
raw.y.range + 1
eşdeğer dokunmatik alanın kapsayıcı yüksekliği.
Çıktı aralıkları
Aşağıdaki ifadeler çıktı koordinat sisteminin özelliklerini gösterir. Sistem, dokunmatik cihaz tarafından kullanılan yüzey birimlerinden dokunma konumu bilgilerini, ekran pikselleri gibi uygulamalara bildirilen çıkış birimlerine çevirmek için doğrusal enterpolasyon kullanır.
-
output.width
- Çıkış genişliği. For touch screens (associated with a display), this is the display width in pixels. For touch pads (not associated with a display), the output width equals
raw.width
, indicating that no interpolation is performed. -
output.height
- The output height. For touch screens (associated with a display), this is the display height in pixels. For touch pads (not associated with a display), the output height equals
raw.height
, indicating that no interpolation is performed. -
output.diag
- The diagonal length of the output coordinate system, equivalent to
sqrt(output.width ^2 + output.height ^2)
.
Temel yapılandırma
The touch input mapper uses many configuration properties in the input device configuration file to specify calibration values. The following table describes some general purpose configuration properties. All other properties are described in the following sections along with the fields they are used to calibrate.
touch.deviceType
Definition: touch.deviceType
= touchScreen
| touchPad
| pointer
| default
Specifies the touch device type.
If the value is
touchScreen
, the touch device is a touch screen associated with a display.If the value is
touchPad
, the touch device is a touch pad not associated with a display.If the value is
pointer
, the touch device is a touch pad not associated with a display, and its motions are used for indirect multi-touch pointer gestures .If the value is
default
, the system automatically detects the device type according to the classification algorithm.
Refer to the Classification section for more details about how the device type influences the behavior of the touch device.
In Android 3 and lower, all touch devices were assumed to be touch screens.
touch.orientationAware
Definition: touch.orientationAware
= 0
| 1
Specifies whether the touch device should react to display orientation changes.
If the value is
1
, touch positions reported by the touch device are rotated whenever the display orientation changes.If the value is
0
, touch positions reported by the touch device are immune to display orientation changes.
The default value is 1
if the device is a touch screen, 0
otherwise.
The system distinguishes between internal and external touch screens and displays. An orientation aware internal touch screen is rotated based on the orientation of the internal display. An orientation aware external touch screen is rotated based on the orientation of the external display.
Orientation awareness is used to support rotation of touch screens on devices like the Nexus One. For example, when the device is rotated clockwise 90 degrees from its natural orientation, the absolute positions of touches are remapped such that a touch in the top-left corner of the touch screen's absolute coordinate system is reported as a touch in the top-left corner of the display's rotated coordinate system. This is done so that touches are reported with the same coordinate system that apps use to draw their visual elements.
Prior to Honeycomb, all touch devices were assumed to be orientation aware.
touch.gestureMode
Definition: touch.gestureMode
= pointer
| spots
| default
Specifies the presentation mode for pointer gestures. This configuration property is only relevant when the touch device is of type pointer .
If the value is
pointer
, the touch pad gestures are presented by way of a cursor similar to a mouse pointer.If the value is
spots
, the touch pad gestures are presented by an anchor that represents the centroid of the gesture and a set of circular spots that represent the position of individual fingers.
The default value is pointer
when the INPUT_PROP_SEMI_MT
input property is set, or spots
otherwise.
X and Y fields
The X and Y fields provide positional information for the center of the contact area.
Hesaplama
The calculation is straightforward: positional information from the touch driver is linearly interpolated to the output coordinate system.
xScale = output.width / raw.width yScale = output.height / raw.height If not orientation aware or screen rotation is 0 degrees: output.x = (raw.x - raw.x.min) * xScale output.y = (raw.y - raw.y.min) * yScale Else If rotation is 90 degrees: output.x = (raw.y - raw.y.min) * yScale output.y = (raw.x.max - raw.x) * xScale Else If rotation is 180 degrees: output.x = (raw.x.max - raw.x) * xScale output.y = (raw.y.max - raw.y) * yScale Else If rotation is 270 degrees: output.x = (raw.y.max - raw.y) * yScale output.y = (raw.x - raw.x.min) * xScale End If
touchMajor, touchMinor, toolMajor, toolMinor, size fields
The touchMajor
and touchMinor
fields describe the approximate dimensions of the contact area in output units (pixels).
The toolMajor
and toolMinor
fields describe the approximate dimensions of the tool itself in output units (pixels).
The size
field describes the normalized size of the touch relative to the largest possible touch that the touch device can sense. The smallest possible normalized size is 0.0 (no contact, or it is unmeasurable), and the largest possible normalized size is 1.0 (sensor area is saturated).
When both the approximate length and breadth can be measured, then the touchMajor
field specifies the longer dimension and the touchMinor
field specifies the shorter dimension of the contact area. When only the approximate diameter of the contact area can be measured, then the touchMajor
and touchMinor
fields are equal.
Likewise, the toolMajor
field specifies the longer dimension and the toolMinor
field specifies the shorter dimension of the tool's cross-sectional area.
If the touch size is unavailable but the tool size is available, then the tool size is set equal to the touch size. Conversely, if the tool size is unavailable but the touch size is available, then the touch size is set equal to the tool size.
Touch devices measure or report the touch size and tool size in various ways. The current implementation supports three different kinds of measurements: diameter, area, and geometric bounding box in surface units.
Definition: touch.size.calibration
= none
| geometric
| diameter
| area
| default
Specifies the kind of measurement used by the touch driver to report the touch size and tool size.
If the value is
none
, the size is set to zero.If the value is
geometric
, the size is assumed to be specified in the same surface units as the position, so it is scaled in the same manner.If the value is
diameter
, the size is assumed to be proportional to the diameter (width) of the touch or tool.If the value is
area
, the size is assumed to be proportional to the area of the touch or tool.If the value is
default
, the system uses thegeometric
calibration if theraw.touchMajor
orraw.toolMajor
axis is available, otherwise it uses thenone
calibration.
touch.size.scale
Definition: touch.size.scale
= <a non-negative floating point number>
Specifies a constant scale factor used in the calibration.
The default value is 1.0
.
touch.size.bias
Definition: touch.size.bias
= <a non-negative floating point number>
Specifies a constant bias value used in the calibration.
The default value is 0.0
.
touch.size.isSummed
Definition: touch.size.isSummed
= 0
| 1
Specifies whether the size is reported as the sum of the sizes of all active contacts, or is reported individually for each contact.
If the value is
1
, the reported size is divided by the number of contacts prior to use.If the value is
0
, the reported size is used as is.
The default value is 0
.
Some touch devices, particularly "Semi-MT" devices cannot distinguish the individual dimensions of multiple contacts so they report a size measurement that represents their total area or width. This property should only be set to 1
for such devices. If in doubt, set this value to 0
.
Hesaplama
The calculation of the touchMajor
, touchMinor
, toolMajor
, toolMinor
, and size
fields depends on the specified calibration parameters.
If raw.touchMajor and raw.toolMajor are available: touchMajor = raw.touchMajor touchMinor = raw.touchMinor toolMajor = raw.toolMajor toolMinor = raw.toolMinor Else If raw.touchMajor is available: toolMajor = touchMajor = raw.touchMajor toolMinor = touchMinor = raw.touchMinor Else If raw.toolMajor is available: touchMajor = toolMajor = raw.toolMajor touchMinor = toolMinor = raw.toolMinor Else touchMajor = toolMajor = 0 touchMinor = toolMinor = 0 size = 0 End If size = avg(touchMajor, touchMinor) If touch.size.isSummed == 1: touchMajor = touchMajor / numberOfActiveContacts touchMinor = touchMinor / numberOfActiveContacts toolMajor = toolMajor / numberOfActiveContacts toolMinor = toolMinor / numberOfActiveContacts size = size / numberOfActiveContacts End If If touch.size.calibration == "none": touchMajor = toolMajor = 0 touchMinor = toolMinor = 0 size = 0 Else If touch.size.calibration == "geometric": outputScale = average(output.width / raw.width, output.height / raw.height) touchMajor = touchMajor * outputScale touchMinor = touchMinor * outputScale toolMajor = toolMajor * outputScale toolMinor = toolMinor * outputScale Else If touch.size.calibration == "area": touchMajor = sqrt(touchMajor) touchMinor = touchMajor toolMajor = sqrt(toolMajor) toolMinor = toolMajor Else If touch.size.calibration == "diameter": touchMinor = touchMajor toolMinor = toolMajor End If If touchMajor != 0: output.touchMajor = touchMajor * touch.size.scale + touch.size.bias Else output.touchMajor = 0 End If If touchMinor != 0: output.touchMinor = touchMinor * touch.size.scale + touch.size.bias Else output.touchMinor = 0 End If If toolMajor != 0: output.toolMajor = toolMajor * touch.size.scale + touch.size.bias Else output.toolMajor = 0 End If If toolMinor != 0: output.toolMinor = toolMinor * touch.size.scale + touch.size.bias Else output.toolMinor = 0 End If output.size = size
pressure field
The pressure
field describes the approximate physical pressure applied to the touch device as a normalized value between 0.0 (no touch) and 1.0 (normal pressure).
A zero pressure indicates that the tool is hovering.
touch.pressure.calibration
Definition: touch.pressure.calibration
= none
| physical
| amplitude
| default
Specifies the kind of measurement used by the touch driver to report the pressure.
If the value is
none
, the pressure is unknown so it is set to 1.0 when touching and 0.0 when hovering.If the value is
physical
, the pressure axis is assumed to measure the actual physical intensity of pressure applied to the touch pad.If the value is
amplitude
, the pressure axis is assumed to measure the signal amplitude, which is related to the size of the contact and the pressure applied.If the value is
default
, the system uses 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
.
Hesaplama
The calculation of the pressure
field depends on the specified calibration parameters.
If touch.pressure.calibration == "physical" or "amplitude": output.pressure = raw.pressure * touch.pressure.scale Else If hovering: output.pressure = 0 Else output.pressure = 1 End If End If
orientation and tilt fields
The orientation
field describes the orientation of the touch and tool as an angular measurement. An orientation of 0
indicates that the major axis is oriented vertically, -PI/2
indicates that the major axis is oriented to the left, PI/2
indicates that the major axis is oriented to the right. When a stylus tool is present, the orientation range can be described in a full circle range from -PI
or PI
.
The tilt
field describes the inclination of the tool as an angular measurement. A tilt of 0
indicates that the tool is perpendicular to the surface. A tilt of PI/2
indicates that the tool is flat on the surface.
touch.orientation.calibration
Definition: touch.orientation.calibration
= none
| interpolated
| vector
| default
Specifies the kind of measurement used by the touch driver to report the orientation.
- If the value is
none
, the orientation is unknown so it is set to 0. - If the value is
interpolated
, the orientation is linearly interpolated such that a raw value 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
.
Hesaplama
The calculation of the orientation
and tilt
fields depends on the specified calibration parameters and available input.
If touch.tiltX and touch.tiltY are available: tiltXCenter = average(raw.tiltX.min, raw.tiltX.max) tiltYCenter = average(raw.tiltY.min, raw.tiltY.max) tiltXAngle = (raw.tiltX - tiltXCenter) * PI / 180 tiltYAngle = (raw.tiltY - tiltYCenter) * PI / 180 output.orientation = atan2(-sin(tiltXAngle), sinf(tiltYAngle)) output.tilt = acos(cos(tiltXAngle) * cos(tiltYAngle)) Else If touch.orientation.calibration == "interpolated": center = average(raw.orientation.min, raw.orientation.max) output.orientation = PI / (raw.orientation.max - raw.orientation.min) output.tilt = 0 Else If touch.orientation.calibration == "vector": c1 = (raw.orientation & 0xF0) >> 4 c2 = raw.orientation & 0x0F If c1 != 0 or c2 != 0: If c1 >= 8 Then c1 = c1 - 16 If c2 >= 8 Then c2 = c2 - 16 angle = atan2(c1, c2) / 2 confidence = sqrt(c1*c1 + c2*c2) output.orientation = angle If touch.size.calibration == "diameter" or "area": scale = 1.0 + confidence / 16 output.touchMajor *= scale output.touchMinor /= scale output.toolMajor *= scale output.toolMinor /= scale End If Else output.orientation = 0 End If output.tilt = 0 Else output.orientation = 0 output.tilt = 0 End If If orientation aware: If screen rotation is 90 degrees: output.orientation = output.orientation - PI / 2 Else If screen rotation is 270 degrees: output.orientation = output.orientation + PI / 2 End If End If
distance field
The distance
field describes the distance between the tool and the touch device surface. A value of 0.0 indicates direct contact and larger values indicate increasing distance from the surface.
touch.distance.calibration
Definition: touch.distance.calibration
= none
| scaled
| default
Specifies the kind of measurement used by the touch driver to report the distance.
If the value is
none
, the distance is unknown so it is set to 0.If the value is
scaled
, the reported distance is multiplied by a constant scale factor.If the value is
default
, the system uses 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
.
Hesaplama
The calculation of the distance
field depends on the specified calibration parameters.
If touch.distance.calibration == "scaled": output.distance = raw.distance * touch.distance.scale Else output.distance = 0 End If
Örnek
# Input device configuration file for a touch screen that supports pressure, # size and orientation. The pressure and size scale factors were obtained # by measuring the characteristics of the device itself and deriving # useful approximations based on the resolution of the touch sensor and the # display. # # Note that these parameters are specific to a particular device model. # Different parameters need to be used for other devices. # Basic Parameters touch.deviceType = touchScreen touch.orientationAware = 1 # Size # Based on empirical measurements, we estimate the size of the contact # using size = sqrt(area) * 28 + 0. touch.size.calibration = area touch.size.scale = 28 touch.size.bias = 0 touch.size.isSummed = 0 # Pressure # Driver reports signal strength as pressure. # # A normal index finger touch typically registers about 80 signal strength # units although we don't expect these values to be accurate. touch.pressure.calibration = amplitude touch.pressure.scale = 0.0125 # Orientation touch.orientation.calibration = vector
Compatibility notes
The configuration properties for touch devices changed significantly in Android Ice Cream Sandwich 4.0. All input device configuration files for touch devices must be updated to use the new configuration properties.
Older touch device drivers might also need to be updated.
Virtual key map files
Touch devices can be used to implement virtual keys.
There are several ways of doing this, depending on the capabilities of the touch controller. Some touch controllers can be directly configured to implement soft keys by setting firmware registers. Other times it is desirable to perform the mapping from touch coordinates to key codes in software.
When virtual keys are implemented in software, the kernel must export a virtual key map file called virtualkeys.<devicename>
as a board property. For example, if the touch screen device drivers reports its name as "touchyfeely" then the virtual key map file must have the path /sys/board_properties/virtualkeys.touchyfeely
.
A virtual key map file describes the coordinates and Linux key codes of virtual keys on the touch screen.
In addition to the virtual key map file, there must be a corresponding key layout file and key character map file to map the Linux key codes to Android key codes and to specify the type of the keyboard device (usually SPECIAL_FUNCTION
).
Sözdizimi
A virtual key map file is a plain text file consisting of a sequence of virtual key layout descriptions either separated by newlines or by colons.
Comment lines begin with '#' and continue to the end of the line.
Each virtual key is described by 6 colon-delimited components:
-
0x01
: A version code. Must always 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
.
Örnek
Virtual key map file: /sys/board_properties/virtualkeys.touchyfeely
.
0x01:158:55:835:90:55 0x01:139:172:835:125:55 0x01:102:298:835:115:55 0x01:217:412:835:95:55
Key layout file: /system/usr/keylayout/touchyfeely.kl
.
key 158 BACK key 139 MENU key 172 HOME key 217 SEARCH
Key character map file: /system/usr/keychars/touchyfeely.kcm
.
type SPECIAL_FUNCTION
Indirect multi-touch pointer gestures
In pointer mode, the system interprets the following gestures:
- Single finger tap: click.
- Single finger motion: move the pointer.
- Single finger motion plus button presses: drag the pointer.
- Two finger motion both fingers moving in the same direction: drag the area under the pointer in that direction. The pointer itself does not move.
- Two finger motion both fingers moving towards each other or apart in different directions: pan/scale/rotate the area surrounding the pointer. The pointer itself does not move.
- Multiple finger motion: freeform gesture.
Palm rejection
As of Android 13, the system can automatically reject inputs from palms when the built-in framework is enabled. In-house, custom-built solutions are still supported, though they might need to be modified to return the TOOL_TYPE_PALM
flag when a palm is detected. The built-in framework also works in conjunction with custom solutions.
The actual model looks at the first 90 ms of gesture data, at the current pointer, and at the surrounding pointers, then considers how far away from the display edge the touches are. It then determines, on a per-pointer basis, which of the pointers are palms. It also takes into account the size of each contact, as reported by touchMajor
and touchMinor
. The Android framework then removes the pointers that are marked as palms from the touch stream.
If a pointer was already sent to the apps, then the system either:
- (If there are other active pointers) Cancels the pointer with
ACTION_POINTER_UP
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