Dokunmatik cihazlar

Android, ekran kalemi tabanlı dijitalleştirici tabletler de dahil olmak üzere çeşitli dokunmatik ekranları ve dokunmatik yüzeyleri destekler.

Dokunmatik ekranlar, kullanıcının ekrandaki öğeleri doğrudan değiştirdiği izlenimini verecek şekilde bir ekranla ilişkilendirilmiş dokunmatik cihazlardır.

Dokunmatik yüzeyler, dijitalleştirici tablet gibi bir ekranla ilişkili olmayan dokunmatik cihazlardır. Dokunmatik yüzeyler genellikle işaretleme, mutlak dolaylı konumlandırma veya kullanıcı arayüzünün hareket tabanlı kontrolü için kullanılır.

Dokunmatik cihazlarda, fare düğmelerine benzer işlevleri olan düğmeler bulunabilir.

Dokunmatik cihazlar, temel dokunmatik sensör teknolojisine bağlı olarak bazen parmak veya ekran kalemi gibi çeşitli araçlar kullanılarak kontrol 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 ikili amaca hizmet eder.

Dokunmatik cihazların çeşitliliği nedeniyle Android, her cihazın özelliklerini ve istenen davranışını açıklamak için çok sayıda yapılandırma özelliğinden yararlanır.

Dokunmatik cihaz sınıflandırması

Aşağıdaki koşulların her ikisi de karşılanıyorsa 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üğmesi yok. Bu koşul, MT eksenleriyle çakışan kodlarla eksenleri bildiren belirli oyun kumandalarıyla ilgili bir belirsizliği çözer.

