Pencereli görüntüleme, kullanıcıların çok yönlü ve masaüstüne benzer bir deneyim için yeniden boyutlandırılabilir uygulama pencerelerinde aynı anda birden fazla uygulama çalıştırmasına olanak tanır.
Şekil 1'de, pencereli görüntüleme etkin durumdayken ekranın düzenini görebilirsiniz. Önemli noktalar:
- Kullanıcılar aynı anda birden fazla uygulamayı yan yana çalıştırabilir.
- Görev çubuğu, çalışan uygulamaları gösteren ekranın alt kısmında sabit bir konumdadır. Kullanıcılar, uygulamaları hızlı erişim için sabitleyebilir.
- Yeni özelleştirilebilir başlık çubuğu, her pencerenin üst kısmını simge durumuna küçültme ve ekranı kaplama gibi kontrollerle süsler.
Android tabletlerde uygulamalar varsayılan olarak tam ekranda açılır. Bir uygulamayı masaüstü pencereli görüntüleme modunda başlatmak için ekranın üst kısmındaki pencere tutma yerine basılı tutun ve tutma yerini Şekil 2'de gösterildiği gibi kullanıcı arayüzünde sürükleyin.
Bir uygulama masaüstü pencereli görüntüleme modunda açıkken diğer uygulamalar da masaüstü pencerelerinde açılır.
Kullanıcılar, pencere tutamacına dokunduklarında veya tutamacı tıkladıklarında pencere tutamacının altında gösterilen menüden ya da Meta tuşu (Windows, Command veya Arama) + Ctrl + Aşağı klavye kısayolunu kullanarak pencereli görüntüleme özelliğini de etkinleştirebilir.
Kullanıcılar, tüm etkin pencereleri kapatarak veya bir masaüstü penceresinin üst kısmındaki pencere tutma yerini tutup uygulamayı ekranın üst kısmına sürükleyerek masaüstü pencere modundan çıkabilir. Meta + H klavye kısayolu da masaüstü pencere modundan çıkar ve uygulamaları tekrar tam ekran olarak çalıştırır.
Masaüstü pencere düzenine dönmek için Son Kullanılanlar ekranında masaüstü alanı kutucuğuna dokunun veya bu kutucuğu tıklayın.
Uygulama düzeninizi masaüstü benzeri bir ortam için optimize etme
Masaüstü deneyimi için tasarım, artan ekran alanı, fare ve klavye girişinin hassasiyeti ve yüksek verimlilik beklentisi nedeniyle mobil tasarımdan önemli ölçüde farklılık gösterebilir.
Jetpack WindowManager, geliştiricilerin genellikle daha yüksek bilgi yoğunluğuna, farklı gezinme kalıplarına ve optimize edilmiş fare etkileşimlerine sahip olan bir masaüstü kullanıcı arayüzünü ne zaman göstereceğine karar vermesine yardımcı olmak için belirli bir API sağlar.
lifecycleScope.launch(Dispatchers.Main) { lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED) { windowInfoTracker.windowEngagementInfo(this@DesktopWindowingActivity) .collect { windowEngagementInfo -> if(windowEngagementInfo.hasEngagementMode(WindowEngagementInfo.EngagementMode.PRECISE_POINTER)){ showDesktopOptimizedUI() }else { showTouchOptimizedUI() } } } }
Daha fazla bilgi edinmek için Masaüstü için tasarım başlıklı makaleyi inceleyin.
Yeniden boyutlandırma ve uyumluluk modu
Masaüstü pencereli görüntüleme modunda, yönü kilitlenmiş uygulamaların boyutu serbestçe ayarlanabilir. Bu nedenle, bir etkinlik dikey yöne kilitlenmiş olsa bile kullanıcılar uygulamayı yatay yönlü bir pencereye yeniden boyutlandırabilir.
Yeniden boyutlandırılamaz olarak beyan edilen uygulamaların (yani resizeableActivity = false) kullanıcı arayüzü, aynı en-boy oranı korunarak ölçeklendirilir.
Yönü kilitleyen veya yeniden boyutlandırılamaz olarak bildirilen kamera uygulamalarının kamera vizörleri için özel bir işlem uygulanır: Pencere tamamen yeniden boyutlandırılabilir ancak vizör aynı en-boy oranını korur. Uygulamaların her zaman dikey veya yatay modda çalıştığını varsayarak, uygulamalar önizleme ya da çekilen resim yönünün veya en-boy oranının yanlış hesaplanmasına yol açan kodlar oluşturur ya da başka varsayımlarda bulunur. Bu durum, resimlerin gerilmesine, yan dönmesine veya baş aşağı görünmesine neden olur.
Uygulamalar tamamen duyarlı kamera vizörlerini uygulamaya hazır olana kadar, özel işlem, yanlış varsayımların neden olabileceği etkileri azaltan daha temel bir kullanıcı deneyimi sunar.
Kamera uygulamaları için uyumluluk modu hakkında daha fazla bilgi edinmek istiyorsanız Cihaz uyumluluğu modu başlıklı makaleyi inceleyin.
Özelleştirilebilir başlık iç kısımları
Pencereli görüntüleme modunda çalışan tüm uygulamaların tam ekran modunda bile başlık çubuğu vardır. Bu çubuğu, uygulamanızın içeriğinin gizlenmesini önlemek ve özel kullanıcı arayüzü öğelerini doğrudan başlık alanına çizmek için özelleştirebilirsiniz.
Uygulama
Başlık çubuğunda özel içerik çizmek için ilk adım, başlık çubuğu arka planını şeffaf hale getirmektir. Bunu, WindowInsetsController ile birlikte APPEARANCE_TRANSPARENT_CAPTION_BAR_BACKGROUND işaretini kullanarak yapabilirsiniz.
window.insetsController?.setSystemBarsAppearance( WindowInsetsController.APPEARANCE_TRANSPARENT_CAPTION_BAR_BACKGROUND, WindowInsetsController.APPEARANCE_TRANSPARENT_CAPTION_BAR_BACKGROUND )
Başlık çubuğu şeffaf hale geldiğinde başlık alanını uygulamanızın tasarımına uygun şekilde biçimlendirebilirsiniz. Çubuğun mevcut olup olmadığını algılamak ve düzeninize uygun yüksekliği veya dolguyu uygulamak için WindowInsets.isCaptionBarVisible öğesini kullanın.
@OptIn(ExperimentalLayoutApi::class) @Composable fun CaptionBar() { if (WindowInsets.isCaptionBarVisible) { Row( modifier = Modifier .windowInsetsTopHeight(WindowInsets.captionBar) .fillMaxWidth() .background(if (isSystemInDarkTheme()) Color.White else Color.Black), horizontalArrangement = Arrangement.Center, verticalAlignment = Alignment.CenterVertically ) { Text( text = "Caption Bar Title", style = MaterialTheme.typography.titleMedium, modifier = Modifier.padding(4.dp) ) } } }
setSystemBarsAppearance(appearance,mask): Sistem çubuklarının görsel stilini yapılandırır. İlk parametre hedef görünüm işaretlerini tanımlarken ikinci parametre, hangi işaretlerin değiştirileceğini kontrol etmek için maske görevi görür.windowInsetsTopHeight(): Composable'ınızın yüksekliğini sistemin başlık çubuğuyla eşleşecek şekilde otomatik olarak ayarlar. Böylece özel arka planınız, piksel değerlerini sabit kodlamadan altyazı alanını doldurur.WindowInsets.captionBar: Masaüstü pencereli görüntüleme kontrollerinin (Kapat, Ekranı kapla vb.) boyutlarını sağlar. Böylece, masaüstü pencereli görüntülemeye girildiğinde veya çıkıldığında kullanıcı arayüzünüzün otomatik olarak ölçeklenmesine ya da gizlenmesine olanak tanır.
Daha fazla bilgi için Pencere iç kenarları hakkında başlıklı makaleyi inceleyin. Başlığa ek olarak, altyazı çubuğunda diğer kullanıcı arayüzü öğelerini (ör. Google Chrome'daki gibi sekmeler, arama çubukları veya profil avatarları) de gösterebilirsiniz.
Kullanıcı arayüzü
Android 15, kullanıcı arayüzünüzün sistem düğmeleriyle çakışmasını önlemek için
WindowInsets#getBoundingRects() yöntemini sunar. Bu yöntem, sistem öğelerinin kapladığı alanları temsil eden Rect nesnelerinin listesini döndürür. Altyazı çubuğunda kalan alan, özel içerikleri güvenle yerleştirebileceğiniz bir güvenli bölgedir.
APPEARANCE_LIGHT_CAPTION_BARS simgesini kullanarak açık ve koyu temalarda sistem altyazı öğelerinin görünümünü değiştirin. Oluşturma'da WindowInsets.Companion.captionBar() veya Görünümler'de WindowInsets.Type.captionBar() simgesini kullanarak ekleri görüntüleyin.
Daha fazla bilgi için Pencere iç kenarları hakkında başlıklı makaleyi inceleyin.
Çoklu görev ve aynı anda çalışan birden çok kopya desteği
Çoklu görev, pencereli görüntülemenin temelinde yer alır. Uygulamanızın birden fazla örneğine izin vermek, kullanıcıların üretkenliğini önemli ölçüde artırabilir.
Android 15'ten itibaren PROPERTY_SUPPORTS_MULTI_INSTANCE_SYSTEM_UI kullanabilirsiniz. Bu özelliği AndroidManifest.xml içinde ayarlayarak sistem kullanıcı arayüzünün, uygulamanın birden fazla örnekte başlatılması için seçenekler (ör. "Yeni Pencere" düğmesi) sunması gerektiğini belirtirsiniz.
<application>
<property
android:name="android.window.PROPERTY_SUPPORTS_MULTI_INSTANCE_SYSTEM_UI"
android:value="true" />
</application>
Not: Masaüstü pencereli görüntüleme ve diğer Çoklu pencere ortamlarında yeni görevler yeni bir pencerede açılır. Bu nedenle, uygulamanız birden fazla görev başlattığında kullanıcı yolculuğunu tekrar kontrol edin.
Sürükleme hareketleriyle uygulama örneklerini yönetme
Çok pencereli modda kullanıcılar, bir kullanıcı arayüzü öğesini (ör. sekme veya doküman) uygulamanın penceresinden dışarı sürükleyerek yeni bir uygulama örneği başlatabilir. Kullanıcılar, aynı uygulamanın farklı örnekleri arasında da öğe taşıyabilir.
Sürükle ve bırak yöntemiyle veri aktarma
Bir composable'ı çoklu örnekli sürükle ve bırak işlemi için sürükleme kaynağı olarak yapılandırmak istiyorsanız (kullanıcıların içeriği uygulamanızın başka bir örneğine sürüklemesine veya içeriği ekranın boş bir alanına bırakarak yeni bir örnek oluşturmasına olanak tanımak için) dragAndDropSource değiştiricisini kullanın. Lambda'sında, aktarılacak verileri içeren ClipData ve aynı anda çalışan birden çok kopya davranışını yapılandırmak için kullanılan işaretleri ileterek DragAndDropTransferData değerini döndürün.
Android 15, masaüstü tarzı pencereli görüntüleme ve aynı anda çalışan birden çok kopya etkileşimleri için iki önemli işaret sunar:
DRAG_FLAG_GLOBAL_SAME_APPLICATION: Bir sürükleme işleminin pencere sınırlarını (aynı uygulamanın birden fazla örneği için) aşabileceğini gösterir. Bu işaret ayarlanmışkenstartDragAndDrop()çağrıldığında, yalnızca aynı uygulamaya ait görünür pencereler sürükleme işlemine katılabilir ve sürüklenen içeriği alabilir.
Modifier.dragAndDropSource { _ -> DragAndDropTransferData( clipData = ClipData.newPlainText("label", "Your data"), flags = View.DRAG_FLAG_GLOBAL_SAME_APPLICATION ) }
DRAG_FLAG_START_INTENT_SENDER_ON_UNHANDLED_DRAG: Kullanıcıların, sürüklenen içeriği ekranın boş bir alanına bırakarak uygulamanızın yeni bir örneğini başlatmasına olanak tanır (başka bir pencere bırakma işlemini gerçekleştirmiyorsa).- Bu işareti kullanırken, işlenmemiş bir bırakma işlemi gerçekleşirse sistemin yeni etkinliği başlatmak için kullandığı
IntentSenderdeğeriniClipData.Item.Builder#setIntentSender()kullanarak sağlamanız gerekir.
- Bu işareti kullanırken, işlenmemiş bir bırakma işlemi gerçekleşirse sistemin yeni etkinliği başlatmak için kullandığı
Modifier.dragAndDropSource { _ -> val intent = Intent.makeMainActivity(activity.componentName).apply { putExtra("EXTRA_ITEM_ID", itemId) flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_MULTIPLE_TASK or Intent.FLAG_ACTIVITY_LAUNCH_ADJACENT } val pendingIntent = PendingIntent.getActivity( activity, 0, intent, PendingIntent.FLAG_IMMUTABLE ) val data = ClipData( "Item $itemId", arrayOf(ClipDescription.MIMETYPE_TEXT_INTENT), ClipData.Item.Builder().setIntentSender(pendingIntent.intentSender).build() ) DragAndDropTransferData( clipData = data, flags = View.DRAG_FLAG_GLOBAL_SAME_APPLICATION or View.DRAG_FLAG_START_INTENT_SENDER_ON_UNHANDLED_DRAG, ) }
Aktarılan verileri alma
Başka bir örnekten gelen verileri kabul etmek için dragAndDropTarget değiştiricisini kullanın.
Veriler farklı bir örnekten veya uygulamadan geliyorsa izinleri açıkça istemeniz gerekir.
Modifier.dragAndDropTarget( shouldStartDragAndDrop = { event -> event.toAndroidDragEvent().clipDescription.hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN) }, target = object : DragAndDropTarget { override fun onDrop(event: DragAndDropEvent): Boolean { requestDragAndDropPermissions(activity, event.toAndroidDragEvent()) val clipData = event.toAndroidDragEvent().clipData val item = clipData?.getItemAt(0)?.text if (item != null) { // Process the dropped text item here } return item != null } } )
Önemli adımlar:
- Filtre: Gelen verilerin (MIME türü) desteklenip desteklenmediğini kontrol etmek için
shouldStartDragAndDropkullanın. - İzinler: Verilere erişmek için
requestDragAndDropPermissions(event)işlevini çağırın. - İşleme:
onDropgeri çağırma işlevindeki verileri ayıklayın.
Ek optimizasyonlar
Uygulama başlatma işlemlerini özelleştirin ve uygulamaları pencereli görüntülemeden tam ekrana geçirin.
Varsayılan boyutu ve konumu belirtme
Yeniden boyutlandırılabilir olsa bile tüm uygulamaların kullanıcı değeri sunmak için büyük bir pencereye ihtiyacı yoktur. Bir etkinlik başlatıldığında varsayılan boyutu ve konumu belirtmek için ActivityOptions#setLaunchBounds() yöntemini kullanabilirsiniz.
Masaüstü alanından tam ekrana geçme
Uygulamalar, Activity#requestFullScreenMode() işlevini çağırarak tam ekran olabilir. Bu yöntem, uygulamayı doğrudan masaüstü pencereli görüntüleme modunda tam ekran olarak gösterir.