Gelişmiş ekran kalemi özelliklerini destekleme

Ekran kalemi, kullanıcıların not alma, çizim yapma ve üretkenlik uygulamalarıyla çalışırken oyunlar ve eğlence uygulamalarıyla eğlenmek ve rahatlamak için uygulamalarla rahat ve tam doğrulukla etkileşim kurmalarını sağlar.

Android ve ChromeOS, uygulamalara olağanüstü bir ekran kalemi deneyimi sunmak için çeşitli API'ler sunar. MotionEvent sınıfı; ekran kalemi basıncı, yön, yatırma, fareyle üzerine gelme ve avuç içi algılama gibi kullanıcıların ekranla etkileşimi hakkında bilgiler sağlar. Düşük gecikmeli grafikler ve hareket tahmini kitaplıkları, ekran kalemini daha iyi hale getirerek doğal, kalem ve kağıda benzer bir deneyim sunar.

MotionEvent

MotionEvent sınıfı, ekrandaki dokunma işaretçilerinin konumu ve hareketi gibi kullanıcı girişi etkileşimlerini temsil eder. Ekran kalemiyle giriş için MotionEvent; basınç, yön, yatırma ve fareyle üzerine gelme verilerini de gösterir.

Etkinlik verileri

Görünüme dayalı uygulamalarda MotionEvent verilerine erişmek için bir onTouchListener kurun:

Kotlin

val onTouchListener = View.OnTouchListener { view, event ->
  // Process motion event.
}

Java

View.OnTouchListener listener = (view, event) -> {
  // Process motion event.
};

İşleyici, sistemden MotionEvent nesne alır. Böylece uygulamanız bunları işleyebilir.

MotionEvent nesnesi, kullanıcı arayüzü etkinliğinin aşağıdaki özellikleriyle ilgili veriler sağlar:

  • İşlemler: Cihazla fiziksel etkileşim (ekrana dokunma, işaretçiyi ekran yüzeyi üzerinde hareket ettirme, işaretçiyi ekran yüzeyi üzerinde gezdirme)
  • İşaretçiler: Ekranla etkileşimde bulunan nesnelerin tanımlayıcıları (parmak, ekran kalemi, fare)
  • Eksen: Veri türü - x ve y koordinatları, basınç, yatırma, yön ve fareyle üzerine gelme (mesafe)

İşlemler

Ekran kalemi desteğini uygulamak için kullanıcının hangi işlemi yaptığını anlamanız gerekir.

MotionEvent, hareket etkinliklerini tanımlayan çok çeşitli ACTION sabitleri sağlar. Ekran kalemi için en önemli işlemler şunlardır:

İşlem Açıklama
ACTION_DOWN
ACTION_POINTER_DOWN
İşaretçi ekranla temas kurdu.
İŞLEM_TAŞI İşaretçi ekranda hareket ediyor.
ACTION_UP
ACTION_POINTER_UP
İşaretçi artık ekranla temas halinde değil
ACTION_CANCEL Önceki veya geçerli hareket grubunun iptal edilmesi gerektiğinde.

Uygulamanız, ACTION_DOWN gerçekleştiğinde yeni bir vuruş başlatma, fırçayı ACTION_MOVE, ile çizme ve ACTION_UP tetiklendiğinde fırçayı bitirme gibi görevleri gerçekleştirebilir.

Belirli bir işaretçi için ACTION_DOWN ile ACTION_UP arasındaki MotionEvent işlem kümesine hareket kümesi adı verilir.

Nokta Doğrulayıcılar

Çoğu ekranda çoklu dokunma özelliği vardır: Sistem her parmak, ekran kalemi, fare veya ekranla etkileşimde bulunan diğer işaret eden nesnelere bir işaretçi atar. İşaretçi dizini, belirli bir işaretçi için eksen bilgilerini (ör. ilk parmağın ekrana dokunduğu veya ikinci parmağın konumu) almanızı sağlar.

İşaretçi dizinleri, MotionEvent#pointerCount() tarafından döndürülen işaretçi sayısını (sıfır) eksi 1 ile değiştirir.

İşaretçilerin eksen değerlerine getAxisValue(axis, pointerIndex) yöntemiyle erişilebilir. İşaretçi dizini atlandığında, sistem ilk işaretçinin değerini döndürür. İşaretçi sıfır (0)

