Dokunmatik cihazlar

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 ve ABS_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 ve ABS_Y mutlak eksenlerinin ve BTN_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 veya REL_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 ve BTN_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 ve BTN_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 ve MT_TOOL_FINGER: MotionEvent.TOOL_TYPE_FINGER ile eşlenir.
  • BTN_TOOL_PEN ve MT_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 ve BTN_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 zaman BTN_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 veya MT_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 ve ABS_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 veya ABS_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 veya ABS_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 veya ABS_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 ve ABS_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 ile PI / 2 radyan arasında değişen dik bir eğim açısına ve -PI ile PI 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 bildiriliyorsa BTN_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 olarak MotionEvent.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 veya BTN_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 veya BTN_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 ve BTN_TOUCH değeri sıfırsa araç bekletme modundadır.
  • 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ından SYN_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 sürücülerinin artık Android'e özel özelleştirmelere ihtiyacı yok. Android, standart Linux giriş protokolünü kullanarak değiştirilmemiş sürücülerle harici HID çoklu dokunma dokunmatik ekranlar gibi daha çeşitli dokunmatik çevre birimlerini destekleyebilir.

Dokunmatik cihaz işlemleri

Aşağıda, Android'de dokunmatik cihaz işlemlerinin kısa bir özeti verilmiştir.

  1. EventHub, evdev sürücüsünden ham etkinlikleri okur.
  2. 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.
  3. 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.
  4. InputReader, sanal tuşa basılıp basılmadığını belirler. Bu durumda, InputDispatcher önemli etkinlik hakkında bilgilendirilir.
  5. InputReader, dokunmanın ekran sınırları içinde başlatılıp başlatılmadığını belirler. Bu durumda, dokunma etkinliği hakkında InputDispatcher bilgilendirilir.
  6. Dokunma aracı yoksa ancak en az bir fareyle üzerine gelme aracı varsa, InputReader, fareyle üzerine gelme etkinliği hakkında InputDispatcher'i bilgilendirir.
  7. 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 ve InputDispatcher'ı işaretçi etkinliği hakkında bilgilendirir.
  8. InputDispatcher, etkinliklerin gönderilip gönderilmeyeceğini ve cihazı uyandırıp uyandırmayacağını belirlemek için WindowManagerPolicy kullanır. Ardından InputDispatcher, 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 veya ABS_MT_POSITION_X ekseninin değeri.
raw.y
ABS_Y veya ABS_MT_POSITION_Y ekseninin değeri.
raw.pressure
ABS_PRESSURE veya ABS_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ıyorsa raw.touchMajor.
raw.toolMajor
ABS_TOOL_WIDTH veya ABS_MT_WIDTH_MAJOR ekseninin değeri ya da kullanılamıyorsa 0.
raw.toolMinor
ABS_MT_WIDTH_MINOR ekseninin değeri veya kullanılamıyorsa raw.toolMajor.
raw.orientation
ABS_MT_ORIENTATION ekseninin değeri veya kullanılamıyorsa 0.
raw.distance
ABS_DISTANCE veya ABS_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 veya raw.toolMajor ekseni varsa geometric kalibrasyonunu, aksi takdirde none 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 mevcutsa physical kalibrasyonunu, aksi takdirde none 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 ve raw.orientation.max ham değerinin PI/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 varsa interpolated kalibrasyonunu, aksi takdirde none 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 varsa scaled kalibrasyonunu, aksi takdirde none 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 zaman 0x01 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 ve FLAG_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

  1. 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.

  2. Alanların doğru şekilde ayarlandığını onaylamak için şunu çalıştırın:
        $ adb shell getevent -li
    
  3. Ö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
    
  4. system_server işlemini yeniden başlatın.
         $ adb shell stop && adb shell start
        
  5. 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: {}
    
  6. Ö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
    

Daha fazla bilgi