Android, kalem tabanlı dijitalleştirici tabletler de dahil olmak üzere çeşitli dokunmatik ekranları ve dokunmatik yüzeyleri destekler.
Dokunmatik ekranlar, bir ekranla ilişkilendirilmiş dokunma cihazlarıdır. Bu sayede kullanıcı, ekrandaki öğeleri doğrudan kontrol ettiği izlenimine kapılır.
Dokunmatik yüzeyler, bir ekranla ilişkilendirilmeyen dokunmatik cihazlardır (ör. grafik tablet). Dokunmatik alanlar genellikle işaretleme, mutlak dolaylı konumlandırma veya kullanıcı arayüzünün hareket tabanlı kontrolü için kullanılır.
Dokunmatik cihazlarda, işlevleri fare düğmelerine benzeyen düğmeler olabilir.
Dokunmatik cihazlar, temel dokunmatik sensör teknolojisine bağlı olarak bazen parmak veya kalem gibi çeşitli 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 dokunmaya duyarlı bir tuş takımının parçası olarak iki amaca hizmet eder.
Dokunmatik cihazların çeşitliliği nedeniyle Android, her cihazın özelliklerini ve istenen davranışını tanımlamak için çok sayıda yapılandırma özelliğine dayanır.
Dokunmatik cihaz sınıflandırması
Aşağıdaki koşulların her ikisi de geçerliyse giriş cihazı çoklu dokunma 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 oyun kumandası düğmeleri yok. Bu koşul, MT eksenlerinin kodlarıyla çakışan kodlarla eksen bildiren belirli gamepad'lerle ilgili belirsizliği giderir.
Aşağıdaki koşulların her ikisi de geçerliyse giriş cihazı tek dokunmalı cihaz olarak sınıflandırılır:
- Giriş cihazı, çoklu dokunma cihazı olarak sınıflandırılmamıştır. Giriş cihazları tek dokunma cihazı veya çoklu dokunma cihazı olarak sınıflandırılır, ikisi birden olmaz.
- Giriş cihazı,
ABS_X
veABS_Y
mutlak eksenlerinin veBTN_TOUCH
tuş kodunun varlığını bildirir.
Bir giriş cihazı dokunmatik cihaz olarak sınıflandırıldığında sanal tuşların varlığı, cihazın sanal tuş haritası dosyası yüklenmeye çalışılarak belirlenir. Sanal tuş haritası varsa cihazın tuş düzeni dosyası da yüklenir. Bu dosyaların konumu ve biçimi hakkında bilgi edinmek için [Sanal anahtar harita dosyaları](#virtual-key-map-files) bölümüne bakın.
Ardından, sistem dokunmatik cihaz için giriş cihazı yapılandırma dosyasını yükler.
Tüm yerleşik dokunmatik cihazlarda giriş cihazı yapılandırma dosyaları olmalıdır. Giriş cihazı yapılandırma dosyası yoksa sistem, harici USB veya Bluetooth HID dokunmatik ekranlar ya da dokunmatik yüzeyler 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ış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.
- Dokunmatik ekranlı bir cihaz, ekrandaki nesnelerin doğrudan manipülasyonu için kullanılır. Kullanıcı ekrana doğrudan dokunduğu için sistem, üzerinde işlem yapılan nesneleri belirtmek için ek çaba gerektirmez.
- Dokunmatik yüzey cihaz, belirli bir sensör alanındaki dokunmalarla ilgili olarak bir uygulamaya mutlak konumlandırma bilgileri sağlamak için kullanılır. Bu özellik, dijitalleştirici tabletler için yararlı olabilir.
- İşaretçi cihazı, imleç kullanılarak ekrandaki nesnelerin dolaylı olarak kontrol edilmesi için kullanılır. Parmaklar, çoklu dokunma işaretçi hareketleri olarak yorumlanır. Kalem gibi diğer araçlar mutlak konumlar kullanılarak yorumlanır. Daha fazla bilgi için Dolaylı çoklu dokunma işaretçi hareketleri başlıklı makaleyi inceleyin.
Giriş cihazını dokunmatik ekran, dokunmatik yüzey veya işaretçi cihaz olarak sınıflandırmak için aşağıdaki kurallar kullanılır.
touch.deviceType
özelliği ayarlanmışsa cihaz türü belirtildiği gibi ayarlanır.- Giriş cihazı,
INPUT_PROP_DIRECT
giriş özelliğinin varlığını (EVIOCGPROP
ioctl aracılığıyla) bildiriyorsa cihaz türü dokunmatik ekran olarak ayarlanır. Bu koşul, doğrudan giriş dokunmatik cihazlarının bağlı bir ekrana takıldığını varsayar. - Giriş cihazı,
INPUT_PROP_POINTER
giriş özelliğinin varlığını (EVIOCGPROP
ioctl aracılığıyla) bildiriyorsa cihaz türü işaretçi olarak ayarlanır. - Giriş cihazı,
REL_X
veyaREL_Y
göreli eksenlerinin varlığını bildiriyorsa cihaz türü dokunmatik yüzey olarak ayarlanır. Bu koşul, hem fare hem de dokunmatik yüzeyden oluşan giriş cihazlarıyla ilgili belirsizliği giderir. Bu durumda, fare zaten işaretçiyi kontrol ettiğinden dokunmatik yüzey işaretçiyi kontrol etmek için kullanılmaz. - Aksi takdirde, cihaz türü pointer olarak ayarlanır. Bu varsayılan değer, başka özel amaç için atanmamış dokunmatik yüzeylerin 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 çalışır ve esas olarak işaretçi türü dokunmatik cihazlarda 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 basıldığında, tuş kodu olan bir tuşa basma işlemi de sentezlenir.KeyEvent.KEYCODE_BACK
.BTN_FORWARD
veBTN_EXTRA
:MotionEvent.BUTTON_FORWARD
ile eşlenir. Bu düğmeye basıldığında,KeyEvent.KEYCODE_FORWARD
tuş koduyla bir tuşa basma işlemi de sentezlenir.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şim kurmak için kullanılan bir parmak, kalem veya başka bir aparattır. Bazı dokunmatik cihazlar farklı türdeki araçları ayırt edebilir.
Android'in diğer bölümlerinde (ör. MotionEvent
API'si) araçlar genellikle işaretçi olarak adlandırılır.
Aşağıdaki araç türleri desteklenir:
BTN_TOOL_FINGER
veMT_TOOL_FINGER
:MotionEvent.TOOL_TYPE_FINGER
ile eşlenir.BTN_TOOL_PEN
veMT_TOOL_PEN
:MotionEvent.TOOL_TYPE_STYLUS
ile eşlenir.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şlenir.
Araçların üzerine gelme ve araçlara dokunma
Araçlar, dokunmatik cihazla temas halinde olabilir veya kapsama alanında olup üzerinde gezinebilir. Tüm dokunmatik cihazlar, dokunmatik cihazın üzerinde duran bir aracın varlığını algılayamaz. RF tabanlı kalem dijitalleştiriciler gibi bazıları, aracın dijitalleştiricinin sınırlı bir aralığında olduğunu algılayabilir.
InputReader
bileşeni, dokunma araçlarını üzerine gelme araçlarından ayırır. Aynı şekilde, dokunma araçları ve üzerine gelme araçları uygulamalara farklı şekillerde bildirilir.
Dokunma araçları, MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_MOVE
, MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_POINTER_DOWN
ve MotionEvent.ACTION_POINTER_UP
kullanılarak uygulamalara dokunma etkinlikleri 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 etkinlikleri olarak bildirilir.
Dokunmatik cihaz sürücüsü gereksinimleri
- Dokunmatik cihaz sürücüleri yalnızca destekledikleri eksenlerin ve düğmelerin eksenlerini ve tuş kodlarını kaydetmelidir. Desteklenmeyen eksenlerin veya tuş kodlarının kaydedilmesi, cihaz sınıflandırma algoritmasını karıştırabilir ya da sistemin cihazın özelliklerini yanlış algılamasına neden olabilir. Örneğin, cihaz
BTN_TOUCH
tuş kodunu bildiriyorsa sistem, aracın ekrana dokunup dokunmadığını belirtmek için her zamanBTN_TOUCH
tuşunun kullanıldığını varsayar. Bu nedenle,BTN_TOUCH
simgesi, aracın yalnızca menzilde olduğunu ve havada gezindiğini belirtmek için kullanılmamalıdır. - Tek dokunmalı cihazlar aşağıdaki Linux giriş etkinliklerini kullanır:
ABS_X
: (ZORUNLU) Aracın X koordinatını bildirir.ABS_Y
: (ZORUNLU) Aracın Y koordinatını bildirir.ABS_PRESSURE
: (İsteğe bağlı) Aracın ucuna uygulanan fiziksel basıncı veya dokunma temasının sinyal gücünü bildirir.ABS_TOOL_WIDTH
: (isteğe bağlı) Dokunma temasının veya aracın kendisinin kesit alanını ya da 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 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
: (ZORUNLU) 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_BRUSH
,BTN_TOOL_PENCIL
,BTN_TOOL_AIRBRUSH
,BTN_TOOL_MOUSE
,BTN_TOOL_LENS
,BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
,BTN_TOOL_QUADTAP
: (isteğe bağlı) Araç türünü bildirir.
- Çok dokunmalı cihazlar aşağıdaki Linux giriş etkinliklerini kullanır:
ABS_MT_POSITION_X
: (ZORUNLU) Aracın X koordinatını bildirir.ABS_MT_POSITION_Y
: (ZORUNLU) Aracın Y koordinatını bildirir.ABS_MT_PRESSURE
: (İsteğe bağlı) Aracın ucuna uygulanan fiziksel basıncı veya dokunma temasının sinyal gücünü bildirir.ABS_MT_TOUCH_MAJOR
: (isteğe bağlı) Dokunma temasının kesit alanını veya dokunma temasının daha uzun boyutunun uzunluğunu bildirir.ABS_MT_TOUCH_MINOR
: (isteğe bağlı) Dokunma temasının daha kısa boyutunun uzunluğunu bildirir.ABS_MT_TOUCH_MAJOR
bir alan ölçümü raporluyorsa bu eksen kullanılmamalıdır.ABS_MT_WIDTH_MAJOR
: (isteğe bağlı) Aracın kesit alanını veya aracın kendisinin daha uzun boyutunun uzunluğunu bildirir. Aracın boyutlarını bilmiyorsanız bu ekseni kullanmayın.ABS_MT_WIDTH_MINOR
: (isteğe bağlı) Aracın kendisinin daha kısa boyutunun uzunluğunu bildirir.ABS_MT_WIDTH_MAJOR
bir alan ölçümü bildiriyorsa veya aracın boyutları bilinmiyorsa bu eksen kullanılmamalıdır.ABS_MT_ORIENTATION
: (isteğe bağlı) Aracın yönünü bildirir.ABS_MT_DISTANCE
: (isteğe bağlı) Aracın dokunmatik cihazın yüzeyine olan mesafesini bildirir.ABS_MT_TOOL_TYPE
: (isteğe bağlı) Araç türünüMT_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 aracı bağımsız olarak tanımlamak ve izlemek için kullanılan rastgele bir negatif olmayan tam sayıdır. Örneğin, cihaza birden fazla parmak dokunduğunda her parmağa, temas devam ettiği sürece kullanılan ayrı bir izleme kimliği atanmalıdır. İzleme kimlikleri, ilişkili araçlar kapsama alanı 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 bilgi için Linux çoklu dokunma protokolü belgelerine bakın.BTN_TOUCH
: (ZORUNLU) 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_BRUSH
,BTN_TOOL_PENCIL
,BTN_TOOL_AIRBRUSH
,BTN_TOOL_MOUSE
,BTN_TOOL_LENS
,BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
,BTN_TOOL_QUADTAP
: (isteğe bağlı) Araç türünü bildirir.
- Hem tek dokunma hem de çoklu dokunma protokolü için eksenler tanımlanırsa yalnızca çoklu dokunma eksenleri kullanılır ve tek dokunma eksenleri yoksayılır.
ABS_X
,ABS_Y
,ABS_MT_POSITION_X
veABS_MT_POSITION_Y
eksenlerinin minimum ve maksimum değerleri, cihaza özel yüzey birimlerinde cihazın etkin alanının sınırlarını tanımlar. Dokunmatik ekran söz konusu olduğunda etkin alan, dokunmatik cihazın ekranı gerçekten kaplayan kısmını tanımlar.Dokunmatik ekranda sistem, bildirilen dokunma konumlarını yüzey birimlerinde otomatik olarak enterpolasyon yaparak aşağıdaki hesaplamaya göre ekrandaki piksellerde dokunma konumlarını elde eder:
displayX = (x - minX) * displayWidth / (maxX - minX + 1) displayY = (y - minY) * displayHeight / (maxY - minY + 1)
Dokunmatik ekran, bildirilen etkin alanın dışındaki dokunuşları bildirebilir.
Etkin alanın dışında başlatılan dokunmalar uygulamalara iletilmez ancak sanal tuşlar için kullanılabilir.
Etkin alanın içinde başlatılan veya görüntüleme alanına girip çıkan dokunmalar uygulamalara iletilir. Dolayısıyla, bir dokunma işlemi uygulamanın sınırları içinde başlayıp etkin alanın dışına taşarsa uygulama, negatif olan veya ekranın sınırlarının dışında kalan ekran koordinatlarına sahip dokunma etkinlikleri alabilir. Bu, beklenen bir davranıştır.
Dokunmatik cihazlar, dokunma koordinatlarını etkin alanın sınırlarına hiçbir zaman sabitlememelidir. Etkin alanın dışına çıkan dokunmalar, etkin alanın dışında olarak raporlanmalı veya hiç raporlanmamalıdır.
Örneğin, kullanıcının parmağı dokunmatik ekranın sol üst köşesine yakın bir yere dokunuyorsa (minX, minY) koordinatı bildirilebilir. Parmak etkin alanın dışına doğru hareket etmeye devam ederse dokunmatik ekran, minX ve minY'den küçük bileşenlere sahip koordinatları (ör. (minX - 2, minY - 3)) bildirmeye başlamalı veya dokunma raporlamayı tamamen durdurmalıdır. Başka bir deyişle, kullanıcı parmağı etkin alanın dışına dokunduğunda dokunmatik ekran bildirmemelidir (minX, minY).
Dokunma koordinatlarını ekran kenarına sabitlemek, ekranın kenarında yapay bir sert sınır oluşturur. Bu durum, sistemin ekran alanının sınırlarına giren veya bu sınırlardan çıkan hareketleri sorunsuz bir şekilde izlemesini engeller.
ABS_PRESSURE
veyaABS_MT_PRESSURE
tarafından bildirilen değerler (bildirilirse) araç cihaza dokunduğunda sıfır olmayan, araç üzerine geldiğinde ise sıfır olmalıdır.Basınç bilgilerinin bildirilmesi isteğe bağlıdır ancak kesinlikle önerilir. 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 sıfır olmayan, aksi takdirde sıfır olmalıdır ancak bu zorunlu değildir. Örneğin, dokunmatik cihaz, parmakla dokunma temaslarının boyutunu ölçebilir ancak kalemle dokunma temaslarının boyutunu ölçemeyebilir.Beden bilgisi göndermek isteğe bağlıdır ancak kesinlikle önerilir. Uygulamalar, basınca 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 dokunduğunda sıfıra yaklaşmalıdır. Alet doğrudan temas halinde olsa bile mesafe sıfırdan farklı kalabilir. Bildirilen tam değerler, donanımın mesafeyi ölçme şekline bağlıdır.Mesafe bilgilerinin bildirilmesi isteğe bağlıdır ancak kalem cihazlar için önerilir.
Araç cihaza dik olduğunda
ABS_TILT_X
veABS_TILT_Y
tarafından bildirilen değerler sıfır olmalıdır. Sıfır olmayan bir eğim, aracın eğimli tutulduğunu gösterir.X ve Y eksenleri boyunca eğim açılarının, dik açıdan itibaren derece cinsinden belirtildiği varsayılır. Merkez nokta (tamamen dik) her eksen için
(max + min) / 2
ile verilir. Merkez noktasından küçük değerler yukarı veya sola eğimi, merkez noktasından büyük değerler ise aşağı veya sağa eğimi gösterir.InputReader
, X ve Y eğim bileşenlerini 0 ilePI / 2
radyan arasında değişen dik bir eğim açısına ve-PI
ilePI
radyan arasında değişen düzlemsel bir yönlendirme açısına dönüştürür. Bu gösterim, parmak dokunuşlarını tanımlamak için kullanılanla uyumlu bir yönlendirme açıklamasıyla sonuçlanır.Eğme bilgisini bildirmek isteğe bağlıdır ancak kalem cihazlar için önerilir.
Araç türü
ABS_MT_TOOL_TYPE
tarafından bildiriliyorsaBTN_TOOL_*
tarafından bildirilen tüm araç türü bilgilerinin yerini alır. Hiçbir araç türü bilgisi yoksa araç türü varsayılan olarakMotionEvent.TOOL_TYPE_FINGER
olur.Bir aracın etkin olup olmadığı aşağıdaki koşullara göre belirlenir:
Tek dokunma protokolü kullanılırken
BTN_TOUCH
veyaBTN_TOOL_*
değeri 1 ise araç etkindir.Bu koşul,
InputReader
öğesinin aracın doğası hakkında, dokunup dokunmadığı veya en azından araç türüyle ilgili bazı bilgilere sahip olması gerektiğini gösterir. Herhangi bir bilgi yoksa aracın etkin olmadığı (aralık dışında) varsayılır.- Çoklu dokunma protokolü "A" kullanılırken araç, en son senkronizasyon raporunda göründüğü sürece aktiftir. Araç, senkronizasyon raporlarında görünmeyi bıraktığında varlığı sona erer.
- Çoklu dokunma protokolü "B" kullanılırken araç, etkin bir yuvaya sahip olduğu sürece aktiftir. Yuva temizlendiğinde araç artık mevcut olmaz.
- Bir aracın fareyle üzerine gelindiği aşağıdaki koşullara göre belirlenir:
- Araç
BTN_TOOL_MOUSE
veyaBTN_TOOL_LENS
ise aşağıdaki koşullardan biri doğru olsa bile araç fareyle üzerine gelme durumunda değildir. - Araç etkinse ve sürücü basınç bilgisi bildiriyorsa ve bildirilen basınç sıfırsa araç bekletiliyor demektir.
- Araç etkinse ve sürücü
BTN_TOUCH
anahtar kodunu destekliyorsa veBTN_TOUCH
değeri sıfırsa araç bekletme modundadır.
- Araç
InputReader
, hem "A" hem de "B" çoklu dokunma protokolünü destekler. Yeni sürücüler "B" protokolünü kullanmalıdır ancak her ikisi de çalışır.Android 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 gerekebilir:
Bir araç devre dışı kaldığında (parmak "kalktığında") sonraki çoklu dokunma senkronizasyon raporlarında görünmeyi bırakmalıdır. Tüm araçlar devre dışı kaldığında (tüm parmaklar "yukarı" gider) sürücü,
SYN_MT_REPORT
ardındanSYN_REPORT
gibi boş bir senkronizasyon raporu paketi göndermelidir.Android'in önceki sürümlerinde, "yukarı" etkinliklerinin 0 basınç değeri gönderilerek bildirilmesi bekleniyordu. Eski davranış, Linux giriş protokolü spesifikasyonuyla uyumlu değildi ve artık desteklenmiyor.
Fiziksel basınç veya sinyal gücü bilgileri
ABS_MT_PRESSURE
kullanılarak bildirilmelidir.Android'in önceki sürümleri, basınç bilgilerini
ABS_MT_TOUCH_MAJOR
kaynağından alıyordu. Eski davranış, Linux giriş protokolü spesifikasyonuyla uyumlu değildi ve artık desteklenmiyor.- Dokunma boyutu bilgileri
ABS_MT_TOUCH_MAJOR
kullanılarak bildirilmelidir.Android'in önceki sürümleri, boyut bilgilerini
ABS_MT_TOOL_MAJOR
adresinden alıyordu. Eski davranış, Linux giriş protokolü spesifikasyonuyla uyumlu değildi ve artık desteklenmiyor.
Dokunmatik cihaz işlemleri
Aşağıda, Android'de dokunmatik cihaz işlemlerinin kısa bir özeti verilmiştir.
EventHub
,evdev
sürücüsünden ham etkinlikleri okur.InputReader
, ham etkinlikleri kullanır ve her aracın konumu ile diğer özellikleri hakkında dahili durumu günceller. Ayrıca düğme durumlarını da izler.- BACK (Geri) veya FORWARD (İleri) tuşuna basılırsa ya da tuş bırakılırsa,
InputReader
,InputDispatcher
'e önemli etkinlik hakkında bildirim gönderir. InputReader
, sanal tuşa basılıp basılmadığını belirler. Bu durumda,InputDispatcher
önemli etkinlik hakkında bilgilendirilir.InputReader
, dokunmanın ekran sınırları içinde başlatılıp başlatılmadığını belirler. Bu durumda, dokunma etkinliği hakkındaInputDispatcher
bilgilendirilir.- Dokunma aracı yoksa ancak en az bir fareyle üzerine gelme aracı varsa,
InputReader
, fareyle üzerine gelme etkinliği hakkındaInputDispatcher
'i bilgilendirir. - Dokunma cihazı türü işaretçi ise
InputReader
, işaretçi hareketi algılama işlemi gerçekleştirir, işaretçiyi ve noktaları buna göre hareket ettirir veInputDispatcher
'ı işaretçi etkinliği hakkında bilgilendirir. InputDispatcher
, etkinliklerin gönderilip gönderilmeyeceğini ve cihazı uyandırıp uyandırmayacağını belirlemek içinWindowManagerPolicy
kullanır. ArdındanInputDispatcher
, etkinlikleri uygun uygulamalara iletir.
Dokunmatik cihaz yapılandırması
Dokunma cihazını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 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ş cihazı yapılandırma özelliğini kullanır.
Bunun bir nedeni, dokunmatik cihazların cihaz sürücülerinin dokunma özelliklerini genellikle cihaza özgü birimler kullanarak bildirmesidir.
Örneğin, birçok dokunmatik cihaz, dokunma temas alanını cihazın içindeki cihaza özel bir ölçek kullanarak ölçer. Bu ölçek, dokunma tarafından tetiklenen toplam sensör düğümü sayısı gibi bir değer olabilir. Bu ham boyut değeri, dokunmatik cihaz sensör düğümlerinin fiziksel boyutu ve diğer özellikleri hakkında bilgi sahibi olmaları gerektiğinden uygulamalar için anlamlı olmaz.
Sistem, dokunmatik cihaz tarafından bildirilen değerleri uygulamaların anlayabileceği daha basit bir standart gösterime dönüştürmek, dönüştürmek ve normalleştirmek için giriş cihazı yapılandırma dosyalarında kodlanmış kalibrasyon parametrelerini kullanır.
Belgeleme kuralları
Belgeleme 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 cihaz sürücüsü tarafından EV_ABS
etkinlikleri 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 ya da kullanılamıyorsa 0.raw.touchMajor
ABS_MT_TOUCH_MAJOR
ekseninin değeri veya kullanılamıyorsa 0.raw.touchMinor
ABS_MT_TOUCH_MINOR
ekseninin değeri veya kullanılamıyorsaraw.touchMajor
.raw.toolMajor
ABS_TOOL_WIDTH
veyaABS_MT_WIDTH_MAJOR
ekseninin değeri ya da kullanılamıyorsa 0.raw.toolMinor
ABS_MT_WIDTH_MINOR
ekseninin değeri veya kullanılamıyorsaraw.toolMajor
.raw.orientation
ABS_MT_ORIENTATION
ekseninin değeri veya kullanılamıyorsa 0.raw.distance
ABS_DISTANCE
veyaABS_MT_DISTANCE
ekseninin değeri ya da kullanılamıyorsa 0.raw.tiltX
ABS_TILT_X
ekseninin değeri veya kullanılamıyorsa 0.raw.tiltY
ABS_TILT_Y
ekseninin değeri veya kullanılamıyorsa 0.
Ham 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 edilir.
raw.*.min
- Ham eksenin dahil edici minimum değeri.
raw.*.max
- Ham eksenin kapsayıcı maksimum değeri.
raw.*.range
raw.*.max - raw.*.min
etiketine eş değer.raw.*.fuzz
- Ham eksenin doğruluğu. Örneğin, fuzz = 1, değerlerin +/- 1 birim doğru olduğunu gösterir.
raw.width
- Dokunma alanının
raw.x.range + 1
değerine eşit olan genişliği. raw.height
- Dokunma alanının
raw.y.range + 1
değerine eşit olan yüksekliği.
Çıkış aralıkları
Aşağıdaki ifadeler, çıkış koordinat sisteminin özelliklerini belirtir. Sistem, dokunmatik cihaz tarafından kullanılan yüzey birimlerindeki dokunma konumu bilgilerini, uygulamalara (ör. ekran pikselleri) bildirilen çıkış birimlerine çevirmek için doğrusal enterpolasyon kullanır.
output.width
- Çıkış genişliği. Dokunmatik ekranlar (ekranla ilişkili) için bu değer, piksel cinsinden ekran genişliğidir. Dokunmatik yüzeyler (ekranla ilişkili olmayan) için çıkış genişliği
raw.width
'ya eşittir. Bu, enterpolasyon yapılmadığını gösterir. output.height
- Çıkış yüksekliği. Dokunmatik ekranlar (bir ekranla ilişkili) için bu değer, piksel cinsinden ekran yüksekliğidir. Dokunmatik yüzeyler (ekranla ilişkili olmayan) için çıkış yüksekliği
raw.height
'ya eşittir. Bu, enterpolasyon yapılmadığını gösterir. output.diag
- Çıkış koordinat sisteminin köşegen uzunluğu,
sqrt(output.width ^2 + output.height ^2)
değerine eşittir.
Temel yapılandırma
Dokunma girişi eşleyici, kalibrasyon değerlerini belirtmek için giriş cihazı yapılandırma dosyasında birçok yapılandırma özelliği kullanır. Aşağıdaki tabloda bazı genel amaçlı yapılandırma özellikleri açıklanmaktadır. Diğer tüm özellikler, kalibrasyon 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 türünü belirtir.
-
Değer
touchScreen
ise dokunmatik cihaz, bir ekranla ilişkili dokunmatik ekrandır. -
Değer
touchPad
ise dokunmatik cihaz, ekranla ilişkili olmayan bir dokunmatik alandır. -
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, sınıflandırma algoritmasına göre cihaz türünü otomatik olarak algılar.
Cihaz türünün dokunmatik cihazın davranışını nasıl etkilediği hakkında daha fazla bilgi 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ılıyordu.
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ü her 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 ekranlıysa varsayılan değer 1
, değilse 0
olur.
Sistem, dahili ve harici dokunmatik ekranlar ile ekranlar arasında ayrım yapar. Yönlendirmeye duyarlı dahili dokunmatik ekran, dahili ekranın yönüne göre döndürülür. Yönlendirmeye duyarlı harici dokunmatik ekran, harici ekranın yönüne göre döndürülür.
Yön algılama, Nexus One gibi cihazlarda dokunmatik ekranların döndürülmesini desteklemek için kullanılır. Örneğin, cihaz doğal yönünden 90 derece saat yönünde döndürüldüğünde dokunmaların mutlak konumları yeniden eşlenir. Böylece, dokunmatik ekranın mutlak koordinat sisteminin sol üst köşesindeki bir dokunma, ekranın döndürülmüş koordinat sisteminin sol üst köşesindeki bir dokunma olarak bildirilir. Bu, dokunmaların, uygulamaların görsel öğelerini çizmek için kullandığı koordinat sistemiyle raporlanması için yapılır.
Honeycomb'dan önce, tüm dokunmatik cihazların yönlendirmeye duyarlı olduğu varsayılıyordu.
touch.gestureMode
Tanım: touch.gestureMode
= pointer
| spots
|
default
İşaretçi hareketleri için sunu modunu belirtir. Bu yapılandırma özelliği yalnızca dokunmatik cihaz işaretçi türündeyse geçerlidir.
-
Değer
pointer
ise dokunmatik yüzey hareketleri, fare işaretçisine benzer bir imleçle gösterilir. -
Değer
spots
ise dokunmatik yüzey hareketleri, hareketin ağırlık merkezini temsil eden bir sabitleme noktası ve parmakların konumunu temsil eden bir dizi dairesel nokta ile gösterilir.
INPUT_PROP_SEMI_MT
giriş özelliği ayarlandığında varsayılan değer pointer
, aksi takdirde spots
olur.
X ve Y alanları
X ve Y alanları, temas alanının merkezi için konum bilgisi sağlar.
Hesaplama
Hesaplama basittir: Dokunma sürücüsünden gelen konum bilgileri, çıkış koordinat sistemine doğrusal olarak enterpolasyon edilir.
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 çıkış birimlerindeki (pikseller) yaklaşık boyutlarını açıklar.
toolMajor
ve toolMinor
alanları, aracın yaklaşık boyutlarını çıkış birimleriyle (piksel) açıklar.
size
alanı, dokunma cihazının algılayabileceği olası en büyük dokunmaya göre dokunmanın normalleştirilmiş boyutunu açıklar. Olası en küçük normalleştirilmiş boyut 0, 0 (temas yok veya ölçülemiyor) ve olası en büyük normalleştirilmiş boyut 1,0'dır (sensör alanı doygun).
Hem yaklaşık uzunluk hem de genişlik ölçülebiliyorsa touchMajor
alanı, temas alanının daha uzun boyutunu, touchMinor
alanı ise daha kısa boyutunu belirtir. Yalnızca temas alanının yaklaşık çapı ölçülebiliyorsa touchMajor
ve touchMinor
alanları eşittir.
Benzer şekilde, toolMajor
alanı daha uzun boyutu, toolMinor
alanı ise aracın kesit alanının daha kısa boyutunu belirtir.
Dokunma boyutu kullanılamıyorsa ancak araç boyutu kullanılabiliyorsa araç boyutu, dokunma boyutuna eşit olarak ayarlanır. Aksine, araç boyutu kullanılamıyorsa ancak dokunma boyutu kullanılabiliyorsa dokunma boyutu, araç boyutuna eşit olarak ayarlanı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.
Tanım: touch.size.calibration
= none
|
geometric
| diameter
| area
| default
Dokunma sürücüsünün dokunma boyutunu ve araç boyutunu bildirmek için kullandığı ölçüm türünü belirtir.
-
Değer
none
ise boyut sıfır olarak ayarlanır. -
Değer
geometric
ise boyutun konumla aynı yüzey birimlerinde belirtildiği varsayılır. Bu nedenle, aynı şekilde ölçeklendirilir. -
Değer
diameter
ise boyutun dokunma veya aracın ç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 varsageometric
kalibrasyonunu, aksi takdirdenone
kalibrasyonunu kullanır.
touch.size.scale
Tanım: touch.size.scale
= <negatif olmayan bir kayan nokta sayısı>
Kalibrasyonda kullanılan sabit bir ölçeklendirme faktörünü belirtir.
Varsayılan değer 1.0
'dır.
touch.size.bias
Tanım: touch.size.bias
= <negatif olmayan bir kayan nokta sayısı>
Kalibrasyonda kullanılan sabit bir sapma değerini belirtir.
Varsayılan değer 0.0
'dır.
touch.size.isSummed
Tanım: touch.size.isSummed
= 0
| 1
Boyutun, tüm etkin kişilerin boyutlarının toplamı olarak mı yoksa her kişi için ayrı ayrı mı raporlanacağını belirtir.
-
Değer
1
ise bildirilen boyut, kullanımdan önce 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
'dır.
Bazı dokunmatik cihazlar, özellikle "Semi-MT" cihazlar, birden fazla temasın ayrı ayrı boyutlarını ayırt edemez. Bu nedenle, toplam alanlarını veya genişliklerini temsil eden bir boyut ölçümü bildirirler. Bu özellik yalnızca bu tür cihazlar için 1
olarak ayarlanmalıdır. Emin değilseniz 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ı, dokunma cihazına uygulanan yaklaşık fiziksel basıncı 0,0 (dokunma yok) ile 1,0 (normal basınç) arasında normalleştirilmiş bir değer olarak açıklar.
Sıfır basınç, aracın havada durduğunu gösterir.
touch.pressure.calibration
Tanım: touch.pressure.calibration
= none
|
physical
| amplitude
| default
Dokunma sürücüsünün basıncı bildirmek için kullandığı ölçüm türünü belirtir.
-
Değer
none
ise basınç bilinmediğinden dokunulduğunda 1,0, üzerine gelindiğinde ise 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. -
Değer
amplitude
ise basınç ekseninin, temasın boyutu ve uygulanan basınçla ilgili olan sinyal genliğini ölçtüğü varsayılır. -
Değer
default
ise sistem, basınç ekseni mevcutsaphysical
kalibrasyonunu, aksi takdirdenone
kalibrasyonunu kullanır.
touch.pressure.scale
Tanım: touch.pressure.scale
= <negatif olmayan bir kayan nokta sayısı>
Kalibrasyonda kullanılan sabit bir ölçeklendirme faktörünü belirtir.
Varsayılan değer 1.0 / raw.pressure.max
'dır.
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
yön ve eğim alanları
orientation
alanı, dokunma ve aracın yönünü açısal ölçüm olarak tanımlar. 0
yönü, ana eksenin dikey olarak yönlendirildiğini, -PI/2
yönü ana eksenin sola, PI/2
yönü ise sağa yönlendirildiğini gösterir. Kalem aracı mevcut olduğunda yön aralığı, -PI
veya PI
'den başlayarak tam daire aralığı şeklinde açıklanabilir.
tilt
alanı, aracın eğimini açısal bir ölçüm olarak tanımlar.
0
eğimi, aracın yüzeye dik olduğunu gösterir.
PI/2
eğimi, aracın yüzeyde düz olduğunu gösterir.
touch.orientation.calibration
Tanım: touch.orientation.calibration
= none
|
interpolated
| vector
| default
Dokunma sürücüsünün yönü bildirmek için kullandığı ölçüm türünü belirtir.
- Değer
none
ise yön bilinmediği için 0 olarak ayarlanır. - Değer
interpolated
ise yön,raw.orientation.min
ham değerinin-PI/2
ile veraw.orientation.max
ham değerininPI/2
ile eşleneceği şekilde doğrusal olarak enterpolasyon yapılır.(raw.orientation.min + raw.orientation.max) / 2
değerinin ortası0
ile eşlenir. - Değer
vector
ise yön, iki imzalı 4 bitlik alandan oluşan paketlenmiş bir vektör olarak yorumlanır. Bu gösterim, Atmel Object Based Protocol parçalarında kullanılır. Vektör, kod çözme işleminden sonra yön açısı ve güvenilirlik büyüklüğü verir. Geometrik olmadığı sürece, boyut bilgilerini ölçeklendirmek için güven aralığı kullanılır. - Değer
default
ise sistem, yönlendirme ekseni varsainterpolated
kalibrasyonunu, aksi takdirdenone
kalibrasyonunu kullanır.
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
uzaklık alanı
distance
alanı, araç ile dokunmatik cihaz yüzeyi arasındaki mesafeyi açıklar. 0,0 değeri doğrudan teması, daha büyük değerler ise yüzeyden uzaklaşmayı gösterir.
touch.distance.calibration
Tanım: touch.distance.calibration
= none
|
scaled
| default
Dokunma sürücüsünün mesafeyi bildirmek için kullandığı ölçüm türünü belirtir.
-
Değer
none
ise mesafe bilinmediği için 0 olarak ayarlanır. -
Değer
scaled
ise bildirilen mesafe sabit bir ölçek faktörüyle çarpılır. -
Değer
default
ise sistem, mesafe ekseni varsascaled
kalibrasyonunu, aksi takdirdenone
kalibrasyonunu kullanır.
touch.distance.scale
Tanım: touch.distance.scale
= <negatif olmayan bir kayan nokta sayısı>
Kalibrasyonda kullanılan sabit bir ölçeklendirme faktörünü belirtir.
Varsayılan değer 1.0
'dır.
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ı
Dokunmatik cihazların yapılandırma özellikleri, Android Ice Cream Sandwich 4.0'da önemli ölçüde değişti. Dokunmatik cihazlar için tüm giriş cihazı yapılandırma dosyaları, yeni yapılandırma özelliklerini kullanacak şekilde güncellenmelidir.
Eski dokunmatik cihaz sürücülerinin de güncellenmesi gerekebilir.
Sanal tuş eşleme dosyaları
Dokunmatik cihazlar, sanal tuşları uygulamak için kullanılabilir.
Dokunmatik kontrol cihazının özelliklerine bağlı olarak bunu yapmanın birkaç yolu vardır. Bazı dokunmatik kumandalar, yazılım kayıtları ayarlanarak doğrudan yapılandırılıp yazılım tuşları uygulanabilir. Bazen de dokunma koordinatlarından tuş kodlarına eşleme işlemini yazılımda yapmak istenir.
Sanal anahtarlar yazılıma uygulandığında çekirdek, virtualkeys.<devicename>
adlı bir sanal anahtar haritası dosyasını kart özelliği olarak dışa aktarmalıdır. Örneğin, dokunmatik ekran cihaz sürücüleri adını "touchyfeely" olarak bildiriyorsa sanal tuş haritası dosyasının yolu /sys/board_properties/virtualkeys.touchyfeely
olmalıdır.
Sanal tuş haritası dosyası, dokunmatik ekrandaki sanal tuşların koordinatlarını ve Linux tuş kodlarını açıklar.
Sanal tuş haritası dosyasına ek olarak, Linux tuş kodlarını Android tuş kodlarıyla eşlemek ve klavye cihazının türünü (genellikle SPECIAL_FUNCTION
) belirtmek için karşılık gelen bir tuş düzeni dosyası ve tuş karakteri haritası dosyası olmalıdır.
Sözdizimi
Sanal tuş haritası dosyası, yeni satırlarla veya iki nokta üst üste işaretleriyle ayrılmış bir dizi sanal tuş düzeni açıklamasından oluşan düz metin dosyasıdır.
Yorum satırları "#" ile başlar ve satırın sonuna kadar devam eder.
Her sanal anahtar, iki nokta üst üste ile ayrılmış 6 bileşenle tanımlanır:
0x01
: Sürüm kodu. Her zaman0x01
olmalıdır.- <Linux key code>: Sanal anahtarın Linux anahtar kodu.
- <centerX>: Sanal anahtarın merkezinin X piksel koordinatı.
- <centerY>: Sanal tuşun merkezinin Y piksel koordinatı.
- <width>: Sanal anahtarın piksel cinsinden genişliği.
- <height>: Sanal anahtarın piksel cinsinden yüksekliği.
Tüm koordinatlar ve boyutlar, ekran koordinat sistemi açısından belirtilir.
Aşağıda, tek satırda yazılmış bir sanal anahtar haritası dosyası verilmiştir.
# 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 eşleme dosyası birden fazla satıra 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 çözünürlüğü 480x800'dür. Bu nedenle, tüm sanal tuşların <centerY> koordinatı 835'tir. Bu değer, dokunmatik ekranın görünür alanının biraz altındadır.
İlk anahtarın 158
(KEY_BACK
) Linux tarama kodu, 55
centerX, 835
centerY, 90
genişliği ve 55
yüksekliği vardır.
Örnek
Sanal tuş haritası 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
Tuş düzeni 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 dokunma işaretçi hareketleri
İşaretçi modunda sistem aşağıdaki hareketleri yorumlar:
- Tek parmakla dokunma: tıklama.
- Tek parmak hareketi: İşaretçiyi hareket ettirin.
- Tek parmak hareketi ve düğmeye basma: İşaretçiyi sürükleyin.
- İki parmak hareketi (her iki parmak aynı yönde hareket eder): İşaretçinin altındaki alanı o yöne sürükleyin. İşaretçinin kendisi hareket etmez.
- İki parmakla hareket: İki parmağın da birbirine doğru veya birbirinden uzaklaşarak farklı yönlerde hareket etmesiyle işaretçinin etrafındaki alanı kaydırın/ölçeklendirin/döndürün. İşaretçinin kendisi hareket etmez.
- Birden fazla parmakla hareket: serbest biçimli hareket.
Avuç içiyle dokunmayı reddetme
Android 13'ten itibaren, yerleşik çerçeve etkinleştirildiğinde sistem, avuç içlerinden gelen girişleri otomatik olarak reddedebilir. Şirket içinde özel olarak geliştirilen çözümler hâlâ desteklenmektedir ancak avuç içi algılandığında TOOL_TYPE_PALM
işaretini döndürmek için değiştirilmeleri gerekebilir. Yerleşik çerçeve, özel çözümlerle birlikte de çalışır.
Gerçek model, hareket verilerinin ilk 90 ms'sine, mevcut işaretçiye ve çevredeki işaretçilere bakar, ardından dokunuşların ekran kenarından ne kadar uzakta olduğunu değerlendirir.
Ardından, her işaretçi için ayrı ayrı hangi işaretçilerin avuç içi olduğunu belirler. Ayrıca, touchMajor
ve touchMinor
tarafından bildirilen her bir kişinin 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önderilmişse sistem şunlardan birini yapar:
- (Başka etkin işaretçiler varsa)
ACTION_POINTER_UP
veFLAG_CANCELED
ayarlı işaretçiyi iptal eder. - (Tek işaretçi ise) İşaretçiyi
ACTION_CANCEL
ile iptal eder.
Herkese açık bir API olan MotionEvent.FLAG_CANCELED
, mevcut etkinliğin kullanıcı işlemini tetiklememesi gerektiğini gösterir. Bu işaret hem ACTION_CANCEL
hem de ACTION_POINTER_UP
için ayarlanır.
Avuç içi işaretçisi uygulamalara gönderilmediyse sistem işaretçiyi bırakır.
Avuç içiyle teması engellemeyi etkinleştirme
- Dokunma sürücünüzde, aşağıdaki alanların çözünürlüklerini ayarlamak için
input_abs_set_res
makrosunu kullanın (birimler mm başına piksel'dir):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 destekliyorsa çözünürlüğün doğru ayarlandığından emin olun. - Alanların doğru şekilde ayarlandığını onaylamak için şunu çalıştırın:
$ adb shell getevent -li
- Özelliği çalışma zamanında etkinleştirmek için şu komutu ç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 avuç içi reddetme özelliği olduğunu gösterdiğinden emin olun. Çalışmıyorsa yanlış yapılandırılmış olabilecek öğelerle ilgili ipuçları 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 ilgili sysprop komutunu ekleyin:setprop persist.device_config.input_native_boot.palm_rejection_enabled 1