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_XveABS_MT_POSITION_Ymutlak 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_XveABS_Ymutlak eksenlerinin veBTN_TOUCHtuş 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_DIRECTgiriş özelliğinin varlığını (EVIOCGPROPioctl 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_POINTERgiriş özelliğinin varlığını (EVIOCGPROPioctl aracılığıyla) bildiriyorsa cihaz türü işaretçi olarak ayarlanır. - Giriş cihazı,
REL_XveyaREL_Ygö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_PRIMARYile eşlendi.BTN_RIGHT:MotionEvent.BUTTON_SECONDARYile eşlendi.BTN_MIDDLE:MotionEvent.BUTTON_MIDDLEile eşlendi.BTN_BACKveBTN_SIDE:MotionEvent.BUTTON_BACKile eşlenir. Bu düğmeye basıldığında, tuş kodu olan bir tuşa basma işlemi de sentezlenir.KeyEvent.KEYCODE_BACK.BTN_FORWARDveBTN_EXTRA:MotionEvent.BUTTON_FORWARDile eşlenir. Bu düğmeye basıldığında,KeyEvent.KEYCODE_FORWARDtuş koduyla bir tuşa basma işlemi de sentezlenir.BTN_STYLUS:MotionEvent.BUTTON_SECONDARYile eşlendi.BTN_STYLUS2:MotionEvent.BUTTON_TERTIARYile 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_FINGERveMT_TOOL_FINGER:MotionEvent.TOOL_TYPE_FINGERile eşlenir.BTN_TOOL_PENveMT_TOOL_PEN:MotionEvent.TOOL_TYPE_STYLUSile eşlenir.BTN_TOOL_RUBBER:MotionEvent.TOOL_TYPE_ERASERile eşlendi.BTN_TOOL_BRUSH:MotionEvent.TOOL_TYPE_STYLUSile eşlendi.BTN_TOOL_PENCIL:MotionEvent.TOOL_TYPE_STYLUSile eşlendi.BTN_TOOL_AIRBRUSH:MotionEvent.TOOL_TYPE_STYLUSile eşlendi.BTN_TOOL_MOUSE:MotionEvent.TOOL_TYPE_MOUSEile eşlendi.BTN_TOOL_LENS:MotionEvent.TOOL_TYPE_MOUSEile eşlendi.BTN_TOOL_DOUBLETAP,BTN_TOOL_TRIPLETAPveBTN_TOOL_QUADTAP:MotionEvent.TOOL_TYPE_FINGERile 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_TOUCHtuş kodunu bildiriyorsa sistem, aracın ekrana dokunup dokunmadığını belirtmek için her zamanBTN_TOUCHtuşunun kullanıldığını varsayar. Bu nedenle,BTN_TOUCHsimgesi, 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_MAJORbir 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_MAJORbir 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_FINGERveyaMT_TOOL_PENolarak bildirir.ABS_MT_TRACKING_ID: (isteğe bağlı) Aracın izleme kimliğini bildirir. İzleme kimliği, birden fazla araç etkin olduğunda her 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_XveABS_MT_POSITION_Yeksenlerinin 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_PRESSUREveyaABS_MT_PRESSUREtarafı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_MAJORveyaABS_MT_WIDTH_MINORtarafı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_DISTANCEveyaABS_MT_DISTANCEtarafı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_XveABS_TILT_Ytarafı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) / 2ile 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 / 2radyan arasında değişen dik bir eğim açısına ve-PIilePIradyan 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_TYPEtarafı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_FINGERolur.Bir aracın etkin olup olmadığı aşağıdaki koşullara göre belirlenir:
Tek dokunma protokolü kullanılırken
BTN_TOUCHveyaBTN_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_MOUSEveyaBTN_TOOL_LENSise 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_TOUCHanahtar kodunu destekliyorsa veBTN_TOUCHdeğ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_REPORTardındanSYN_REPORTgibi 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_PRESSUREkullanılarak bildirilmelidir.Android'in önceki sürümleri, basınç bilgilerini
ABS_MT_TOUCH_MAJORkaynağından alıyordu. Eski davranış, Linux giriş protokolü spesifikasyonuyla uyumlu değildi ve artık desteklenmiyor.- Dokunma boyutu bilgileri
ABS_MT_TOUCH_MAJORkullanılarak bildirilmelidir.Android'in önceki sürümleri, boyut bilgilerini
ABS_MT_TOOL_MAJORadresinden 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,evdevsü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ındaInputDispatcherbilgilendirilir.- 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çinWindowManagerPolicykullanı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.xABS_XveyaABS_MT_POSITION_Xekseninin değeri.raw.yABS_YveyaABS_MT_POSITION_Yekseninin değeri.raw.pressureABS_PRESSUREveyaABS_MT_PRESSUREekseninin değeri ya da kullanılamıyorsa 0.raw.touchMajorABS_MT_TOUCH_MAJORekseninin değeri veya kullanılamıyorsa 0.raw.touchMinorABS_MT_TOUCH_MINORekseninin değeri veya kullanılamıyorsaraw.touchMajor.raw.toolMajorABS_TOOL_WIDTHveyaABS_MT_WIDTH_MAJORekseninin değeri ya da kullanılamıyorsa 0.raw.toolMinorABS_MT_WIDTH_MINORekseninin değeri veya kullanılamıyorsaraw.toolMajor.raw.orientationABS_MT_ORIENTATIONekseninin değeri veya kullanılamıyorsa 0.raw.distanceABS_DISTANCEveyaABS_MT_DISTANCEekseninin değeri ya da kullanılamıyorsa 0.raw.tiltXABS_TILT_Xekseninin değeri veya kullanılamıyorsa 0.raw.tiltYABS_TILT_Yekseninin 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.*.rangeraw.*.max - raw.*.minetiketine 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 + 1değerine eşit olan genişliği. raw.height- Dokunma alanının
raw.y.range + 1değ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
touchScreenise dokunmatik cihaz, bir ekranla ilişkili dokunmatik ekrandır. -
Değer
touchPadise dokunmatik cihaz, ekranla ilişkili olmayan bir dokunmatik alandır. -
Değer
pointerise 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
defaultise 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
1ise dokunmatik cihaz tarafından bildirilen dokunma konumları, ekran yönü her değiştiğinde döndürülür. -
Değer
0ise 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
pointerise dokunmatik yüzey hareketleri, fare işaretçisine benzer bir imleçle gösterilir. -
Değer
spotsise 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
noneise boyut sıfır olarak ayarlanır. -
Değer
geometricise boyutun konumla aynı yüzey birimlerinde belirtildiği varsayılır. Bu nedenle, aynı şekilde ölçeklendirilir. -
Değer
diameterise boyutun dokunma veya aracın çapıyla (genişliğiyle) orantılı olduğu varsayılır. -
Değer
areaise boyutun dokunma veya araç alanıyla orantılı olduğu varsayılır. -
Değer
defaultise sistem,raw.touchMajorveyaraw.toolMajorekseni varsageometrickalibrasyonunu, aksi takdirdenonekalibrasyonunu 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
1ise bildirilen boyut, kullanımdan önce kişi sayısına bölünür. -
Değer
0ise 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
noneise basınç bilinmediğinden dokunulduğunda 1,0, üzerine gelindiğinde ise 0,0 olarak ayarlanır. -
Değer
physicalise basınç ekseninin, dokunmatik yüzeye uygulanan basıncın gerçek fiziksel yoğunluğunu ölçtüğü varsayılır. -
Değer
amplitudeise basınç ekseninin, temasın boyutu ve uygulanan basınçla ilgili olan sinyal genliğini ölçtüğü varsayılır. -
Değer
defaultise sistem, basınç ekseni mevcutsaphysicalkalibrasyonunu, aksi takdirdenonekalibrasyonunu 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
noneise yön bilinmediği için 0 olarak ayarlanır. - Değer
interpolatedise yön,raw.orientation.minham değerinin-PI/2ile veraw.orientation.maxham değerininPI/2ile eşleneceği şekilde doğrusal olarak enterpolasyon yapılır.(raw.orientation.min + raw.orientation.max) / 2değerinin ortası0ile eşlenir. - Değer
vectorise 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
defaultise sistem, yönlendirme ekseni varsainterpolatedkalibrasyonunu, aksi takdirdenonekalibrasyonunu 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
noneise mesafe bilinmediği için 0 olarak ayarlanır. -
Değer
scaledise bildirilen mesafe sabit bir ölçek faktörüyle çarpılır. -
Değer
defaultise sistem, mesafe ekseni varsascaledkalibrasyonunu, aksi takdirdenonekalibrasyonunu 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 zaman0x01olmalı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_UPveFLAG_CANCELEDayarlı işaretçiyi iptal eder. - (Tek işaretçi ise) İşaretçiyi
ACTION_CANCELile 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_resmakrosunu kullanın (birimler mm başına piksel'dir):ABS_MT_POSITION_XABS_MT_POSITION_YABS_MT_TOUCH_MAJORABS_MT_TOUCH_MINOR
ABS_MT_TOUCH_MINORdesteğ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_serverişlemini yeniden başlatın.$ adb shell stop && adb shell startadb shell dumpsys input,UnwantedInteractionBlockeriç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**rcdosyanıza ilgili sysprop komutunu ekleyin:setprop persist.device_config.input_native_boot.palm_rejection_enabled 1