MotionEvent nesneleri, kullanılan işaretçi türüyle ilgili bilgi içerir. İşaretçi dizinlerini yineleyerek ve getToolType(pointerIndex) yöntemini çağırarak işaretçi türünü öğrenebilirsiniz.

İşaretçiler hakkında daha fazla bilgi edinmek için Çoklu dokunma hareketlerini işleme başlıklı makaleye bakın.

Ekran kalemi girişleri

TOOL_TYPE_STYLUS ile ekran kalemi girişlerini filtreleyebilirsiniz:

Kotlin

val isStylus = TOOL_TYPE_STYLUS == event.getToolType(pointerIndex)

Java

boolean isStylus = TOOL_TYPE_STYLUS == event.getToolType(pointerIndex);

Ekran kalemi, TOOL_TYPE_ERASER ile silgi olarak da kullanıldığını bildirebilir:

Kotlin

val isEraser = TOOL_TYPE_ERASER == event.getToolType(pointerIndex)

Java

boolean isEraser = TOOL_TYPE_ERASER == event.getToolType(pointerIndex);

Ekran kalemi ekseni verileri

ACTION_DOWN ve ACTION_MOVE, ekran kalemiyle ilgili eksen verileri (ör. x ve y koordinatları, basınç, yön, yatırma ve fareyle üzerine gelme) sağlar.

MotionEvent API, bu verilere erişimi etkinleştirmek için getAxisValue(int) değerini sağlar. Burada parametre, aşağıdaki eksen tanımlayıcılarından herhangi biridir:

Axis Döndürülen getAxisValue() değeri
AXIS_X Bir hareket etkinliğinin X koordinatı.
AXIS_Y Bir hareket etkinliğinin Y koordinatı.
AXIS_PRESSURE Dokunmatik ekran veya dokunmatik alanda parmak, ekran kalemi ya da başka bir işaretçiyle uygulanan basınç. Fare veya iztopu için birincil düğmeye basılmışsa 1, aksi halde 0 değerini alır.
AXIS_ORIENTATION Dokunmatik ekran veya dokunmatik alanda parmak, ekran kalemi ya da başka bir işaretçinin cihazın dikey düzlemine göre yönü.
AXIS_TILT Ekran kaleminin radyan cinsinden yatırma açısı.
AXIS_DISTANCE Ekran kaleminin ekrana olan mesafesi.

Örneğin, MotionEvent.getAxisValue(AXIS_X), ilk işaretçi için x koordinatını döndürür.

Ayrıca, Çoklu dokunma hareketlerini işleme konusuna da bakın.

Konum

Aşağıdaki çağrıları kullanarak bir işaretçinin x ve y koordinatlarını alabilirsiniz:

Ekran kalemiyle x ve y koordinatları eşlenmiş.
Şekil 1. Ekran kalemi işaretçisinin X ve y ekran koordinatları.

Basınç

İşaretçi basıncını aşağıdaki çağrıları kullanarak alabilirsiniz:

İlk işaretçi için getAxisValue(AXIS_PRESSURE) veya getPressure().

Dokunmatik ekranlar veya dokunmatik alanlar için basınç değeri 0 (basınç yok) ile 1 arasında bir değerdir ancak ekran kalibrasyonuna bağlı olarak daha yüksek değerler döndürülebilir.

Düşük ile yüksek basınç arasındaki sürekliliği temsil eden ekran kalemi çizgisi. İnmenin sol tarafta dar ve hafif olması, basıncın düşük olduğunu gösterir. Çizginin soldan sağa doğru genişlemesi ve koyulaşması, en yüksek basıncı gösteren en geniş ve en koyu kenara kadar uzanır.
Şekil 2. Basınç gösterimi: Sol tarafta düşük basın, sağda yüksek basınç.

Yön

Yön, ekran kaleminin işaret ettiği yönü gösterir.

İşaretçi yönü, getAxisValue(AXIS_ORIENTATION) veya getOrientation() (ilk işaretçi için) kullanılarak alınabilir.

Ekran kalemi için yön, saat yönünde 0 ile pi (eği) veya saat yönünün tersine 0 ile -pi arasında bir radyan değeri olarak döndürülür.