Aşağıdaki koşulların her ikisi de geçerliyse giriş cihazı tek dokunuşlu cihaz olarak sınıflandırılır:

  • Giriş cihazı, çoklu dokunma cihazı olarak sınıflandırılmamıştır. Bir giriş cihazı tek dokunmatik cihaz veya çoklu dokunmatik cihaz olarak sınıflandırılır, asla her 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ş eşleme dosyasını yüklemeye çalışarak belirlenir. Sanal tuş eşleme varsa cihazın tuş düzeni dosyası da yüklenir. Bu dosyaların konumu ve biçimi hakkında bilgi için [Sanal tuş eşleme 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ı bulunmalı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ı cihazlar, ekrandaki nesneleri doğrudan değiştirmek için kullanılır. Kullanıcı doğrudan ekrana dokunduğu için sistem, üzerinde işlem yapılan nesneleri belirtmek için ek bir olanak gerektirmez.
  • Dokunmatik yüzey cihazı, belirli bir sensör alanındaki dokunmalarla ilgili mutlak konumlandırma bilgilerini bir uygulamaya sağlamak için kullanılır. Dijitalleştirici tabletler için kullanışlı olabilir.
  • İşaretçi cihazı, ekrandaki nesneleri imleç kullanarak dolaylı olarak değiştirmek için kullanılır. Parmaklar, çoklu dokunma işaretçi hareketleri olarak yorumlanır. Ekran kalemi gibi diğer araçlar, mutlak konumlar kullanılarak yorumlanır. Daha fazla bilgi için Dolaylı çoklu dokunma işaretçi hareketleri bölümüne bakın.

Giriş cihazını dokunmatik ekran, dokunmatik yüzey veya işaretleme 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 şekilde ayarlanır.
  • Giriş cihazı, INPUT_PROP_DIRECT giriş özelliğinin varlığını bildirirse (EVIOCGPROP ioctl aracılığıyla) cihaz türü dokunmatik ekran olarak ayarlanır. Bu koşul, doğrudan giriş dokunmatik cihazlarının bağlı bir ekrana da bağlı olduğunu varsayar.
  • Giriş cihazı, INPUT_PROP_POINTER giriş özelliğinin varlığını bildirirse (EVIOCGPROP ioctl aracılığıyla) cihaz türü pointer olarak ayarlanır.
  • Giriş cihazı, REL_X veya REL_Y göreli eksenlerinin varlığını bildirirse 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 işaretçiyi zaten 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 ayar, başka bir ö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 davranır ve genellikle işaretçi türü dokunmatik cihazlarda veya ekran kalemiyle 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şlendi. Bu düğmeye basıldığında KeyEvent.KEYCODE_BACK tuş koduyla bir tuş basımı da sentezlenir.
  • BTN_FORWARD ve BTN_EXTRA: MotionEvent.BUTTON_FORWARD ile eşlendi. Bu düğmeye basıldığında KeyEvent.KEYCODE_FORWARD tuş koduna sahip bir tuş basımı da 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 parmak, ekran kalemi veya başka bir cihazdır. Bazı dokunmatik cihazlar farklı araç türlerini 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şlendi.
  • BTN_TOOL_PEN ve MT_TOOL_PEN: MotionEvent.TOOL_TYPE_STYLUS ile eşlendi.
  • BTN_TOOL_RUBBER: MotionEvent.TOOL_TYPE_ERASER ile eşlendi.
  • BTN_TOOL_BRUSH: MotionEvent.TOOL_TYPE_STYLUS ile eşlendi.
  • BTN_TOOL_PENCIL: MotionEvent.TOOL_TYPE_STYLUS ile eşlendi.
  • BTN_TOOL_AIRBRUSH: MotionEvent.TOOL_TYPE_STYLUS ile eşlendi.
  • BTN_TOOL_MOUSE: MotionEvent.TOOL_TYPE_MOUSE ile eşlendi.
  • BTN_TOOL_LENS: MotionEvent.TOOL_TYPE_MOUSE ile eşlendi.
  • BTN_TOOL_DOUBLETAP, BTN_TOOL_TRIPLETAP 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 veya cihazın kapsama alanında ve üzerinde geziniyor olabilir. Dokunmatik cihazların tümü, cihazın üzerinde gezinen bir aracın varlığını algılayamaz. RF tabanlı ekran kalemi sayısallaştırıcılar gibi bu özelliği destekleyen cihazlar, genellikle aracın sayısallaştırıcının sınırlı bir menzilinde olduğunu algılayabilir.

InputReader bileşeni, dokunma araçlarını fareyle üzerine gelme araçlarından ayırır. Benzer ş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.

Üzerinde gezinme 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 eksenler ve düğmeler için eksenleri ve tuş kodlarını kaydetmelidir. Desteklenmeyen eksenlerin veya tuş kodlarının kaydedilmesi, cihaz sınıflandırma algoritmasının kafasını karıştırabilir veya sistemin cihazın özelliklerini yanlış algılamasına neden olabilir. Örneğin, cihaz BTN_TOUCH tuş kodunu bildirirse sistem, aracın ekrana dokunup dokunmadığını belirtmek için her zaman BTN_TOUCH tuşunun kullanıldığını varsayar. Bu nedenle BTN_TOUCH, aracın yalnızca menzil içinde olduğunu ve üzerine gelindiğini belirtmek için kullanılmamalıdır.
  • Tek dokunuşlu 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: (isteğ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ın yüzeyinden X ekseni boyunca eğimini bildirir.
    • ABS_TILT_Y: (isteğe bağlı) Aracın, dokunmatik cihazın yüzeyinden Y ekseni boyunca eğimini bildirir.
    • BTN_TOUCH: (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ı) Düğme durumlarını bildirir.
    • 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.
  • Çoklu dokunmatik 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: (isteğ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ü bildiriyorsa bu eksen kullanılmamalıdır.
    • ABS_MT_WIDTH_MAJOR: (isteğe bağlı) Aracın kesit alanını veya aracın en 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 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 bir aracı bağımsız olarak tanımlamak ve izlemek için kullanılan, rastgele seçilmiş negatif olmayan bir tam sayıdır. Örneğin, birden fazla parmak cihaza dokunduğunda her parmağa, parmak temas halinde olduğu sürece kullanılan ayrı bir izleme kimliği atanmalıdır. Takip 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ı) Düğme durumlarını raporlar.
    • BTN_TOOL_FINGER, BTN_TOOL_PEN, BTN_TOOL_RUBBER, BTN_TOOL_BRUSH, BTN_TOOL_PENCIL, BTN_TOOL_AIRBRUSH, BTN_TOOL_MOUSE, BTN_TOOL_LENS, BTN_TOOL_DOUBLETAP, BTN_TOOL_TRIPLETAP, BTN_TOOL_QUADTAP: (isteğe bağlı) Araç türünü bildirir.
  • Hem tek dokunma hem de çoklu dokunma protokolü için eksenler tanımlanmışsa yalnızca çoklu dokunma eksenleri kullanılır ve tek dokunma eksenleri 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ı kaplayan kısmını tanımlar.

    Dokunmatik ekranlarda sistem, bildirilen dokunma konumlarını yüzey birimlerinde otomatik olarak enterpolasyon yaparak aşağıdaki hesaplamaya göre ekran piksellerinde 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 dokunmaları 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. Bu nedenle, bir dokunma işlemi uygulamanın sınırları içinde başlayıp etkin alanın dışına taşınırsa uygulama, negatif veya ekran sınırlarının dışında ekran koordinatlarına sahip dokunma etkinlikleri alabilir. Bu, beklenen bir davranıştır.

    Dokunmatik cihazlar, dokunma koordinatlarını hiçbir zaman etkin alanın sınırlarına sabitlememelidir. Dokunma etkin alanın dışına çıkarsa etkin alanın dışında olduğu bildirilmeli veya hiç bildirilmemelidir.

    Örneğin, kullanıcının parmağı dokunmatik ekranın sol üst köşesine yakın bir yere dokunuyorsa (minX, minY) koordinatını bildirebilir. Parmak, etkin alanın dışına doğru hareket etmeye devam ederse dokunmatik ekran, minX ve minY'den daha küçük bileşenlere sahip koordinatları (ör. minX - 2, minY - 3) bildirmeye başlamalı veya dokunmayı bildirmeyi tamamen durdurmalıdır. Başka bir deyişle, kullanıcının parmağı etkin alanın dışına dokunduğunda dokunmatik ekran (minX, minY) değerini bildirmemelidir.

    Dokunma koordinatlarını ekran kenarına sabitlemek, ekran kenarında yapay bir sert sınır oluşturur. Bu sınır, sistemin ekran alanının sınırlarına giren veya sınırlardan çıkan hareketleri sorunsuz bir şekilde izlemesini engeller.

  • ABS_PRESSURE veya ABS_MT_PRESSURE tarafından bildirilen değerler, bildirildikleri takdirde, araç cihaza dokunurken sıfır dışında bir değer, aksi takdirde aracın üzerine geldiğini belirtmek için sıfır olmalıdır.

    Basınç bilgilerini bildirmek 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 dokunurken sıfır olmamalı, 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 ekran kalemiyle dokunma temaslarını ölçemeyebilir.

    Boyut bilgilerini bildirmek isteğe bağlıdır ancak kesinlikle önerilir. Uygulamalar, boyuta duyarlı çizim ve diğer efektleri uygulamak için basınç bilgilerini kullanabilir.

  • Araç cihaza dokunduğunda ABS_DISTANCE veya ABS_MT_DISTANCE tarafından bildirilen değerler sıfıra yaklaşmalıdır. Araç 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 raporlanması isteğe bağlıdır ancak ekran kalemi 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, dikeyden derece cinsinden belirtildiği varsayılır. Merkez noktası (tam 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 temsil eder.

    InputReader, X ve Y eğim bileşenlerini 0 ile PI / 2 radyan arasında değişen dikey eğim açısına ve -PI ile PI radyan arasında değişen düzlemsel yön 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ğim bilgilerini bildirmek isteğe bağlıdır ancak ekran kalemi cihazları için önerilir.

  • Araç türü ABS_MT_TOOL_TYPE tarafından bildirilirse BTN_TOOL_* tarafından bildirilen tüm araç türü bilgilerinin yerini alır. 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 dokunuş protokolü kullanılırken BTN_TOUCH veya BTN_TOOL_* 1 ise araç etkindir.

      Bu koşul, InputReader modelinin aracın doğası hakkında en azından bazı bilgilere (ör. dokunup dokunmadığı veya en azından araç türü) sahip olması gerektiği anlamına gelir. 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üğü her an etkindir. Araç, senkronizasyon raporlarında görünmeyi bıraktığında artık mevcut değildir.
    • Çoklu dokunma protokolü "B" kullanılırken araç, etkin bir yuvası olduğu sürece etkindir. Yuva temizlendiğinde araç kaybolur.
  • Bir aracın, aşağıdaki koşullara göre üzerine gelindiği 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ç, üzerine gelme durumundadır.
    • Araç etkinse ve sürücü BTN_TOUCH tuş kodunu destekliyorsa ve BTN_TOUCH değeri sıfırsa araç, fareyle üzerine gelme durumundadır.
  • InputReader, hem çoklu dokunma protokolü "A"yı hem de "B"yi 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 gerekli olabilir:

    • Bir araç devre dışı kaldığında (parmak "yukarı" gittiğinde), sonraki çoklu dokunma senkronizasyon raporlarında görünmeyi durdurmalıdır. Tüm araçlar devre dışı kaldığında (tüm parmaklar "yukarı" kalktığında) sürücü, boş bir senkronizasyon raporu paketi (ör. SYN_MT_REPORT ve ardından SYN_REPORT) göndermelidir.

      Android'in önceki sürümleri, "yukarı" etkinliklerinin 0 basınç değeri gönderilerek bildirilmesini bekliyordu. 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 üzerinden 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 üzerinden 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 özgü özelleştirmelere ihtiyacı yoktur. Android, standart Linux giriş protokolünü kullanarak değiştirilmemiş sürücülerle harici HID çoklu dokunmatik ekranlar gibi daha çeşitli dokunmatik çevre birimlerini destekleyebilir.

Dokunmatik cihaz işlemi

Aşağıda, Android'de dokunmatik cihaz kullanımının 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 ve diğer özellikleri hakkındaki dahili durumu günceller. Ayrıca düğme durumlarını da izler.
  3. GERİ veya İLERİ tuşuna basıldıysa ya da bu tuşlar bırakıldıysa InputReader, InputDispatcher öğesini tuş etkinliği hakkında bilgilendirir.
  4. InputReader, sanal bir tuşa basılıp basılmadığını belirler. Öyleyse InputDispatcher, önemli etkinlik hakkında bilgilendirilir.
  5. InputReader, dokunma işleminin ekran sınırları içinde başlatılıp başlatılmadığını belirler. Öyleyse InputDispatcher öğesini dokunma etkinliği hakkında bilgilendirir.
  6. Dokunan araç yoksa ancak en az bir tane üzerine gelme aracı varsa InputReader, InputDispatcher uygulamasını üzerine gelme etkinliği hakkında bilgilendirir.
  7. Dokunmatik cihaz türü pointer ise InputReader, işaretçi hareketi algılama işlemini gerçekleştirir, işaretçiyi ve noktaları buna göre hareket ettirir ve InputDispatcher'yi işaretçi etkinliği hakkında bilgilendirir.
  8. InputDispatcher, etkinliklerin gönderilmesi ve cihazı uyandırması gerekip gerekmediğini belirlemek için WindowManagerPolicy kullanır. Ardından InputDispatcher, etkinlikleri uygun uygulamalara yayınlar.

Dokunmatik cihaz yapılandırması

Dokunmatik cihaz 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ında yer alan 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 genellikle dokunma özelliklerini cihaza özel birimler kullanarak bildirmesidir.

Örneğin, birçok dokunmatik cihaz, dokunma temas alanını ölçer. cihaza özgü dahili bir ölçek (ör. toplam sayı) kullanma dokunma tarafından tetiklenen sensör düğümleri. Bu ham boyut değeri, uygulamalar için anlamlı olmaz. Çünkü uygulamaların, dokunmatik cihaz sensör düğümlerinin fiziksel boyutunu ve diğer özelliklerini bilmesi gerekir.

Sistem, giriş cihazı yapılandırma dosyalarında kodlanmış kalibrasyon parametrelerini kullanarak dokunmatik cihaz tarafından bildirilen değerlerin kodunu çözer, dönüştürür ve uygulamaların anlayabileceği daha basit bir standart gösterime normalleştirir.

Belge kuralları

Belgelendirme amacıyla, kalibrasyon işlemi sırasında sistem tarafından kullanılan değerleri açıklamak için aşağıdaki kuralları kullanırız.

İşlenmemiş 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 yoksa 0.
raw.touchMajor
ABS_MT_TOUCH_MAJOR ekseninin değeri veya yoksa 0.
raw.touchMinor
ABS_MT_TOUCH_MINOR ekseninin değeri veya yoksa raw.touchMajor.
raw.toolMajor
ABS_TOOL_WIDTH veya ABS_MT_WIDTH_MAJOR ekseninin değeri ya da yoksa 0.
raw.toolMinor
ABS_MT_WIDTH_MINOR ekseninin değeri veya yoksa raw.toolMajor.
raw.orientation
ABS_MT_ORIENTATION ekseninin değeri veya yoksa 0.
raw.distance
ABS_DISTANCE veya ABS_MT_DISTANCE ekseninin değeri ya da yoksa 0.
raw.tiltX
ABS_TILT_X ekseninin değeri veya yoksa 0.
raw.tiltY
ABS_TILT_Y ekseninin değeri veya yoksa 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 edilirler.

raw.*.min
Ham eksenin dahil edilen minimum değeri.
raw.*.max
Ham eksenin dahil edilen 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ğrulukta olduğunu gösterir.
raw.width
Dokunma alanının raw.x.range + 1 değerine eşdeğer olan kapsayıcı genişliği.
raw.height
Dokunma alanının raw.y.range + 1 değerine eşit olan kapsayıcı yüksekliği.

Çıkış aralıkları

Aşağıdaki ifadeler, çıkış koordinat sisteminin özelliklerini belirtir. Sistem, dokunma konumu bilgilerini dokunmatik cihaz tarafından kullanılan yüzey birimlerinden, ekran pikselleri gibi uygulamalara bildirilen çıkış birimlerine çevirmek için doğrusal interpolasyon kullanır.

output.width
Çıkış genişliği. Dokunmatik ekranlar (bir ekranla ilişkili) için bu, piksel cinsinden ekran genişliğidir. Dokunmatik yüzeylerde (ekranla ilişkili olmayan), çıkış genişliği raw.width değerine eşittir. Bu, enterpolasyon yapılmadığını gösterir.
output.height
Çıkış yüksekliği. Dokunmatik ekranlar (bir ekranla ilişkili) için bu, piksel cinsinden ekran yüksekliğidir. Dokunmatik yüzeyler için (bir ekranla ilişkili olmayan), çıkış yüksekliği raw.height değerine eşittir. Bu, enterpolasyon yapılmadığını gösterir.
output.diag
Çıkış koordinat sisteminin çapraz uzunluğu, sqrt(output.width ^2 + output.height ^2) değerine eşdeğerdir.

Temel yapılandırma

Dokunmatik giriş eşleyici, kalibrasyon değerlerini belirtmek için giriş cihazı yapılandırma dosyasındaki birçok yapılandırma özelliğini kullanır. Aşağıdaki tabloda bazı genel amaçlı yapılandırma özellikleri açıklanmaktadır. Diğer tüm özellikler, kalibre etmek için kullanıldıkları alanlarla birlikte aşağıdaki bölümlerde açı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, bir ekranla ilişkilendirilmemiş bir dokunmatik alandır.

  • Değer pointer ise dokunmatik cihaz, bir 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 ekransa varsayılan değer 1, aksi takdirde 0 olur.

Sistem, dahili ve harici dokunmatik ekranlar ile ekranlar arasında ayrım yapar. Yönü algılayan dahili dokunmatik ekran, dahili ekranın yönüne göre döndürülür. Yöne 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 saat yönünde 90 derece 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 raporlanır. Bu sayede dokunmalar, uygulamaların görsel öğelerini çizmek için kullandığı koordinat sistemiyle raporlanır.

Honeycomb'dan önce tüm dokunmatik cihazların yönü algıladığı 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 pointer 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 merkezini temsil eden bir sabitleyici ve her bir parmağı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 merkeziyle ilgili konum bilgileri sağlar.

Hesaplama

Hesaplama basittir: Dokunmatik sürücüden alınan konum bilgileri, çıkış koordinat sistemine doğrusal olarak interpolasyonla eklenir.

xScale = output.width / raw.width
yScale = output.height / raw.height

If not orientation aware or screen rotation is 0 degrees:
output.x = (raw.x - raw.x.min) * xScale
output.y = (raw.y - raw.y.min) * yScale
Else If rotation is 90 degrees:
    output.x = (raw.y - raw.y.min) * yScale
    output.y = (raw.x.max - raw.x) * xScale
Else If rotation is 180 degrees:
    output.x = (raw.x.max - raw.x) * xScale
    output.y = (raw.y.max - raw.y) * yScale
Else If rotation is 270 degrees:
    output.x = (raw.y.max - raw.y) * yScale
    output.y = (raw.x - raw.x.min) * xScale
End If

touchMajor, touchMinor, toolMajor, toolMinor, size alanları

touchMajor ve touchMinor alanları, temas alanının yaklaşık boyutlarını çıkış birimleri (piksel) cinsinden açıklar.

toolMajor ve toolMinor alanları, aracın kendisinin yaklaşık boyutlarını çıkış birimleri (piksel) cinsinden açıklar.

size alanı, dokunma cihazının algılayabileceği mümkün olan en büyük dokunmaya göre dokunmanın normalleştirilmiş boyutunu açıklar. Mümkün olan en küçük normalleştirilmiş boyut 0,0 (temas yok veya ölçülemez), mümkün olan en büyük normalleştirilmiş boyut ise 1,0'dır (sensör alanı doymuş).

Hem yaklaşık uzunluk hem de genişlik ölçülebildiğinde touchMajor alanı, temas alanının daha uzun boyutunu, touchMinor alanı ise daha kısa boyutunu belirtir. Yalnızca temas alanının yaklaşık çapı ölçülebildiğinde 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ıyor ancak araç boyutu kullanılabiliyorsa araç boyutu, dokunma boyutuna eşit olarak ayarlanır. Buna karşılık, araç boyutu kullanılamıyor 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 bildirir. Mevcut uygulama üç farklı ölçüm türünü destekler: çap, alan ve yüzey birimlerinde geometrik sınırlayıcı kutu.

<touch.size.calibration< h4=""></touch.size.calibration<>

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 ve aynı şekilde ölçeklendirilir.

  • Değer diameter ise boyutun, dokunma veya aracın çapıyla (genişlik) 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 mevcutsa geometric kalibrasyonunu, aksi takdirde none kalibrasyonunu kullanır.

touch.size.scale

Tanım: touch.size.scale = <negatif olmayan kayan noktalı sayı>

Kalibrasyonda kullanılan sabit bir ölçeklendirme faktörü belirtir.

Varsayılan değer: 1.0.

touch.size.bias

Tanım: touch.size.bias = <negatif olmayan kayan noktalı sayı>

Kalibrasyonda kullanılan sabit bir sapma değerini belirtir.

Varsayılan değer: 0.0.

touch.size.isSummed

Tanım: touch.size.isSummed = 0 | 1

Boyutun, tüm etkin kişilerin boyutlarının toplamı olarak mı yoksa her kişi için ayrı ayrı mı raporlanacağını belirtir.

  • Değer 1 ise raporlanan boyut, kullanılmadan ö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.

Bazı dokunmatik cihazlar, özellikle de "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, bu tür cihazlar için yalnızca 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ı, dokunmatik cihaza uygulanan yaklaşık fiziksel basıncı 0,0 (dokunma yok) ile 1,0 (normal basınç) arasında normalleştirilmiş bir değer olarak tanımlar.

Sıfır basınç, 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 dokunma sırasında 1,0, fareyle üzerine gelme sırasında 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 kayan noktalı sayı>

Kalibrasyonda kullanılan sabit bir ölçeklendirme faktörü belirtir.

Varsayılan değer: 1.0 / raw.pressure.max.

Hesaplama

pressure alanının hesaplanması, belirtilen kalibrasyon parametrelerine bağlıdır.

If touch.pressure.calibration == "physical" or "amplitude":
    output.pressure = raw.pressure * touch.pressure.scale
Else
    If hovering:
        output.pressure = 0
    Else
        output.pressure = 1
    End If
End If

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 ana eksenin sola yönlendirildiğini, PI/2 ise ana eksenin sağa yönlendirildiğini gösterir. Ekran kalemi aracı mevcut olduğunda yön aralığı, -PI veya PI değerinden tam daire aralığı olarak tanımlanabilir.

tilt alanı, aracın eğimini açısal ölçüm olarak tanımlar. 0 eğim, aracın yüzeye dik olduğunu gösterir. PI/2 eğim, aracın yüzeyde düz olduğunu gösterir.

touch.orientation.calibration

Tanım: touch.orientation.calibration = none | interpolated | vector | default

Dokunmatik sürücü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ğeri -PI/2 ile ve raw.orientation.max ham değeri PI/2 ile eşleşecek şekilde doğrusal olarak enterpolasyona tabi tutulur. (raw.orientation.min + raw.orientation.max) / 2 için orta değer 0 ile eşleşir.
  • Değer vector ise yön, iki adet işaretli 4 bitlik alandan oluşan sıkıştırılmış bir vektör olarak yorumlanır. Bu gösterim, Atmel Nesne Tabanlı Protokol parçalarında kullanılır. Vektörün kodu çözüldüğünde bir yön açısı ve güven büyüklüğü elde edilir. Güven büyüklüğü, geometrik olmadığı sürece boyut bilgisini ölçeklendirmek için kullanılır.
  • Değer default ise sistem, yönlendirme ekseni mevcutsa 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

mesafe 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 uzaklığın arttığını gösterir.

touch.distance.calibration

Tanım: touch.distance.calibration = none | scaled | default

Dokunmatik sürücü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çeklendirme faktörüyle çarpılır.

  • Değer default ise sistem, mesafe ekseni mevcutsa scaled kalibrasyonunu, aksi takdirde none kalibrasyonunu kullanır.

touch.distance.scale

Tanım: touch.distance.scale = <negatif olmayan kayan noktalı sayı>

Kalibrasyonda kullanılan sabit bir ölçeklendirme faktörü belirtir.

Varsayılan değer: 1.0.

Hesaplama

distance alanının hesaplanması, belirtilen kalibrasyon parametrelerine bağlıdır.

If touch.distance.calibration == "scaled":
    output.distance = raw.distance * touch.distance.scale
Else
    output.distance = 0
End If

Örnek

# Input device configuration file for a touch screen that supports pressure,
# size and orientation. The pressure and size scale factors were obtained
# by measuring the characteristics of the device itself and deriving
# useful approximations based on the resolution of the touch sensor and the
# display.
#
# Note that these parameters are specific to a particular device model.
# Different parameters need to be used for other devices.

# Basic Parameters
touch.deviceType = touchScreen
touch.orientationAware = 1

# Size
# Based on empirical measurements, we estimate the size of the contact
# using size = sqrt(area) * 28 + 0.
touch.size.calibration = area
touch.size.scale = 28
touch.size.bias = 0
touch.size.isSummed = 0

# Pressure
# Driver reports signal strength as pressure.
#
# A normal index finger touch typically registers about 80 signal strength
# units although we don't expect these values to be accurate.
touch.pressure.calibration = amplitude
touch.pressure.scale = 0.0125

# Orientation
touch.orientation.calibration = vector

Uyumluluk notları

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ı

Sanal tuşları uygulamak için dokunmatik cihazlar kullanılabilir.

Dokunmatik kumandanın özelliklerine bağlı olarak bunu yapmanın birkaç yolu vardır. Bazı dokunmatik kumandalar, donanım yazılımı kayıtları ayarlanarak yazılım tuşlarını uygulayacak şekilde doğrudan yapılandırılabilir. Diğer durumlarda, dokunma koordinatlarından yazılımdaki tuş kodlarına eşleme yapılması tercih edilir.

Sanal tuşlar yazılımda uygulandığında çekirdek, virtualkeys.<devicename> adlı bir sanal tuş 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 bildirirse sanal tuş eşleme dosyasının yolu /sys/board_properties/virtualkeys.touchyfeely olmalıdır.

Sanal tuş eşleme dosyası, dokunmatik ekrandaki sanal tuşların koordinatlarını ve Linux tuş kodlarını açıklar.

Sanal tuş eşleme 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 ilgili bir tuş düzeni dosyası ve tuş karakter eşleme dosyası olmalıdır.

Söz dizimi

Sanal tuş eşleme 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 tuş kodu>: Sanal tuşun Linux tuş kodu.
  • <centerX>: Sanal tuşun merkezinin X piksel koordinatı.
  • <centerY>: Sanal tuşun merkezinin Y piksel koordinatı.
  • <width>: Sanal tuşun piksel cinsinden genişliği.
  • <height>: Sanal tuşun piksel cinsinden yüksekliği.

Tüm koordinatlar ve boyutlar, ekran koordinat sistemi açısından belirtilir.

Aşağıda, tamamı tek bir satırda yazılmış bir sanal tuş eşleme 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 tuş 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. Buna göre, 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 tuşun Linux tarama kodu 158 (KEY_BACK), centerX değeri 55, centerY değeri 835, genişliği 90 ve yüksekliği 55.

Örnek

Sanal tuş eşleme 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

Tuş karakter eşleme 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 parmakla aynı yönde hareket: İşaretçinin altındaki alanı o yöne sürükler. İşaretçinin kendisi hareket etmez.
  • İki parmağın farklı yönlerde birbirine doğru veya birbirinden uzağa hareket ettiği iki parmak hareketi: İşaretçiyi çevreleyen alanı kaydırır/ölçeklendirir/döndürür. İşaretçinin kendisi hareket etmez.
  • Çok parmaklı hareket: Serbest biçimli hareket.

Avuç içi reddi

Android 13'ten itibaren sistem, yerleşik çerçeve etkinleştirildiğinde avuç içinden 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ürecek şekilde değiştirilmeleri gerekebilir. Yerleşik çerçeve, özel çözümlerle de birlikte çalışır.

Gerçek model, hareket verilerinin ilk 90 milisaniyesine, mevcut işaretçiye ve çevreleyen işaretçilere bakar, ardından dokunmaların ekran kenarından ne kadar uzakta olduğunu değerlendirir. Ardından, her bir işaretçi için hangi işaretçilerin avuç içi olduğunu belirler. Ayrıca touchMajor ve touchMinor tarafından bildirilen her bir temasın boyutunu da hesaba katar. Ardından Android çerçevesi, avuç içi olarak işaretlenen işaretçileri dokunma akışından kaldırır.

Uygulamalara zaten bir işaretçi gönderildiyse 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 buysa) ACTION_CANCEL ile işaretçiyi iptal eder.

MotionEvent.FLAG_CANCELED adlı herkese açık API, mevcut etkinliğin kullanıcı işlemini tetiklememesi gerektiğini belirtir. 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çi algılamayı etkinleştirme

  1. Dokunmatik 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 pikseldir):
    • ABS_MT_POSITION_X
    • ABS_MT_POSITION_Y
    • ABS_MT_TOUCH_MAJOR
    • ABS_MT_TOUCH_MINOR

    ABS_MT_TOUCH_MINOR desteği isteğe bağlıdır. Ancak cihazınız destekliyorsa çözünürlüğün doğru ayarlandığından emin olun.

  2. Alanların doğru şekilde ayarlandığını onaylamak için şu komutu ç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 reddediciler olduğunu gösterdiğini doğrulayın. Aksi takdirde, girişle ilgili günlükleri kontrol ederek yanlış yapılandırılmış olabilecek öğelerle ilgili ipuçları bulun.

    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