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:
MotionEvent#getAxisValue(AXIS_X)
veyaMotionEvent#getX()
MotionEvent#getAxisValue(AXIS_Y)
veyaMotionEvent#getY()
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.
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.
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.
Ü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.
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.
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.
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:
- Yoğun içerik modu için sistem çubuklarını gizle
- Hareketle gezinmeyle uyumluluğu sağlama
- Uygulamanızda içeriği uçtan uca görüntüleme
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 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.
Ö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.
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.
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 depolarpredict()
: Tahmin edilen birMotionEvent
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.