Yön, gerçek hayattan bir fırça uygulayabilmenizi sağlar. Örneğin, ekran kalemi düz bir fırçayı temsil ediyorsa düz fırçanın genişliği, ekran kaleminin yönüne bağlıdır.

Şekil 3. Yaklaşık 0,57 radyandan sol tarafı işaret eden ekran kalemi.

Eğme

Yatır, ekran kaleminin ekrana göre eğimi ölçer.

Yatırma, ekran kaleminin pozitif açısını radyan cinsinden döndürür. Sıfır ekrana dik, eği/2 ise yüzey üzerinde düzdür.

Eğme açısı, getAxisValue(AXIS_TILT) kullanılarak alınabilir (ilk işaretçi için kısayol yoktur).

Eğimli bir kalemle gölgelendirmeyi taklit etmek gibi, gerçek hayattaki araçların olabildiğince yakın bir şekilde yeniden oluşturulması için yatırma özelliği kullanılabilir.

Ekran kalemi, ekran yüzeyinden yaklaşık 40 derece eğildi.
Şekil 4. Ekran kalemi yaklaşık 0, 785 radyan veya dik yönden 45 derece eğildi.

Üzerine gelme

getAxisValue(AXIS_DISTANCE) kullanılarak ekran kaleminin ekrandan uzaklığı öğrenilebilir. Yöntem, ekran kalemi ekrandan uzaklaştıkça 0, 0 (ekranla temas) değerini daha yüksek değerlere döndürür. Ekran ve ekran kaleminin ucu (nokta) arasındaki fareyle üzerine gelme mesafesi hem ekranın hem de ekran kaleminin üreticisine bağlıdır. Uygulamalar farklılık gösterebileceğinden, uygulama açısından kritik işlevler için kesin değerlere güvenmeyin.

Ekran kaleminin üzerine gelme özelliği, fırçanın boyutunu önizlemek veya bir düğmenin seçileceğini belirtmek için kullanılabilir.

Şekil 5. Bir ekranın üzerine gelen ekran kalemi. Uygulama, ekran kalemi ekran yüzeyine dokunmasa bile tepki veriyor.

Not: Oluştur, kullanıcı arayüzü öğelerinin durumunu değiştirmek için bir dizi değiştirici öğe sunar:

  • hoverable: Bileşeni, işaretçi girme ve çıkış etkinliklerini kullanarak fareyle üzerine getirilebilecek şekilde yapılandırın.
  • indication: Etkileşimler gerçekleştiğinde bu bileşen için görsel efektler çizer.

Avuç içi ile reddetme, gezinme ve istenmeyen girişler

Örneğin, kullanıcı el yazısı sırasında destek almak için elini ekrana doğal bir şekilde koyduğunda çoklu dokunma özellikli ekranlar bazen istenmeyen dokunmaları algılayabilir. Palmiye reddi, bu davranışı tespit eden ve size son MotionEvent grubunun iptal edilmesi gerektiğini bildiren bir mekanizmadır.

Bu nedenle, istenmeyen dokunmaların ekrandan kaldırılabilmesi ve geçerli kullanıcı girişlerinin yeniden oluşturulabilmesi için kullanıcı girişlerinin geçmişini saklamanız gerekir.

ACTION_CANCEL ve FLAG_CANCELED

ACTION_CANCEL ve FLAG_CANCELED, önceki MotionEvent grubunun son ACTION_DOWN üzerinden iptal edilmesi gerektiğini bildirmek için tasarlanmıştır. Bu sayede, örneğin belirli bir işaretçi için bir çizim uygulamasının son çizgisini geri alabilirsiniz.

ACTION_CANCEL

Android 1.0'da (API düzeyi 1) eklendi

ACTION_CANCEL, önceki hareket etkinliklerinin iptal edilmesi gerektiğini gösterir.

Aşağıdakilerden herhangi biri algılandığında ACTION_CANCEL tetiklenir:

  • Gezinme hareketleri
  • Avuç içi reddi

ACTION_CANCEL tetiklendiğinde, etkin işaretçiyi getPointerId(getActionIndex()) ile tanımlamanız gerekir. Ardından, bu işaretçiyle oluşturulan fırçayı giriş geçmişinden kaldırıp sahneyi yeniden oluşturun.

FLAG_CANCELED

Android 13'te (API düzeyi 33) eklendi

