Nasıl yapılır? rehberleri
Cahier: Büyük ekranlarda üretkenlik ve yaratıcılık için yeni bir Android GitHub örneği
Okuma süresi: 11 dakika
Ink API artık beta sürümünde ve uygulamanıza entegre edilmeye hazır. Bu dönüm noktası, geliştiricilerin değerli geri bildirimleri sayesinde mümkün oldu. Bu geri bildirimler, API'nin performansı, kararlılığı ve görsel kalitesinde sürekli iyileştirmeler yapılmasını sağladı.
Google Dokümanlar, Pixel Studio, Google Fotoğraflar, Chrome PDF, YouTube Effect Maker gibi Google uygulamaları ve Android'deki Seçerek Arat gibi benzersiz özellikler en yeni API'leri kullanır.
Bu dönüm noktasını kutlamak için Cahier'in kullanıma sunulduğunu duyurmaktan heyecan duyuyoruz. Cahier, özellikle tabletler ve katlanabilir telefonlar olmak üzere her boyuttaki Android cihazlar için optimize edilmiş kapsamlı bir not alma uygulaması örneğidir.
Cahier nedir?
Cahier (Fransızca "defter"), metin, çizim ve resimleri birleştirerek kullanıcıların düşüncelerini yakalamasına ve düzenlemesine olanak tanıyan bir uygulama oluşturabileceğinizi göstermek için tasarlanmış örnek bir uygulamadır.
Örnek, büyük ekranlarda kullanıcı üretkenliğini ve yaratıcılığını artırmak için başvurulacak bir kaynak olarak kullanılabilir. Bu tür deneyimler oluşturmaya yönelik en iyi uygulamaları gösterir, geliştiricilerin ilgili güçlü API'leri ve teknikleri anlamasını ve benimsemesini hızlandırır. Bu yayında Cahier'in temel özellikleri, önemli API'leri ve örnek uygulamayı kendi uygulamalarınız için mükemmel bir referans haline getiren mimari kararlar açıklanmaktadır.
Örnekte gösterilen temel özellikler şunlardır:
- Çok yönlü not oluşturma: Metin, serbest çizimler ve resim ekleri gibi birden fazla formatı tek bir notta destekleyen esnek bir içerik oluşturma sisteminin nasıl uygulanacağını gösterir.
- Yaratıcı mürekkep araçları: Ink API'yi kullanarak yüksek performanslı ve düşük gecikmeli bir çizim deneyimi sunar. Örnekte, çeşitli fırçaların, renk seçicinin, geri alma/yineleme işlevinin ve silgi aracının entegrasyonuna dair pratik bir örnek sunulmaktadır.
- Sürükle ve bırak ile akıcı içerik entegrasyonu: Sürükle ve bırak özelliğini kullanarak hem gelen hem de giden içeriğin nasıl işleneceğini gösterir. Buna, diğer uygulamalardan bırakılan resimleri kabul etme ve kullanıcıların sorunsuz paylaşım için içeriği uygulamanızdan dışarı sürüklemesine izin verme dahildir.
- Notları düzenleme: Hızlı erişim için notları favori olarak işaretleyin. Düzeninizi korumak için görünümü filtreleyin.
- Önce çevrimdışı mimari: Room kullanılarak önce çevrimdışı mimariyle oluşturulmuştur. Bu sayede tüm veriler yerel olarak kaydedilir ve uygulama, internet bağlantısı olmadan tam işlevsel kalır.
- Güçlü çoklu pencere ve aynı anda çalışan birden çok kopya desteği: Aynı anda çalışan birden çok kopya desteğinin nasıl sağlanacağını gösterir. Bu sayede uygulamanızın birden fazla pencerede başlatılmasına olanak tanıyarak kullanıcıların farklı notlar üzerinde yan yana çalışmasına ve büyük ekranlarda üretkenliği ve yaratıcılığı artırmasına yardımcı olur.
- Tüm ekranlar için uyarlanabilir kullanıcı arayüzü: Kullanıcı arayüzü, telefonlarda, tabletlerde ve katlanabilir cihazlarda optimize edilmiş bir kullanıcı deneyimi sağlamak için ListDetailPaneScaffold ve NavigationSuiteScaffold kullanarak farklı ekran boyutlarına ve yönlerine sorunsuz bir şekilde uyum sağlar.
- Derin sistem entegrasyonu: Sistem genelindeki Notlar amaçlarına yanıt vererek ve çeşitli sistem giriş noktalarından hızlı içerik yakalamayı etkinleştirerek uygulamanızı Android 14 ve sonraki sürümlerde varsayılan not alma uygulaması yapma konusunda rehberlik eder.
Büyük ekranlarda üretkenlik ve yaratıcılık için tasarlandı
İlk lansman için duyuruyu, Cahier'i hem üretkenlik hem de yaratıcılık kullanım alanları için önemli bir öğrenme kaynağı haline getiren birkaç temel özellik üzerine yoğunlaştırıyoruz.
Uyarlanabilirlik temeli
Cahier, sıfırdan uyarlanabilir olacak şekilde geliştirilmiştir. Örnekte, uygulama düzeninin çeşitli ekran boyutlarına ve yönlerine sorunsuz bir şekilde uyarlanması için özellikle material3-adaptive kitaplığının ListDetailPaneScaffold ve NavigationSuiteScaffold bileşenleri kullanılıyor. Bu, modern bir Android uygulaması için çok önemli bir unsurdur ve Cahier, bu unsuru nasıl etkili bir şekilde uygulayacağınız konusunda net bir örnek sunar.
Cahier adaptive UI built with Material 3 Adaptive library
Önemli API'leri ve entegrasyonları sergileme
Örnekte, kendi uygulamalarınızda kullanabileceğiniz güçlü üretkenlik API'lerini göstermeye odaklanılmıştır. Bu API'ler arasında şunlar yer alır:
- Ink API
- Notlar rolü
- Aynı anda çalışan birden çok kopya, çoklu pencere ve pencereli görüntüleme
- Sürükle ve bırak
Önemli API'lere yakından bakış
Cahier'in birinci sınıf not alma deneyimi sunmak için entegre ettiği temel API'lerden ikisini daha ayrıntılı olarak inceleyelim.
Ink API ile doğal mürekkep deneyimleri oluşturma
Ekran kalemi girişi, büyük ekranlı cihazları dijital not defterlerine ve eskiz defterlerine dönüştürür. Akıcı ve doğal mürekkep deneyimleri oluşturmanıza yardımcı olmak için Ink API'yi örneğin temel taşı haline getirdik. Ink API, sınıfının en iyisi düşük gecikme süresiyle güzel mürekkep vuruşları oluşturmayı, işlemeyi ve değiştirmeyi kolaylaştırır.
Ink API, modüler bir mimari sunar. Bu sayede API'yi uygulamanızın özel yığınına ve ihtiyaçlarına göre uyarlayabilirsiniz. API modülleri şunları içerir:
- Yazma modülleri (Oluştur - görünümler): Cihazın sağlayabileceği en düşük gecikmeyle sorunsuz vuruşlar oluşturmak için gerçek zamanlı mürekkep girişiyle ilgilenin.
- Cahier, DrawingSurface'te gerçek zamanlı kalem veya dokunma girişini işlemek için yeni kullanıma sunulan InProgressStrokes composable'ını kullanır. Bu modül, işaretçi etkinliklerini yakalamaktan ve ıslak mürekkep darbelerini mümkün olan en düşük gecikme süresiyle oluşturmaktan sorumludur.
- Mürekkep vuruşları modülü: Mürekkep girişini ve görsel temsilini gösterir.Kullanıcı bir çizgiyi tamamladığında onStrokesFinished geri çağırma işlevi, uygulamaya sonlandırılmış/kuru bir Stroke nesnesi sağlar. Tamamlanmış mürekkep konturunu temsil eden bu değişmez nesne daha sonra DrawingCanvasViewModel'de yönetilir.
- Oluşturma modülü: Mürekkep darbelerini verimli bir şekilde göstererek Jetpack Compose veya Android görünümleriyle birleştirilmelerine olanak tanır.
- Cahier, hem mevcut hem de yeni kurutulmuş vuruşları göstermek için etkin çizimlerde DrawingSurface'teki ve notun statik önizlemesini göstermek için �DrawingDetailPanePreview'deki �CanvasStrokeRenderer'ı kullanır. Bu modül, Stroke nesnelerini Canvas'a etkili bir şekilde çizer.
- Fırça modülleri (Compose - views): Konturların görsel stilini tanımlamak için bildirimsel bir yöntem sunar. Son güncellemeler (alpha03 sürümünden itibaren) arasında, özellikle kementle seçim gibi özellikler için yararlı olan yeni bir kesikli çizgi fırçası yer alıyor. DrawingCanvasViewModel, currentBrush'ın durumunu tutar. DrawingCanvas'taki bir araç kutusu, kullanıcıların farklı fırça ailelerini (ör. StockBrushes.pressurePen() veya StockBrushes.highlighter()) seçmesine ve renkleri değiştirmesine olanak tanır. ViewModel, Brush nesnesini günceller. Bu nesne daha sonra yeni vuruşlar için InProgressStrokes composable'ı tarafından kullanılır.
- Geometri modülleri (Compose - views): Silme ve seçme gibi özellikler için konturların değiştirilmesini ve analiz edilmesini destekler.
- Araç kutusundaki silgi aracı ve DrawingCanvasViewModel'deki işlevler, geometri modülünü kullanır. Silgi etkin olduğunda, kullanıcının hareketinin yolu etrafında MutableParallelogram oluşturulur. Silgi, hangi konturların silineceğini belirlemek için şekil ile mevcut konturların sınırlayıcı kutuları arasındaki kesişimleri kontrol eder. Bu sayede silgi sezgisel ve hassas bir şekilde çalışır.
- Depolama modülü: Mürekkep verileri için etkili serileştirme ve seri durumdan çıkarma özellikleri sunarak disk ve ağ boyutunda önemli ölçüde tasarruf sağlar. Çizimleri kaydetmek için Cahier, Stroke nesnelerini Room veritabanında kalıcı hale getirir. Dönüştürücüler bölümündeki örnekte, StrokeInputBatch'i (ham nokta verileri) ByteArray'e seri hale getirmek için depolama modülünün encode işlevi kullanılır. Bayt dizisi, fırça özellikleriyle birlikte JSON dizesi olarak kaydedilir. Bir not yüklendiğinde vuruşları yeniden oluşturmak için decode işlevi kullanılır.
Bu temel modüllerin yanı sıra, son güncellemelerle birlikte Ink API'nin özellikleri genişletildi:
- Özel
BrushFamilynesneler için yeni deneysel API'ler, geliştiricilerin yaratıcı ve benzersiz fırça türleri oluşturmasına olanak tanıyarak Kurşun Kalem ve Lazer İşaretçi gibi fırçaların kullanılabilmesini sağlar.
Cahier, gelişmiş yaratıcı olanakları göstermek için aşağıda gösterilen benzersiz müzik fırçası da dahil olmak üzere özel fırçalardan yararlanır.
Ink API'nin özel fırçalarıyla oluşturulan gökkuşağı lazeri
Ink API'nin özel fırçalarıyla oluşturulan müzik fırçası
- Yerel Jetpack Compose birlikte çalışabilirlik modülleri, daha deyimsel ve verimli bir geliştirme deneyimi için mürekkep işlevlerinin doğrudan Compose kullanıcı arayüzlerinize entegrasyonunu kolaylaştırır.
Ink API, üretkenlik ve yaratıcılık uygulamaları için özel uygulamaya kıyasla ideal bir seçim olmasını sağlayan çeşitli avantajlar sunar:
- Kullanım kolaylığı: Ink API, grafik ve geometriyle ilgili karmaşık işlemleri ortadan kaldırarak Cahier'in temel özelliklerine odaklanmanızı sağlar.
- Performans: Yerleşik düşük gecikme süresi desteği ve optimize edilmiş oluşturma, sorunsuz ve hızlı bir mürekkep deneyimi sağlar.
- Esneklik: Modüler tasarım, ihtiyacınız olan bileşenleri seçmenize olanak tanır. Bu sayede Ink API, Cahier'in mimarisine sorunsuz bir şekilde entegre edilebilir.
Ink API, Dokümanlar'da işaretleme ve Seçerek Arat gibi birçok Google uygulamasının yanı sıra Orion Notes ve PDF Tarayıcı gibi iş ortağı uygulamalarında da kullanılmaktadır.
"Seçerek Arat (CtS) için ilk tercihimiz Ink API oldu. Kapsamlı dokümanlarından yararlanarak Ink API'yi kolayca entegre ettik ve sadece bir hafta içinde ilk çalışan prototipimize ulaştık. Ink'in özel fırça dokusu ve animasyon desteği, fırça darbesi tasarımında hızlıca yineleme yapmamızı sağladı." - Jordan Komoda, Yazılım Mühendisi - Google
Notlar rolüyle varsayılan not uygulaması olma
Not alma, büyük ekranlı cihazlarda kullanıcı üretkenliğini artıran temel bir özelliktir. Notlar rolü özelliği sayesinde kullanıcılar, kilit ekranından veya diğer uygulamalar çalışırken uyumlu uygulamalarınıza erişebilir. Bu özellik, sistem genelinde varsayılan not alma uygulamalarını tanımlayıp ayarlar ve içerik yakalamak için başlatılmalarına izin verir.
Cahier'de uygulama
Notlar rolünü uygulama işlemi birkaç temel adımdan oluşur. Bu adımların tamamı örnekte gösterilmektedir:
- Manifest beyanı: Öncelikle, uygulamanın not alma intent'lerini işleme özelliğini beyan etmesi gerekir. Cahier, AndroidManifest.xml dosyasında android.intent.action.CREATE_NOTE işlemi için
<intent-filter>içeriyor. Bu, sisteme uygulamanın notlar rolü için potansiyel bir aday olduğunu bildirir. - Rol durumunu kontrol etme: SettingsViewModel, mevcut durumu belirlemek için Android'in RoleManager'ını kullanır. SettingsViewModel, notlar rolünün cihazda kullanılabilir olup olmadığını (isRoleAvailable) ve Cahier'in şu anda bu role sahip olup olmadığını (isRoleHeld) kontrol eder. Bu durum, Kotlin akışları kullanılarak kullanıcı arayüzüne sunulur.
- Rolü isteme: Settings.kt dosyasında, rol mevcut ancak alınmamışsa kullanıcıya Button gösterilir. Düğme tıklandığında ViewModel'deki
requestNotesRoleişlevi çağrılır. Bu işlev, kullanıcının Cahier'i seçebileceği varsayılan uygulama ayarları ekranını açma amaçlı bir intent oluşturur. Bu işlem, amaç başlatma ve sonucu alma işlemlerini gerçekleştiren rememberLauncherForActivityResult API kullanılarak yönetilir. - Kullanıcı arayüzünü güncelleme: Kullanıcı ayarlar ekranından döndükten sonra ActivityResultLauncher geri çağırması, ViewModel'deki bir işlevi tetikleyerek rol durumunu günceller. Böylece kullanıcı arayüzü, uygulamanın artık varsayılan olup olmadığını doğru şekilde yansıtır.
Notlar rolünü uygulamanıza nasıl entegre edeceğinizi Not alma uygulaması oluşturma rehberimizden öğrenebilirsiniz.
Cahier, Lenovo tabletlerde varsayılan not alma uygulaması olarak kayan pencerede başlatılıyor
Önemli bir adım: Lenovo, notlar rolünü etkinleştiriyor
Büyük ekran Android cihazlarda üretkenlik konusunda önemli bir adım attığımızı duyurmaktan heyecan duyuyoruz: Lenovo, Android 15 ve sonraki sürümlerin yüklü olduğu tabletlerde Notlar Rolü desteğini etkinleştirdi. Bu güncellemeyle birlikte, not alma uygulamalarınızı güncelleyerek uyumlu Lenovo cihazları olan kullanıcıların bu uygulamaları varsayılan olarak ayarlamasına izin verebilirsiniz. Böylece, kilit ekranından sorunsuz erişim sağlayabilir ve sistem düzeyinde içerik yakalama özelliklerinin kilidini açabilirsiniz.
Önde gelen bir OEM'nin bu taahhüdü, notların Android'de gerçekten entegre ve verimli bir kullanıcı deneyimi sunmadaki artan önemini gösteriyor.
Aynı anda çalışan birden çok kopya, çoklu pencere ve pencereli görüntüleme
Büyük ekranda üretkenlik, bilgi ve iş akışlarını verimli bir şekilde yönetmekle ilgilidir. Bu nedenle Cahier, Android'in gelişmiş pencere özelliklerini tam olarak destekleyecek şekilde tasarlanmıştır ve kullanıcı ihtiyaçlarına uyum sağlayan esnek bir çalışma alanı sunar. Uygulama şunları destekler:
- Çoklu pencere: Bölünmüş ekran veya serbest biçim modunda başka bir uygulamayla birlikte çalışabilme. Bu, Cahier'de not alırken bir web sayfasına referans verme gibi görevler için gereklidir.
- Aynı anda çalışan birden çok kopya: Gerçek çoklu görev deneyimi burada kendini gösterir. Cahier, kullanıcıların uygulamanın birden fazla bağımsız penceresini aynı anda açmasına olanak tanır. İki farklı notu yan yana karşılaştırdığınızı veya bir pencerede çizim yaparken başka bir penceredeki metin notuna başvurduğunuzu düşünün. Cahier, her biri kendi durumuna sahip bu ayrı örneklerin nasıl yönetileceğini göstererek uygulamanızı güçlü ve çok yönlü bir araca dönüştürüyor.
- Pencereli görüntüleme: Android masaüstü modu, harici bir ekrana bağlandığında tableti veya katlanabilir cihazı bir iş istasyonuna dönüştürür. Cahier, uyarlanabilir bir kullanıcı arayüzüyle oluşturulduğu ve aynı anda çalışan birden çok kopyayı desteklediği için bu ortamda mükemmel bir performans gösterir. Kullanıcılar, tıpkı geleneksel bir masaüstünde olduğu gibi birden fazla Cahier penceresini açabilir, yeniden boyutlandırabilir ve konumlandırabilir. Bu sayede, daha önce mobil cihazlarda mümkün olmayan karmaşık iş akışları gerçekleştirilebilir.
Pixel Tablet'te masaüstü pencere modunda çalışan Cahier
Bu özellikleri Cahier'de nasıl uyguladığımızı aşağıda bulabilirsiniz:
Aynı anda çalışan birden çok kopyayı etkinleştirmek için öncelikle PROPERTY_SUPPORTS_MULTI_INSTANCE_SYSTEM_UI özelliğini AndroidManifest içindeki MainActivity bildirimine ekleyerek uygulamanın birden fazla kez başlatılmayı desteklediğini sisteme bildirmemiz gerekiyordu:
<activity android:name="com.example.cahier.MainActivity" android:exported="true" android:label="@string/app_name" android:theme="@style/Theme.MyApplication" android:showWhenLocked="true" android:turnScreenOn="true" android:resizeableActivity="true" android:launchMode="singleInstancePerTask"> <property android:name="android.window.PROPERTY_SUPPORTS_MULTI_INSTANCE_SYSTEM_UI" android:value="true"/> ... </activity>
Ardından, uygulamanın yeni bir örneğini başlatma mantığını uyguladık. CahierHomeScreen.kt dosyasında, bir kullanıcı notu yeni bir pencerede açmayı seçtiğinde, sisteme yeni etkinlik başlatma işleminin nasıl ele alınacağı konusunda talimat veren belirli işaretlere sahip yeni bir Intent oluşturuyoruz. FLAG_ACTIVITY_NEW_TASK, FLAG_ACTIVITY_MULTIPLE_TASK ve FLAG_ACTIVITY_LAUNCH_ADJACENT tuşlarının kombinasyonu, notun mevcut pencerenin yanında yeni ve ayrı bir pencerede açılmasını sağlar.
fun openNewWindow(activity: Activity?, note: Note) {
val intent = Intent(activity, MainActivity::class.java)
intent.putExtra(AppArgs.NOTE_TYPE_KEY, note.type)
intent.putExtra(AppArgs.NOTE_ID_KEY, note.id)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_MULTIPLE_TASK or
Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT
activity?.startActivity(intent)
}Çoklu pencere modunu desteklemek için Manifest'in <activity> veya <application> öğesini ayarlayarak uygulamada yeniden boyutlandırmanın desteklendiğini sisteme bildirmemiz gerekiyordu.
<activity android:name="com.example.cahier.MainActivity" android:resizeableActivity="true" ...> </activity>
Kullanıcı arayüzünün Material 3 uyarlanabilir kitaplığıyla oluşturulması, Android'in bölünmüş ekran modu gibi çok pencereli senaryolarda sorunsuz bir şekilde uyarlanmasını sağlar.
Kullanıcı deneyimini iyileştirmek için sürükle ve bırak özelliğini ekledik. Bunu Cahier'de nasıl uyguladığımızı aşağıda görebilirsiniz.
Sürükleme ve bırakma
Gerçekten üretken veya yaratıcı bir uygulama tek başına çalışmaz, cihazın ekosisteminin geri kalanıyla sorunsuz bir şekilde etkileşime girer. Sürükle ve bırak özelliği, özellikle kullanıcıların genellikle birden fazla uygulama penceresinde çalıştığı büyük ekranlarda bu etkileşimin temelini oluşturur. Cahier, hem içerik ekleme hem de paylaşma için sezgisel sürükle ve bırak işlevini uygulayarak bu yaklaşımı tamamen benimser.
- Kolay İçe Aktarma: Kullanıcılar, diğer uygulamalardan (ör. web tarayıcısı, fotoğraf galerisi veya dosya yöneticisi) görüntüleri sürükleyip doğrudan not tuvaline bırakabilir. Bu işlem için Cahier, bırakma bölgesini tanımlamak, uyumlu içeriği (ör.
image/*) kontrol etmek ve gelen URI'yi işlemek üzere dragAndDropTarget değiştiricisini kullanır. - Kolay paylaşım: Cahier'deki içerikler, diğer uygulamalardaki içerikler kadar kolay paylaşılabilir. Kullanıcılar, metin notundaki bir resme veya çizim notu ile resim kompozitinin tamamına uzun basıp başka bir uygulamaya sürükleyebilir.
Teknik olarak ayrıntılı inceleme: Çizim tuvalinden sürükleme
Çizim tuvalinde sürükleme hareketini uygulamak benzersiz bir zorluktur. DrawingSurface'imizde, canlı çizim girişini (Ink API'nin InProgressStrokes'u) işleyen composable'lar ve sürükleme işlemini başlatmak için uzun basma hareketini algılayan Box, kardeş composable'lardır.
Varsayılan olarak, Jetpack Compose işaretçi girişi sistemi, yalnızca bir kardeş composable'ın (bildirim sırasındaki ilk ve dokunma konumuyla çakışan) etkinliği alacağı şekilde tasarlanmıştır. Cahier örneğinde, sürükle ve bırak giriş işleme mantığımızın, InProgressStrokes composable'ı çizim için kullanılmamış tüm girişleri kullanıp bu girişleri tüketmeden önce çalışıp girişleri tüketme ihtimali olmasını istiyoruz. Öğeleri doğru sıraya yerleştirmezsek Box'ımız sürükleme işlemini başlatmak için uzun basma hareketini algılamaz veya InProgressStrokes çizim için girişi almaz.
Bu sorunu çözmek için özel bir pointerInputWithSiblingFallthrough değiştirici oluşturduk ve composable kodda Box öğemizi bu değiştiriciyi kullanarak InProgressStrokes öğesinden önce yerleştirdik. Bu yardımcı program, standart pointerInput sistemi etrafındaki ince bir sarmalayıcıdır ancak kritik bir değişiklikle birlikte gelir: sharePointerInputWithSiblings() işlevini geçersiz kılarak true değerini döndürür. Bu, Compose çerçevesine, işaretçi etkinliklerinin tüketildikten sonra bile kardeş composable'lara geçmesine izin vermesini söyler.
internal fun Modifier.pointerInputWithSiblingFallthrough(
pointerInputEventHandler: PointerInputEventHandler
) = this then PointerInputSiblingFallthroughElement(pointerInputEventHandler)
private class PointerInputSiblingFallthroughModifierNode(
pointerInputEventHandler: PointerInputEventHandler
) : PointerInputModifierNode, DelegatingNode() {
var pointerInputEventHandler: PointerInputEventHandler
get() = delegateNode.pointerInputEventHandler
set(value) {
delegateNode.pointerInputEventHandler = value
}
val delegateNode = delegate(
SuspendingPointerInputModifierNode(pointerInputEventHandler)
)
override fun onPointerEvent(
pointerEvent: PointerEvent,
pass: PointerEventPass,
bounds: IntSize
) {
delegateNode.onPointerEvent(pointerEvent, pass, bounds)
}
override fun onCancelPointerInput() {
delegateNode.onCancelPointerInput()
}
override fun sharePointerInputWithSiblings() = true
}
private data class PointerInputSiblingFallthroughElement(
val pointerInputEventHandler: PointerInputEventHandler
) : ModifierNodeElement<PointerInputSiblingFallthroughModifierNode>() {
override fun create() = PointerInputSiblingFallthroughModifierNode(pointerInputEventHandler)
override fun update(node: PointerInputSiblingFallthroughModifierNode) {
node.pointerInputEventHandler = pointerInputEventHandler
}
override fun InspectorInfo.inspectableProperties() {
name = "pointerInputWithSiblingFallthrough"
properties["pointerInputEventHandler"] = pointerInputEventHandler
}
}DrawingSurface'da nasıl kullanıldığı aşağıda açıklanmıştır:
Box(
modifier = Modifier
.fillMaxSize()
// Our custom modifier enables this gesture to coexist with the drawing input.
.pointerInputWithSiblingFallthrough {
detectDragGesturesAfterLongPress(
onDragStart = { onStartDrag() },
onDrag = { _, _ -> /* consume drag events */ },
onDragEnd = { /* No action needed */ }
)
}
)
// The Ink API's composable for live drawing sits here as a sibling.
InProgressStrokes(...)Bu işlem sayesinde sistem, hem çizim darbelerini hem de uzun basma ve sürükleme hareketini aynı anda doğru şekilde algılar. Sürükleme işlemi başlatıldığında FileProvider ile paylaşılabilir bir content:// URI oluşturur ve view.startDragAndDrop() kullanarak URI'yi sistemin sürükle ve bırak çerçevesine iletiriz. Bu çözüm, katmanlı kullanıcı arayüzlerindeki karmaşık hareket çakışmalarının nasıl giderileceğini göstererek sağlam ve sezgisel bir kullanıcı deneyimi sağlar.
Modern mimariyle inşa edildi
Cahier, belirli API'lerin yanı sıra yüksek kaliteli ve uyarlanabilir uygulamalar oluşturmak için önemli mimari kalıpları da gösterir.
Sunum katmanı: Jetpack Compose ve uyarlanabilirlik
Sunum katmanı tamamen Jetpack Compose ile oluşturulur. Belirtildiği gibi Cahier, kullanıcı arayüzü uyarlanabilirliği için material3-adaptive kitaplığını kullanır. Durum yönetimi, not bilgilerini ve kullanıcı arayüzü durumunu tutan veri kapsayıcıları olarak kullanılan ViewModel örnekleriyle birlikte katı bir Tek Yönlü Veri Akışı (UDF) modelini izler.
Veri katmanı: depolar ve Room
Cahier, veri katmanı için tüm veri işlemlerini soyutlamak üzere bir NoteRepository arayüzü kullanır. Bu tasarım tercihi, uygulamanın yerel bir veri kaynağı (Room) ile gelecekteki olası bir uzak arka uç arasında sorunsuz bir şekilde geçiş yapmasına olanak tanır. Not düzenleme gibi bir işlem için veri akışı basittir:
- Jetpack Compose kullanıcı arayüzü, ViewModel'deki bir yöntemi tetikler.
- ViewModel, notu NoteRepository'den getirir, mantığı işler ve güncellenen notu depoya geri iletir.
- NoteRepository, güncellemeyi bir Room veritabanına kaydeder.
Kapsamlı giriş desteği
Bir uygulamanın gerçek bir üretkenlik merkezi olabilmesi için çeşitli giriş yöntemlerini kusursuz bir şekilde işlemesi gerekir. Cahier, büyük ekran giriş yönergelerine uygun olacak şekilde tasarlanmıştır ve şunları destekler:
- Ekran kalemi: Ink API ile entegrasyon, avuç içiyle dokunmayı reddetme, notlar rolü için kayıt, metin alanlarına ekran kalemiyle giriş ve tam ekran modu.
- Klavye: En yaygın klavye kısayolları ve kombinasyonları (ör. Ctrl+tıklama, Meta+tıklama) desteklenir ve klavye odağı net bir şekilde belirtilir.
- Fare ve dokunmatik yüzey: Sağ tıklama ve fareyle üzerine gelme durumları desteklenir.
Gelişmiş klavye, fare ve dokunmatik yüzey etkileşimleri için destek, daha fazla iyileştirme için önemli bir odak noktasıdır.
Hemen başlayın
Cahier'in bir sonraki harika uygulamanız için bir başlangıç noktası olmasını umuyoruz. Bu uygulamayı, uyarlanabilir bir kullanıcı arayüzünü, Ink ve notlar rolü gibi güçlü API'leri ve modern, uyarlanabilir bir mimariyi birleştirmenin nasıl yapılacağını gösteren kapsamlı bir açık kaynaklı kaynak olarak oluşturduk.
Başlamaya hazır mısınız?
- Kodu keşfedin: Cahier kod tabanını keşfetmek ve tasarım ilkelerini uygulamada görmek için GitHub depomuza gidin.
- Kendi uygulamanızı oluşturun: Cahier'i kendi not alma, doküman işaretleme veya yaratıcı uygulamanızın temeli olarak kullanın.
- Katkıda bulunma: Katkılarınızı bekliyoruz. Cahier'i Android geliştirici topluluğu için daha da iyi bir kaynak haline getirmemize yardımcı olun.
Resmi geliştirici kılavuzlarını inceleyin ve yeni nesil üretkenlik ve yaratıcılık uygulamanızı bugün geliştirmeye başlayın. Neler üreteceğinizi görmek için sabırsızlanıyoruz.
Okumaya devam edin
-
"Nasıl yapılır?" rehberleri
Aşırı pilin hızlı tükenmesinin Android kullanıcıları için akla ilk gelen sorunlardan biri olduğunun farkında olan Google, geliştiricilerin daha az güç tüketen uygulamalar geliştirmesine yardımcı olmak için önemli adımlar atmaktadır.
Alice Yuan • Okuma süresi: 8 dk.
-
"Nasıl yapılır?" rehberleri
Hem cihaz üzerinde hem de bulut modellerini kullanan yapay zeka destekli özelliklerin örneklerini sunarak kullanıcılarınız için keyifli deneyimler oluşturmanıza ilham vermek istedik.
Thomas Ezan, Ivy Knight • Okuma süresi: 2 dakika
-
"Nasıl yapılır?" rehberleri
Performans dengeleme kılavuzunda 5 seviye bulunur. En az benimseme çabası gerektiren performans araçlarını tanıtan 1. seviyeden başlayıp özel bir performans çerçevesini koruyacak kaynaklara sahip uygulamalar için ideal olan 5. seviyeye kadar ilerleyeceğiz.
Alice Yuan • Okuma süresi: 9 dakika
Gelişmelerden haberdar olun
Android geliştirmeyle ilgili en son analizleri her hafta gelen kutunuza alın.