Compose Multiplatform 1.6.0の新機能
Compose Multiplatform 1.6.0 リリースにおける主な変更点は以下の通りです。
- 破壊的変更
- リソースAPIの改善と新機能
- iOSアクセシビリティ機能の基本サポート
- 全プラットフォーム向けのUIテストAPI
- ポップアップ、ダイアログ、ドロップダウン向けのプラットフォームビューの分離
- Jetpack ComposeおよびMaterial 3からの変更のマージ
- 安定版でのKotlin/Wasmアーティファクトの利用
- 既知の問題:不足している依存関係
依存関係
このバージョンのCompose Multiplatformは、以下のJetpack Composeライブラリに基づいています。
破壊的変更
lineHeight
が設定されたテキストのパディングがデフォルトでトリミングされるように
LineHeightStyle.Trimのサポートが追加されたことで、Compose Multiplatformはテキストのパディングがトリミングされる方法においてAndroidと整合性が取れるようになりました。 詳細はプルリクエストを参照してください。
これは、1.6.0-alpha01リリースでのcompose.material
の変更に沿ったものです。
includeFontPadding
パラメーターがAndroidでデフォルトでfalse
になりました。 この変更の詳細については、Compose Multiplatformでこのフラグを実装しないことに関する議論を参照してください。- デフォルトの行高スタイルが
Trim.None
とAlignment.Center
に変更されました。Compose Multiplatformは現在LineHeightStyle.Trim
をサポートし、Trim.None
をデフォルト値として実装しています。 Typography
のTextStyle
に明示的なlineHeight
が追加され、これにより次の破壊的変更につながりました。
MaterialTheme
でfontSize
を使用するにはlineHeight
が必要に
これは
material
コンポーネントのみに影響します。material3
にはすでにこの制限がありました。
MaterialTheme
のText
コンポーネントでfontSize
属性を設定し、lineHeight
を含めない場合、実際の行高はフォントに一致するように変更されません。 今後は、対応するfontSize
を設定するたびにlineHeight
属性を明示的に指定する必要があります。
Jetpack Composeは現在、フォントサイズを直接設定しないことを推奨しています。
非標準のテキストサイズをサポートするために、Material Designシステムに従い、フォントサイズを直接変更するのではなく、別のタイプスケールを使用することをお勧めします。 または、
style = LocalTextStyle.current.copy(lineHeight = TextUnit.Unspecified)
のように行高を上書きするか、カスタムのTypography
を完全に作成することもできます。
リソース管理の新しいアプローチ
Compose Multiplatform 1.6.0のプレビューバージョンでリソースAPIを使用していた場合、現行バージョンのドキュメントを参照して慣れてください。1.6.0-beta01で、リソースファイルをプロジェクトコードで利用できるようにするためのプロジェクトフォルダーへの保存方法が変更されました。
プラットフォーム共通
リソースAPIの改善 (全プラットフォーム)
新しい実験的なAPIは、文字列とフォントのサポートを追加し、共通Kotlinでリソースをより快適に共有およびアクセスできるようにします。
- リソースは、特定の用途や制約(ロケール、画像解像度、ダークテーマとライトテーマなど)に合わせて整理でき、以下をサポートします。
- ロケール
- 画像解像度
- ダークテーマとライトテーマ
- Compose Multiplatformは、各プロジェクトに対して
Res
オブジェクトを生成し、リソースに直接アクセスできるようにします。
リソース修飾子の詳細、および新しいリソースAPIの詳細な概要については、画像とリソースを参照してください。
UIテストAPI (実験的、全プラットフォーム)
デスクトップとAndroidではすでに利用可能だったCompose MultiplatformでのUIテスト用の実験的APIが、すべてのプラットフォームでサポートされるようになりました。 フレームワークがサポートするプラットフォーム間でアプリケーションのUIの動作を検証する共通テストを作成し、実行できます。 このAPIは、Jetpack Composeと同じファインダー、アサーション、アクション、マッチャーを使用します。
JUnitベースのテストはデスクトッププロジェクトでのみサポートされています。
セットアップ手順とテスト例については、Compose Multiplatform UIのテストを参照してください。
Jetpack ComposeおよびMaterial 3からの変更 (全プラットフォーム)
Jetpack Compose 1.6.1
Jetpack Composeの最新リリースをマージすることで、すべてのプラットフォームでのパフォーマンスが向上します。 詳細については、Android Developers Blogのアナウンスを参照してください。
このリリースからのその他の注目すべき機能:
- デフォルトのフォントパディングの変更はAndroidターゲットにのみ適用されました。ただし、この変更による副作用を考慮するようにしてください。
- マウス選択は、以前から他のターゲットのCompose Multiplatformでサポートされていました。1.6.0では、Androidも含まれます。
Compose Multiplatformにまだ移植されていないJetpack Composeの機能:
- BasicTextField2
- 非線形フォントスケーリングのサポート
- MultiParagraph.fillBoundingBoxes
- マルチプラットフォームドラッグ&ドロップ。現時点ではAndroidでのみ動作します。デスクトップでは既存のAPIである
Modifier.onExternalDrag
を使用できます。
JetBrainsチームは、Compose Multiplatformの今後のバージョンでこれらの機能を採用することに取り組んでいます。
Compose Material 3 1.2.0
リリースのハイライト:
- 単一選択および複数選択が可能な新しい実験的なコンポーネント
Segmented Button
。 - UIで情報を強調しやすくするために、より多くのサーフェスオプションを備えた拡張されたカラーセット。
- 実装に関する注意:
ColorScheme
オブジェクトはイミュータブルになりました。コードが現在ColorScheme
のカラーを直接変更している場合、カラーを変更するにはcopyメソッドを使用する必要があります。 - 単一のサーフェス値の代わりに、より柔軟なカラー管理のためにサーフェスカラーとサーフェスコンテナーに複数のオプションが用意されました。
- 実装に関する注意:
Material 3の変更点の詳細については、Material Design Blogのリリース記事を参照してください。
ポップアップ、ダイアログ、ドロップダウン向けのプラットフォームビューの分離 (iOS、デスクトップ)
ポップアップ要素(例:ツールチップやドロップダウンメニュー)が、初期のコンポーザブルキャンバスやアプリウィンドウによって制限されないことが重要な場合があります。 これは、コンポーザブルビューが全画面を占有せず、アラートダイアログを生成する必要がある場合に特に重要になります。 1.6.0では、これを確実に実現する方法が提供されています。
ポップアップとダイアログは、依然としてそれら自身の境界(例:最上位コンテナーの影)の外側には何も描画できないことに注意してください。
iOS (Stable)
iOSでは、この機能はデフォルトで有効になっています。 古い動作に戻すには、platformLayers
パラメーターをfalse
に設定します。
ComposeUIViewController(
configure = {
platformLayers = false
}
) {
// your Compose code
}
Desktop (Experimental)
デスクトップでこの機能を使用するには、compose.layers.type
システムプロパティを設定します。 サポートされる値:
WINDOW
:Popup
およびDialog
コンポーネントを独立した装飾のないウィンドウとして作成します。COMPONENT
:Popup
またはDialog
を同じウィンドウ内に独立したSwingコンポーネントとして作成します。これはオフスクリーンレンダリングでのみ機能し、compose.swing.render.on.graphics
をtrue
に設定する必要があります(1.5.0 Compose Multiplatformリリースノートの拡張Swing相互運用セクションを参照)。オフスクリーンレンダリングはComposePanel
コンポーネントでのみ機能し、全画面アプリケーションでは機能しないことに注意してください。
COMPONENT
プロパティを使用するコードの例:
@OptIn(ExperimentalComposeUiApi::class)
fun main() = SwingUtilities.invokeLater {
System.setProperty("compose.swing.render.on.graphics", "true")
System.setProperty("compose.layers.type", "COMPONENT")
val window = JFrame()
window.defaultCloseOperation = WindowConstants.EXIT_ON_CLOSE
val contentPane = JLayeredPane()
contentPane.layout = null
val composePanel = ComposePanel()
composePanel.setBounds(200, 200, 200, 200)
composePanel.setContent {
ComposeContent()
}
composePanel.windowContainer = contentPane // Use the full window for dialogs
contentPane.add(composePanel)
window.contentPane.add(contentPane)
window.setSize(800, 600)
window.isVisible = true
}
@Composable
fun ComposeContent() {
Box(Modifier.fillMaxSize().background(Color.Green)) {
Dialog(onDismissRequest = {}) {
Box(Modifier.size(100.dp).background(Color.Yellow))
}
}
}
Dialog
(黄色)は、親のComposePanel
(緑色)の境界に関係なく完全に描画されます。
テキスト装飾の線スタイルのサポート (iOS、デスクトップ、Web)
Compose Multiplatformでは、PlatformTextStyle
クラスを使用してテキストの下線スタイルを設定できるようになりました。
このクラスは共通ソースセットでは利用できず、プラットフォーム固有のコードで使用する必要があります。
点線の下線スタイルを設定する例:
Text(
"Hello, Compose",
style = TextStyle(
textDecoration = TextDecoration.Underline,
platformStyle = PlatformTextStyle (
textDecorationLineStyle = TextDecorationLineStyle.Dotted
)
)
)
実線、二重幅の実線、点線、破線、波線の線スタイルを使用できます。すべての利用可能なオプションはソースコードで確認できます。
システムにインストールされているフォントへのアクセス (iOS、デスクトップ、Web)
Compose Multiplatformアプリからシステムにインストールされているフォントにアクセスできるようになりました。SystemFont
クラスを使用して、適切なフォントスタイルとフォントウェイトでフォントを読み込みます。
import androidx.compose.ui.text.platform.SystemFont
FontFamily(SystemFont("Menlo", weight = 700))
FontFamily(SystemFont("Times New Roman", FontWeight.Bold))
FontFamily(SystemFont("Webdings"))
デスクトップでは、フォントファミリー名のみを指定して、利用可能なすべてのフォントスタイルをFontFamily
関数で読み込むことができます(詳細な例はコードサンプルを参照)。
FontFamily("Menlo")
iOS
アクセシビリティサポート
iOS版Compose Multiplatformは、障害を持つ人々がネイティブiOS UIと同じレベルの快適さでCompose UIと対話できるようにします。
- スクリーンリーダーとVoiceOverがCompose UIのコンテンツにアクセスできます。
- Compose UIは、ナビゲーションとインタラクションのためにネイティブUIと同じジェスチャーをサポートします。
これは、Compose MultiplatformのセマンティックデータをアクセシビリティサービスとXCTestフレームワークで利用できるようにすることも意味します。
実装とカスタマイズAPIの詳細については、iOSアクセシビリティ機能のサポートを参照してください。
コンポーザブルビューの不透明度変更
ComposeUIViewController
クラスに、ビューの背景の不透明度を透明に変更する設定オプションが追加されました。
透明な背景は、追加のブレンディングステップを必要とするため、パフォーマンスに悪影響を与えます。
val appController = ComposeUIViewController(configure = {
this.opaque = false
}) {
App()
}
透明な背景で実現できることの例:
SelectionContainer
内のテキストのダブルタップとトリプルタップによる選択
以前は、iOS版Compose Multiplatformでは、テキスト入力フィールドでのみ複数のタップによるテキスト選択が可能でした。 今回のバージョンから、SelectionContainer
内のText
コンポーネントに表示されるテキストの選択にも、ダブルタップとトリプルタップジェスチャーが機能するようになりました。
UIViewController
との相互運用
UITabBarController
やUINavigationController
など、UIView
として実装されていない一部のネイティブAPIは、既存の相互運用メカニズムを使用してCompose Multiplatform UIに組み込むことができませんでした。
今回のバージョンから、Compose MultiplatformはUIKitViewController
関数を実装し、ネイティブiOSビューコントローラーをCompose UIに組み込むことを可能にしました。
テキストフィールドにおけるシングルタップ・ロングタップによるネイティブのようなキャレット動作
Compose Multiplatformは、テキストフィールドにおけるネイティブiOSのキャレット動作に近づきました。
- テキストフィールドでのシングルタップ後のキャレットの位置がより正確に決定されます。
- テキストフィールドでのロングタップとドラッグは、Androidのように選択モードに入るのではなく、カーソルを移動させます。
Desktop
改善された相互運用ブレンディングの実験的サポート
以前は、SwingPanel
ラッパーを使用して実装された相互運用ビューは常に長方形であり、常に前面、つまり任意のCompose Multiplatformコンポーネントの上部に表示されていました。 これにより、ポップアップ要素(ドロップダウンメニュー、トースト通知)の使用が困難になっていました。 新しい実装ではこの問題が解決され、以下のユースケースでSwingを利用できるようになりました。
クリッピング。長方形の形状に限定されません。クリップ修飾子とシャドウ修飾子が
SwingPanel
で正しく機能するようになりました。kotlin// Flag necessary to enable the experimental blending System.setProperty("compose.interop.blending", "true") SwingPanel( modifier = Modifier.clip(RoundedCornerShape(6.dp)) //... )
この機能なしでJButton
がクリッピングされる様子が左側に、実験的ブレンディングが右側に示されています。
- オーバーラッピング。
SwingPanel
の上に任意のCompose Multiplatformコンテンツを描画し、通常通り操作することが可能です。 以下の例では、「Snackbar」がクリック可能なOKボタン付きのSwingパネルの上に表示されています。
既知の制限事項と追加の詳細については、プルリクエストの説明を参照してください。
Web
安定版フレームワークでKotlin/Wasmアーティファクトが利用可能に
Compose Multiplatformの安定版は、Kotlin/Wasmターゲットをサポートするようになりました。 1.6.0に切り替えた後、依存関係リストで特定のdev-wasm
バージョンのcompose-ui
ライブラリを指定する必要はありません。
WasmターゲットでCompose Multiplatformプロジェクトをビルドするには、Kotlin 1.9.22以降が必要です。
既知の問題:不足している依存関係
デフォルトのプロジェクト設定で不足する可能性のあるライブラリがいくつかあります。
org.jetbrains.compose.annotation-internal:annotation
またはorg.jetbrains.compose.collection-internal:collection
これらは、ライブラリがCompose Multiplatform 1.6.0-beta02に依存している場合に不足する可能性があります。1.6.0-beta02は1.6.0とバイナリ互換性がありません。 どのライブラリが原因であるかを特定するには、このコマンドを実行してください(
shared
をメインモジュールの名前に置き換えてください)。shell./gradlew shared:dependencies
ライブラリをCompose Multiplatform 1.5.12に依存するバージョンにダウングレードするか、ライブラリの作者にCompose Multiplatform 1.6.0にアップグレードするよう依頼してください。
androidx.annotation:annotation:...
またはandroidx.collection:collection:...
Compose Multiplatform 1.6.0は、Google Mavenリポジトリでのみ利用可能なcollectionおよびannotationライブラリに依存しています。
このリポジトリをプロジェクトで利用可能にするには、モジュールの
build.gradle.kts
ファイルに以下の行を追加してください。kotlinrepositories { //... google() }