FLAG_CANCELED, yukarıya çıkan işaretçinin yanlışlıkla kullanıcı dokunuşu olduğunu gösterir. İşaret, genellikle kullanıcı yanlışlıkla (ör. cihazı tutarak veya avuç içini ekrana koyarak) ekrana dokunduğunda ayarlanır.

İşaret değerine aşağıdaki şekilde erişebilirsiniz:

Kotlin

val cancel = (event.flags and FLAG_CANCELED) == FLAG_CANCELED

Java

boolean cancel = (event.getFlags() & FLAG_CANCELED) == FLAG_CANCELED;

İşaret ayarlandıysa bu işaretçiden yapılan son ACTION_DOWN olan son MotionEvent setini geri almanız gerekir.

ACTION_CANCEL gibi, işaretçiler getPointerId(actionIndex) ile bulunabilir.

Şekil 6. Ekran kalemi ve avuç içi dokunarak MotionEvent grup oluşturur. Avuç içi dokunma işlemi iptal edildi ve ekran yeniden oluşturuldu.

Tam ekran, uçtan uca ve gezinme hareketleri

Bir uygulama tam ekransa ve kenara yakın yerde işlem yapılabilir öğeler (ör. bir çizim veya not alma uygulamasının tuvali) varsa, gezinmeyi görüntülemek için ekranın altından kaydırma veya uygulamayı arka plana taşıma, tuvalde istenmeyen bir dokunmaya neden olabilir.

Şekil 7. Bir uygulamayı arka plana taşımak için hızlıca kaydırma hareketi.

Hareketlerin uygulamanızda istenmeyen dokunmaları tetiklemesini önlemek için iç içe yerleştirilmişlerden ve ACTION_CANCEL özelliğinden yararlanabilirsiniz.

Yukarıdaki Palm reddi, navigasyon ve istenmeyen girişler bölümüne de bakın.

Gezinme hareketlerinin istenmeyen dokunma etkinliklerine neden olmasını önlemek için setSystemBarsBehavior() yöntemini ve WindowInsetsController içinden BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE yöntemini kullanın:

Kotlin

// Configure the behavior of the hidden system bars.
windowInsetsController.systemBarsBehavior =
    WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE

Java

// Configure the behavior of the hidden system bars.
windowInsetsController.setSystemBarsBehavior(
    WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
);

Inset ve hareket yönetimi hakkında daha fazla bilgi edinmek için şuraya bakın:

Düşük gecikme

Gecikme, kullanıcı girişini işlemek ve oluşturmak için donanım, sistem ve uygulamanın ihtiyaç duyduğu süredir.

Gecikme = donanım ve işletim sistemi girişi işleme + uygulama işleme + sistem birleştirme + donanım oluşturma

Gecikme, oluşturulan fırçanın ekran kalemi konumunun gerisinde kalmasına neden olur. Oluşturulan çizgi ve ekran kaleminin konumu arasındaki boşluk, gecikmeyi temsil eder.
Şekil 8. Gecikme, oluşturulan fırçanın ekran kalemi konumunun gerisinde kalmasına neden olur.

Gecikme kaynağı

  • Ekran kalemi dokunmatik ekrana (donanım) kaydediliyor: Ekran kalemi ve işletim sistemi kaydedilmek ve senkronize edilmek üzere iletişim kurduğunda ilk kablosuz bağlantı.
  • Dokunma örnekleme hızı (donanım): Dokunmatik ekranın, işaretçinin yüzeye temas edip etmediğini saniye başına kontrol etme sayısı. Bu sayı, 60 ile 1.000 Hz arasında bir değerdir.
  • Giriş işleme (uygulama): Kullanıcı girişine renk, grafik efektleri ve dönüşüm uygulama.
  • Grafik oluşturma (OS + donanım): Arabellek değiştirme, donanım işleme.

Düşük gecikmeli grafikler

Jetpack düşük gecikmeli grafik kitaplığı, kullanıcı girişi ve ekranda oluşturma arasındaki işleme süresini kısaltır.

Kitaplık, çoklu arabellek oluşturmayı kaçınarak ve doğrudan ekrana yazma anlamına gelen bir ön arabellek oluşturma tekniğinden yararlanarak işleme süresini kısaltır.

Ön arabellek oluşturma

Ön arabellek, ekranın oluşturma için kullandığı bellektir. En yakın uygulamalar doğrudan ekrana çizim yapabilir. Düşük gecikmeli kitaplık, uygulamaların doğrudan ön arabelleğe alınmasına olanak tanır. Bu, normal çoklu arabellek oluşturma veya çift arabellek oluşturma (en yaygın durum) durumunda meydana gelebilen arabellek değişimini engelleyerek performansı artırır.

Uygulama ekran arabelleğine yazar ve ekran arabelleğinden okur.
Şekil 9. Ön arabellek oluşturma.
Uygulama, ekran arabelleğiyle değişen çoklu arabelleğe yazar. Uygulama, ekran arabelleğinden veri okuyor.
Şekil 10. Çoklu arabellek oluşturma.

Ön arabellek oluşturma, ekranın küçük bir alanını oluşturmak için harika bir teknik olsa da ekranın tamamını yenilemek için tasarlanmamıştır. Ön arabellek oluşturma ile uygulama, içeriği ekranın okuduğu bir arabelleğe alır. Bunun sonucunda, yapıların oluşturulması veya yırtılma olasılığı söz konusudur(aşağıdaki bilgilere bakın).

Düşük gecikme kitaplığı, Android 10 (API düzeyi 29) ve sonraki sürümlerde ve Android 10 (API düzeyi 29) ve sonraki sürümleri çalıştıran ChromeOS cihazlarda kullanılabilir.

Bağımlılıklar

Düşük gecikmeli kitaplık, ön arabellek oluşturma uygulaması için bileşenler sağlar. Kitaplık, uygulamanın modül build.gradle dosyasına bağımlılık olarak eklenir:

dependencies {
    implementation "androidx.graphics:graphics-core:1.0.0-alpha03"
}

GLFrontBufferRenderer geri çağırmaları

Düşük gecikmeli kitaplık, aşağıdaki yöntemleri tanımlayan GLFrontBufferRenderer.Callback arayüzünü içerir:

Düşük gecikme kitaplığı, GLFrontBufferRenderer ile kullandığınız veri türü konusunda dikkatli değildir.

Ancak kitaplık, verileri yüzlerce veri noktasından oluşan bir akış olarak işler. Bu nedenle verilerinizi, bellek kullanımını ve ayırmayı optimize edecek şekilde tasarlayın.

Geri Aramalar

Geri çağırmaları oluşturmak için GLFrontBufferedRenderer.Callback uygulayın ve onDrawFrontBufferedLayer() ile onDrawDoubleBufferedLayer() değerlerini geçersiz kılın. GLFrontBufferedRenderer, verilerinizi mümkün olan en optimize şekilde oluşturmak için geri çağırmaları kullanır.

Kotlin

val callback = object: GLFrontBufferedRenderer.Callback<DATA_TYPE> {

   override fun onDrawFrontBufferedLayer(
       eglManager: EGLManager,
       bufferInfo: BufferInfo,
       transform: FloatArray,
       param: DATA_TYPE
   ) {
       // OpenGL for front buffer, short, affecting small area of the screen.
   }

   override fun onDrawMultiDoubleBufferedLayer(
       eglManager: EGLManager,
       bufferInfo: BufferInfo,
       transform: FloatArray,
       params: Collection<DATA_TYPE>
   ) {
       // OpenGL full scene rendering.
   }
}

Java

GLFrontBufferedRenderer.Callback<DATA_TYPE> callbacks =
    new GLFrontBufferedRenderer.Callback<DATA_TYPE>() {
        @Override
        public void onDrawFrontBufferedLayer(@NonNull EGLManager eglManager,
            @NonNull BufferInfo bufferInfo,
            @NonNull float[] transform,
            DATA_TYPE data_type) {
                // OpenGL for front buffer, short, affecting small area of the screen.
        }

    @Override
    public void onDrawDoubleBufferedLayer(@NonNull EGLManager eglManager,
        @NonNull BufferInfo bufferInfo,
        @NonNull float[] transform,
        @NonNull Collection<? extends DATA_TYPE> collection) {
            // OpenGL full scene rendering.
    }
};
GLFrontBufferedRenderer örneği bildirin

Daha önce oluşturduğunuz SurfaceView ve geri çağırmaları sağlayarak GLFrontBufferedRenderer öğesini hazırlayın. GLFrontBufferedRenderer, geri çağırmalarınızı kullanarak oluşturmayı ön ve çift arabelleğe almak için optimize eder:

Kotlin

var glFrontBufferRenderer = GLFrontBufferedRenderer<DATA_TYPE>(surfaceView, callbacks)

Java

GLFrontBufferedRenderer<DATA_TYPE> glFrontBufferRenderer =
    new GLFrontBufferedRenderer<DATA_TYPE>(surfaceView, callbacks);
Oluşturma

Ön arabellek oluşturma işlemi, onDrawFrontBufferedLayer() geri çağırma işlemini tetikleyen renderFrontBufferedLayer() yöntemini çağırdığınızda başlar.

commit() işlevini çağırdığınızda çift arabellek oluşturma işlemi devam eder. Bu işlev, onDrawMultiDoubleBufferedLayer() geri çağırma işlemini tetikler.

Takip eden örnekte, kullanıcı ekranda çizim yapmaya başladığında (ACTION_DOWN) ve işaretçiyi hareket ettirdiğinde (ACTION_MOVE) işlem ön arabelleğe oluşturulur (hızlı oluşturma) ve işaretçi ekran yüzeyinden (ACTION_UP) ayrıldığında işlem çift arabelleğe aktarılır.

requestUnbufferedDispatch() özelliğini kullanarak giriş sisteminin hareket etkinliklerini toplu değil, kullanılabilir hale gelir gelmez yayınlamasını isteyebilirsiniz:

Kotlin

when (motionEvent.action) {
   MotionEvent.ACTION_DOWN -> {
       // Deliver input events as soon as they arrive.
       view.requestUnbufferedDispatch(motionEvent)
       // Pointer is in contact with the screen.
       glFrontBufferRenderer.renderFrontBufferedLayer(DATA_TYPE)
   }
   MotionEvent.ACTION_MOVE -> {
       // Pointer is moving.
       glFrontBufferRenderer.renderFrontBufferedLayer(DATA_TYPE)
   }
   MotionEvent.ACTION_UP -> {
       // Pointer is not in contact in the screen.
       glFrontBufferRenderer.commit()
   }
   MotionEvent.CANCEL -> {
       // Cancel front buffer; remove last motion set from the screen.
       glFrontBufferRenderer.cancel()
   }
}

Java

switch (motionEvent.getAction()) {
   case MotionEvent.ACTION_DOWN: {
       // Deliver input events as soon as they arrive.
       surfaceView.requestUnbufferedDispatch(motionEvent);

       // Pointer is in contact with the screen.
       glFrontBufferRenderer.renderFrontBufferedLayer(DATA_TYPE);
   }
   break;
   case MotionEvent.ACTION_MOVE: {
       // Pointer is moving.
       glFrontBufferRenderer.renderFrontBufferedLayer(DATA_TYPE);
   }
   break;
   case MotionEvent.ACTION_UP: {
       // Pointer is not in contact in the screen.
       glFrontBufferRenderer.commit();
   }
   break;
   case MotionEvent.ACTION_CANCEL: {
       // Cancel front buffer; remove last motion set from the screen.
       glFrontBufferRenderer.cancel();
   }
   break;
}

Oluşturma sırasında yapılması ve yapılmaması gerekenler

Yapılması gerekenler

Ekranın küçük bölümleri, el yazısı, çizim, çizim.

Yapılmamalı

Tam ekran güncelleme, kaydırma, yakınlaştırma. Yırtılmaya neden olabilir.

Yırtılma

Yırtılma, ekran arabelleği aynı anda değiştirilirken ekran yenilendiğinde ortaya çıkar. Ekranın bir bölümü yeni verileri, bir diğeri ise eski verileri gösterir.

Ekran yenilenirken yırtılma nedeniyle Android resminin üst ve alt kısımları hizalı değil.
Şekil 11. Ekrandaki gözyaşı yukarıdan aşağıya doğru yenilenir.

Hareket tahmini

Jetpack hareket tahmini kitaplığı, kullanıcının çizgi yolunu tahmin ederek ve oluşturucuya geçici, yapay noktalar sağlayarak algılanan gecikmeyi azaltır.

Hareket tahmini kitaplığı, gerçek kullanıcı girişlerini MotionEvent nesneleri olarak alır. Nesneler, x ve y koordinatları, basınç ve zaman hakkında bilgiler içerir. Bu bilgiler, gelecekteki MotionEvent nesnelerini tahmin etmek için hareket tahmin aracı tarafından kullanılır.

Tahmin edilen MotionEvent nesneleri yalnızca tahmindir. Tahmin edilen etkinlikler algılanan gecikmeyi azaltabilir, ancak tahmin edilen verilerin alındıktan sonra gerçek MotionEvent verileriyle değiştirilmesi gerekir.

Hareket tahmini kitaplığı, Android 4.4 (API düzeyi 19) ve sonraki sürümlerde ve Android 9 (API düzeyi 28) ve sonraki sürümleri çalıştıran ChromeOS cihazlarda kullanılabilir.

Gecikme, oluşturulan fırçanın ekran kalemi konumunun gerisinde kalmasına neden olur. Çizgiyle ekran kalemi arasındaki boşluk, tahmin noktalarıyla doldurulur. Kalan boşluk, algılanan gecikmedir.
Şekil 12. Hareket tahmini nedeniyle gecikme azaldı.

Bağımlılıklar

Hareket tahmini kitaplığı, tahminlerin uygulanmasını sağlar. Kitaplık, uygulamanın modül build.gradle dosyasına bağımlılık olarak eklenir:

dependencies {
    implementation "androidx.input:input-motionprediction:1.0.0-beta01"
}

Uygulama

Hareket tahmini kitaplığı, aşağıdaki yöntemleri tanımlayan MotionEventPredictor arayüzünü içerir:

  • record(): MotionEvent nesnelerini kullanıcı işlemlerinin kaydı olarak depolar
  • predict(): Tahmin edilen bir MotionEvent döndürür
MotionEventPredictor örneği bildir

Kotlin

var motionEventPredictor = MotionEventPredictor.newInstance(view)

Java

MotionEventPredictor motionEventPredictor = MotionEventPredictor.newInstance(surfaceView);
Tahmin aracını verilerle destekleyin

Kotlin

motionEventPredictor.record(motionEvent)

Java

motionEventPredictor.record(motionEvent);
Tahmin

Kotlin

when (motionEvent.action) {
   MotionEvent.ACTION_MOVE -> {
       val predictedMotionEvent = motionEventPredictor?.predict()
       if(predictedMotionEvent != null) {
            // use predicted MotionEvent to inject a new artificial point
       }
   }
}

Java

switch (motionEvent.getAction()) {
   case MotionEvent.ACTION_MOVE: {
       MotionEvent predictedMotionEvent = motionEventPredictor.predict();
       if(predictedMotionEvent != null) {
           // use predicted MotionEvent to inject a new artificial point
       }
   }
   break;
}

Hareket tahmini için yapılması ve yapılmaması gerekenler

Yapılması gerekenler

Yeni bir tahmin edilen nokta eklendiğinde tahmin noktalarını kaldırın.

Yapılmamalı

Son oluşturma için tahmin noktalarını kullanmayın.

Not alma uygulamaları

ChromeOS, uygulamanızın bazı not alma işlemlerini beyan etmesine olanak tanır.

Bir uygulamayı ChromeOS'te not alma uygulaması olarak kaydetmek için Giriş uyumluluğu konusuna bakın.

Bir uygulamayı Android'de not alma uygulaması olarak kaydetmek için Not alma uygulaması oluşturma başlıklı makaleyi inceleyin.

Android 14 (API düzeyi 34), uygulamanızın kilit ekranında not alma etkinliği başlatmasını sağlayan ACTION_CREATE_NOTE amacını kullanıma sundu.

ML Kit ile dijital mürekkep tanıma

ML Kit dijital mürekkep tanıma sayesinde uygulamanız, dijital bir yüzeyde el yazısıyla yazılmış metinleri yüzlerce dilde tanıyabilir. Çizimleri de sınıflandırabilirsiniz.

ML Kit, el yazısını metne dönüştürmek için makine öğrenimi modelleri tarafından işlenebilen Ink nesneleri oluşturmak için Ink.Stroke.Builder sınıfını sağlar.

Model, el yazısı tanımasına ek olarak sil ve daire gibi hareketleri tanıyabilir.

Daha fazla bilgi edinmek için Dijital mürekkep tanıma başlıklı makaleye bakın.

Ek kaynaklar

Geliştirici kılavuzları

Codelab uygulamaları