功能與 API

Android 16 為開發人員推出了強大的新功能和 API。以下各節會簡要說明這些功能,協助您開始使用相關 API。

如需新增、修改及移除 API 的詳細清單,請參閱 API 差異比較表。如要進一步瞭解新的 API,請參閱 Android API 參考資料 - 新的 API 會醒目顯示,以利於查看。

此外,也請查看平台變更可能對應用程式造成的影響。詳情請參閱下列頁面:

核心功能

Android 包含可擴充 Android 系統核心功能的新 API。

2025 年推出兩項 Android API

  • 這個預覽版適用於下一個 Android 主要版本,預計於 2025 年第 2 季推出。這個版本與我們過去的所有 API 版本類似,我們可以進行預定的行為變更,這些變更通常與 targetSdkVersion 相關。
  • 我們預計將主要版本提前一個季發布 (第 2 季,而非以往的第 3 季),以便與生態系統中的裝置推出時程保持一致,讓更多裝置能盡早取得主要的 Android 版本。由於主要版本將於第 2 季推出,您需要比往年提早幾個月進行年度相容性測試,確保應用程式已準備就緒。
  • 我們預計在 2025 年第 4 季推出另一個版本,其中也會納入新的開發人員 API。2025 年唯一會納入可能影響應用程式的行為變更計畫的版本,就是第 2 季主要版本。

除了新的開發人員 API,第 4 季次要版本還會推出功能更新、最佳化和錯誤修正,但不會包含任何會影響應用程式的行為變更。

2025 年 Android 版本的時間軸檢視畫面,請注意,25Q2 版本是主要版本,25Q4 版本是次要版本。

我們會持續每季發布 Android 版本。在 API 版本之間,第 1 季和第 3 季的更新會提供漸進式更新,有助確保持續提供高品質服務。我們正積極與裝置合作夥伴合作,盡可能讓 Q2 版本適用於更多裝置。

使用主要和次要版本的新 API

今天,您可以使用 SDK_INT 常數搭配 VERSION_CODES,保護含有 API 級別檢查的程式碼區塊。我們會持續為主要的 Android 版本提供支援。

if (SDK_INT >= VERSION_CODES.BAKLAVA) {
  // Use APIs introduced in Android 16
}

新的 SDK_INT_FULL 常數可用於針對主要和次要版本進行 API 檢查,並搭配新的 VERSION_CODES_FULL 列舉。

if (SDK_INT_FULL >= VERSION_CODES_FULL.[MAJOR or MINOR RELEASE]) {
  // Use APIs introduced in a major or minor release
}

您也可以使用 Build.getMinorSdkVersion() 方法,只取得 SDK 子版本。

val minorSdkVersion = Build.getMinorSdkVersion(VERSION_CODES_FULL.BAKLAVA)

這些 API 尚未定案,且可能有所變動,因此如果您有任何疑慮,請提供意見回饋

使用者體驗和系統 UI

Android 16 可讓應用程式開發人員和使用者進一步控管及彈性設定裝置,以符合自身需求。

以進度為主的通知

Android 16 引入了以进度为中心的通知,可帮助用户顺畅地跟踪用户发起的端到端历程。

Notification.ProgressStyle 是一种新的通知样式,可让您创建以进度为中心的通知。主要用例包括共享车辆、送货和导航。在 Notification.ProgressStyle 类中,您可以使用细分来表示用户体验历程中的状态和里程碑。

To learn more, see the Progress-centric notifications documentation page.

在螢幕鎖定畫面上顯示以進度為主的通知。
通知欄中顯示以進度為主的通知。

預測返回更新

Android 16 新增了新的 API,可協助您在手勢導覽 (例如返回主畫面動畫) 中啟用預測返回系統動畫。使用新的 PRIORITY_SYSTEM_NAVIGATION_OBSERVER 註冊 onBackInvokedCallback,即可在系統處理返回導覽時讓應用程式接收一般 onBackInvoked 呼叫,且不會影響一般返回導覽流程。

Android 16 也新增了 finishAndRemoveTaskCallback()moveTaskToBackCallback。只要將這些回呼註冊至 OnBackInvokedDispatcher,系統就能在使用者執行返回手勢時觸發特定行為,並播放相應的提前動畫。

更豐富的觸覺回饋

自诞生之日起,Android 就提供了对触感反馈致动器的控制。

Android 11 添加了对更复杂的触感反馈效果的支持,更高级的致动器可以通过设备定义的语义基元 VibrationEffect.Compositions 支持这些效果。

Android 16 添加了触感反馈 API,让应用能够定义触感反馈效果的振幅和频率曲线,同时抽象出设备功能之间的差异。

開發人員工作效率和工具

我們致力於改善您的工作效率,因此大部分工作都圍繞在 Android StudioJetpack ComposeAndroid Jetpack 程式庫等工具。不過,我們也會持續尋找平台上的各種方法,協助您實現願景。

動態桌布的內容處理方式

在 Android 16 中,动态壁纸框架将获得一个新的 content API,以应对由用户驱动的动态壁纸带来的挑战。目前,包含用户提供的内容的实时壁纸需要复杂的服务专用实现。Android 16 引入了 WallpaperDescriptionWallpaperInstance。借助 WallpaperDescription,您可以识别同一服务中的动态壁纸的不同实例。例如,如果某张壁纸同时在主屏幕和锁定屏幕上显示,则这两种情况下显示的内容可能各不相同。壁纸选择器和 WallpaperManager 会使用此元数据更好地向用户呈现壁纸,从而简化创建多样化个性化动态壁纸体验的过程。

效能和電池

Android 16 推出多項 API,可協助您收集應用程式的深入分析資訊。

系統觸發的剖析

ProfilingManager was added in Android 15, giving apps the ability to request profiling data collection using Perfetto on public devices in the field. However, since this profiling must be started from the app, critical flows such as startups or ANRs would be difficult or impossible for apps to capture.

To help with this, Android 16 introduces system-triggered profiling to ProfilingManager. Apps can register interest in receiving traces for certain triggers such as cold start reportFullyDrawn or ANRs, and then the system starts and stops a trace on the app's behalf. After the trace completes, the results are delivered to the app's data directory.

ApplicationStartInfo 中的啟動元件

ApplicationStartInfo was added in Android 15, allowing an app to see reasons for process start, start type, start times, throttling, and other useful diagnostic data. Android 16 adds getStartComponent() to distinguish what component type triggered the start, which can be helpful for optimizing the startup flow of your app.

更深入瞭解工作

JobScheduler#getPendingJobReason() API 會傳回工作可能處於待處理狀態的原因。不過,工作可能會因多種原因而處於待處理狀態。

在 Android 16 中,我們推出了全新的 API JobScheduler#getPendingJobReasons(int jobId),可傳回工作處於待處理狀態的多種原因,包括開發人員設定的明確限制,以及系統設定的隱含限制。

我們也推出 JobScheduler#getPendingJobReasonsHistory(int jobId),可傳回最新約束條件變更的清單。

建議您使用 API 來偵測工作未執行的原因,特別是當您發現特定工作成功率降低,或特定工作完成時間延遲時,就需要進行偵錯。例如,在背景更新小工具時發生錯誤,或是在應用程式啟動前無法呼叫預先擷取工作。

這也能協助您進一步瞭解,某些工作是否因系統定義的限制而無法完成,而非明確設定的限制。

自動調整刷新率

在 Android 15 中推出的適應性重新整理率 (ARR) 可讓支援硬體的螢幕重新整理率,透過獨立的 VSync 步驟調整至內容影格速率。這麼做可降低耗電量,同時避免需要切換模式,進而導致卡頓現象。

Android 16 在還原 getSupportedRefreshRates() 時,會引入 hasArrSupport()getSuggestedFrameRate(int),讓應用程式更容易利用 ARR。RecyclerView 1.4從彈跳或平滑捲動中進行調整時,會在內部支援 ARR,我們也持續致力於將 ARR 支援功能加入更多 Jetpack 程式庫。這篇關於影格速率的文章介紹許多可用來設定影格速率的 API,讓應用程式能直接使用 ARR。

ADPF 中的 Headroom API

The SystemHealthManager introduces the getCpuHeadroom and getGpuHeadroom APIs, designed to provide games and resource-intensive apps with estimates of available CPU and GPU resources. These methods offer a way for you to gauge how your app or game can best improve system health, particularly when used in conjunction with other Android Dynamic Performance Framework (ADPF) APIs that detect thermal throttling.

By using CpuHeadroomParams and GpuHeadroomParams on supported devices, you can customize the time window used to compute the headroom and select between average or minimum resource availability. This can help you reduce your CPU or GPU resource usage accordingly, leading to better user experiences and improved battery life.

無障礙設定

Android 16 新增了無障礙 API 和功能,可協助您為所有使用者提供應用程式。

改良的無障礙 API

Android 16 新增了其他 API,可強化使用者介面語意,協助依賴無障礙服務 (例如 TalkBack) 的使用者提升一致性。

加外框的文字,可盡可能提高文字對比度

低視力使用者通常對對比敏感度較低,因此很難從背景中辨識物體。為協助這類使用者,Android 16 引進了外框文字,取代高對比文字,這項功能會在文字周圍繪製較大的對比區域,大幅提升易讀性。

Android 16 包含新的 AccessibilityManager API,可讓應用程式檢查註冊事件監聽器,瞭解是否已啟用此模式。這項功能主要適用於 Compose 等 UI 工具包,可提供類似的視覺體驗。如果您維護 UI 工具包程式庫,或應用程式執行會略過 android.text.Layout 類別的自訂文字算繪作業,則可使用此方法瞭解何時啟用輪廓文字。

在 Android 16 推出新外框文字無障礙功能前後,具有強化對比度的文字

新增至 TtsSpan 的時間長度

Android 16 會使用 TYPE_DURATION 擴充 TtsSpan,其中包含 ARG_HOURSARG_MINUTESARG_SECONDS。這可讓您直接註解時間長度,確保 TalkBack 等服務能提供準確且一致的文字轉語音輸出內容。

支援含有多個標籤的元素

Android 目前允許 UI 元素從其他元素衍生無障礙標籤,現在則提供多個標籤的關聯功能,這也是網路內容的常見情境。在 AccessibilityNodeInfo 中導入以清單為基礎的 API,Android 即可直接支援這些多標籤關係。在本次異動中,我們已淘汰 AccessibilityNodeInfo#setLabeledBy#getLabeledBy,改用 #addLabeledBy#removeLabeledBy#getLabeledByList

改善對可展開元素的支援

Android 16 新增了無障礙 API,可讓您傳達互動元素 (例如選單和可展開清單) 的展開或收合狀態。您可以使用 setExpandedState 設定展開狀態,並搭配 CONTENT_CHANGE_TYPE_EXPANDED 內容變更類型調度 TYPE_WINDOW_CONTENT_CHANGED AccessibilityEvents,確保 TalkBack 等螢幕閱讀器會宣告狀態變更,提供更直覺且全面的使用者體驗。

不確定進度列

Android 16 新增了 RANGE_TYPE_INDETERMINATE,讓您可以為確定和不確定的 ProgressBar 小工具公開 RangeInfo,讓 TalkBack 等服務能更一致地提供進度指標的意見回饋。

三態核取方塊

Android 16 中的新 AccessibilityNodeInfo getCheckedsetChecked(int) 方法現在除了支援「已勾選」和「未勾選」之外,也支援「部分勾選」狀態。這會取代已淘汰的布林值 isCheckedsetChecked(boolean)

補充說明

無障礙服務說明 ViewGroup 時,會結合其子項檢視畫面的內容標籤。如果您為 ViewGroup 提供 contentDescription,無障礙服務會假設您也要覆寫無法聚焦的子項檢視畫面的說明。如果您想標示下拉式選單 (例如「字型系列」),同時保留現有無障礙選項 (例如「Roboto」),這可能會造成問題。Android 16 新增了 setSupplementalDescription,讓您可以提供文字,提供 ViewGroup 的相關資訊,而不會覆寫其子項的資訊。

必填表單欄位

Android 16 會將 setFieldRequired 新增至 AccessibilityNodeInfo,讓應用程式可向無障礙服務指出表單欄位需要輸入內容。對於填寫各種表單的使用者來說,這都是重要的情境,即使是像條款和條件核取方塊這類簡單的項目,也能協助使用者一貫地識別並快速瀏覽必要欄位。

使用 LE Audio 助聽器時,將手機設為語音通話的麥克風輸入裝置

Android 16 新增了 LE Audio 助聽器功能,使用者可在助聽器內建麥克風和手機麥克風之間切換,以便進行語音通話。這項功能在吵雜的環境或其他助聽器麥克風效能不佳的情況下特別實用。

控制 LEA 助聽器的環境音量

Android 16 adds the capability for users of LE Audio hearing aids to adjust the volume of ambient sound that is picked up by the hearing aid's microphones. This can be helpful in situations where background noise is too loud or too quiet.

相機

Android 16 強化了對專業相機使用者的支援,可進行混合式自動曝光,並精確調整色溫和色調。新的夜間模式指標可協助應用程式瞭解何時該切換至夜間模式攝影工作階段,以及何時該切換回來。新的 Intent 動作可讓您更輕鬆地拍攝動態相片,我們也持續改良 Ultra HDR 相片,支援 HEIC 編碼和 ISO 21496-1 草案標準的新參數。

混合式自動曝光

Android 16 adds new hybrid auto-exposure modes to Camera2, allowing you to manually control specific aspects of exposure while letting the auto-exposure (AE) algorithm handle the rest. You can control ISO + AE, and exposure time + AE, providing greater flexibility compared to the current approach where you either have full manual control or rely entirely on auto-exposure.

fun setISOPriority() {
    // ... (Your existing code before the snippet) ...

    val availablePriorityModes = mStaticInfo.characteristics.get(
        CameraCharacteristics.CONTROL_AE_AVAILABLE_PRIORITY_MODES
    )

    // ... (Your existing code between the snippets) ...

    // Turn on AE mode to set priority mode
    reqBuilder.set(
        CaptureRequest.CONTROL_AE_MODE,
        CameraMetadata.CONTROL_AE_MODE_ON
    )
    reqBuilder.set(
        CaptureRequest.CONTROL_AE_PRIORITY_MODE,
        CameraMetadata.CONTROL_AE_PRIORITY_MODE_SENSOR_SENSITIVITY_PRIORITY
    )
    reqBuilder.set(
        CaptureRequest.SENSOR_SENSITIVITY,
        TEST_SENSITIVITY_VALUE
    )
    val request: CaptureRequest = reqBuilder.build()

    // ... (Your existing code after the snippet) ...
}

精確調整色溫和色調

Android 16 增加了对相机的精细色温和色调调整的支持,以更好地支持专业视频录制应用。在较低版本的 Android 中,您可以通过 CONTROL_AWB_MODE 控制白平衡设置,其中包含仅限于预设列表的选项,例如白炽灯多云黄昏COLOR_CORRECTION_MODE_CCT 可让您使用 COLOR_CORRECTION_COLOR_TEMPERATURECOLOR_CORRECTION_COLOR_TINT 根据相关色温精确调整白平衡。

fun setCCT() {
    // ... (Your existing code before this point) ...

    val colorTemperatureRange: Range<Int> =
        mStaticInfo.characteristics[CameraCharacteristics.COLOR_CORRECTION_COLOR_TEMPERATURE_RANGE]

    // Set to manual mode to enable CCT mode
    reqBuilder[CaptureRequest.CONTROL_AWB_MODE] = CameraMetadata.CONTROL_AWB_MODE_OFF
    reqBuilder[CaptureRequest.COLOR_CORRECTION_MODE] = CameraMetadata.COLOR_CORRECTION_MODE_CCT
    reqBuilder[CaptureRequest.COLOR_CORRECTION_COLOR_TEMPERATURE] = 5000
    reqBuilder[CaptureRequest.COLOR_CORRECTION_COLOR_TINT] = 30

    val request: CaptureRequest = reqBuilder.build()

    // ... (Your existing code after this point) ...
}

以下示例展示了应用不同色温和色调调整后的照片效果:

未应用色温或色调调整的原始图片。
将色温调整为 3000 的图片。
将色温调整为 7000 的图片。


将色调级别降低 50 的图片。
色调级别提高了 50 的图片。

相機夜間模式場景偵測

為協助應用程式瞭解何時切換至夜間模式相機工作階段,Android 16 新增了 EXTENSION_NIGHT_MODE_INDICATOR。如果支援,則可在 Camera2 的 CaptureResult 中使用。

這是我們在「Instagram 如何讓使用者拍出令人驚豔的低光照相」網誌文章中,曾簡短提及的即將推出的 API。這篇文章是實用指南,說明如何實作夜間模式,並提供個案研究,說明如何透過應用程式內的相機,分享更多高品質的夜間模式相片。

動態相片拍攝意圖動作

Android 16 adds standard Intent actions — ACTION_MOTION_PHOTO_CAPTURE, and ACTION_MOTION_PHOTO_CAPTURE_SECURE — which request that the camera application capture a motion photo and return it.

You must either pass an extra EXTRA_OUTPUT to control where the image will be written, or a Uri through Intent.setClipData(ClipData). If you don't set a ClipData, it will be copied there for you when calling Context.startActivity(Intent).

An example of a motion photo, showing the still image followed by the motion playback.

UltraHDR 圖片強化

標準動態範圍 (SDR) 與高動態範圍 (HDR) 圖片品質的比較圖。

Android 16 持續致力於透過 UltraHDR 圖片提供令人驚豔的圖像品質。新增對 HEIC 檔案格式中的 UltraHDR 圖片支援。這些圖片會取得 ImageFormat 類型的 HEIC_ULTRAHDR,並包含類似現有 UltraHDR JPEG 格式的內嵌增益圖。我們也正在努力讓 AVIF 支援 UltraHDR,敬請期待。

此外,Android 16 會根據 ISO 21496-1 草稿標準,在 UltraHDR 中實作其他參數,包括取得及設定應套用的增益圖數值空間,以及支援 HDR 編碼的基礎圖片,並使用 SDR 增益圖。

圖形

Android 16 包含最新的圖像改善功能,例如使用 AGSL 自訂圖像效果。

使用 AGSL 製作自訂圖像效果

Android 16 添加了 RuntimeColorFilterRuntimeXfermode,让您可以创作阈值、Sepia 和 Hue Saturation 等复杂效果,并将其应用于绘制调用。从 Android 13 开始,您可以使用 AGSL 创建扩展 Shader 的自定义 RuntimeShader。新 API 反映了这一点,添加了由 AGSL 驱动的 RuntimeColorFilter(用于扩展 ColorFilter)和 Xfermode 效果,让您可以在源像素和目标像素之间实现基于 AGSL 的自定义合成和混合。

private val thresholdEffectString = """
    uniform half threshold;

    half4 main(half4 c) {
        half luminosity = dot(c.rgb, half3(0.2126, 0.7152, 0.0722));
        half bw = step(threshold, luminosity);
        return bw.xxx1 * c.a;
    }"""

fun setCustomColorFilter(paint: Paint) {
   val filter = RuntimeColorFilter(thresholdEffectString)
   filter.setFloatUniform(0.5);
   paint.colorFilter = filter
}

連線能力

Android 16 更新了平台,讓應用程式能使用通訊和無線技術的最新進展。

安全再升級的測距功能

Android 16 在搭载 Wi-Fi 6 的 802.11az 的受支持设备上为 Wi-Fi 位置信息添加了对强大的安全功能的支持,让应用能够将该协议的更高精确性、更高可伸缩性和动态调度与安全增强功能(包括基于 AES-256 的加密和防范中间人攻击)相结合。这样,在近距离使用情形(例如解锁笔记本电脑或车门)时,便可更安全地使用该功能。802.11az 与 Wi-Fi 6 标准集成,可利用其基础架构和功能实现更广泛的采用和更轻松的部署。

一般測距 API

Android 16 includes the new RangingManager, which provides ways to determine the distance and angle on supported hardware between the local device and a remote device. RangingManager supports the usage of a variety of ranging technologies such as BLE channel sounding, BLE RSSI-based ranging, Ultra Wideband, and Wi-Fi round trip time.

隨附裝置管理工具裝置狀態

In Android 16, new APIs are being introduced for binding your companion app service. Service will be bound when BLE is in range and Bluetooth is connected and service will be unbound when BLE is out of range or Bluetooth is disconnected. App will receives a new 'onDevicePresenceEvent()' callback based on various of DevicePresenceEvent. More details can be found in 'startObservingDevicePresence(ObservingDevicePresenceRequest)'.

媒體

Android 16 包含多項功能,可提升媒體體驗。

相片挑選工具改良功能

照片选择器为用户提供了一种安全的内置授权方式,让用户可以向应用授予对本地存储空间和云端存储空间中所选图片和视频的访问权限,而不是对整个媒体库的访问权限。通过 Google 系统更新Google Play 服务组合使用模块化系统组件,该工具向后支持到 Android 4.4(API 级别 19)。只需几行代码即可与相关的 Android Jetpack 库集成。

Android 16 对照片选择器进行了以下改进:

  • 嵌入式照片选择器新 API,可让应用将照片选择器嵌入其视图层次结构中。这样,它就感觉像是应用中更为集成的一部分,同时仍可利用进程隔离功能,让用户能够选择媒体,而无需应用拥有过于宽泛的权限。为了最大限度地提高跨平台版本的兼容性并简化集成,如果您想集成嵌入式照片选择器,则需要使用即将推出的 Android Jetpack 库。
  • 照片选择器中的云搜索新的 API 可让 Android 照片选择器从云端媒体提供商中进行搜索。照片选择器中的搜索功能即将推出。

進階專業影片

Android 16 引入了对高级专业视频 (APV) 编解码器的支持,该编解码器专为专业级高品质视频录制和后期制作而设计。

APV 编解码器标准具有以下特点:

  • 感知上无损的视频画质(接近原始视频画质)
  • 复杂度低且吞吐量高的仅帧内编码(无像素域预测),以更好地支持编辑工作流
  • 支持高比特率范围(最高几十 Gbps),适用于 2K、4K 和 8K 分辨率内容,由轻量级熵编码方案实现
  • 帧平铺,用于沉浸式内容和启用并行编码和解码
  • 支持各种色度采样格式和位深
  • 支持多次解码和重新编码,且不会严重降低视觉质量
  • 支持多视图视频和辅助视频,例如深度、Alpha 和预览
  • 支持 HDR10/10+ 和用户定义的元数据

OpenAPV 项目提供了 APV 的参考实现。Android 16 将实现对 APV 422-10 配置文件的支持,该配置文件提供 YUV 422 色彩采样以及 10 位编码,并且目标比特率最高可达 2 Gbps。

隱私權

Android 16 包含多項功能,可協助應用程式開發人員保護使用者隱私權。

健康資料同步更新

Health Connect adds ACTIVITY_INTENSITY, a data type defined according to World Health Organization guidelines around moderate and vigorous activity. Each record requires the start time, the end time, and whether the activity intensity is moderate or vigorous.

Health Connect also contains updated APIs supporting medical records. This allows apps to read and write medical records in FHIR format with explicit user consent.

Android 版 Privacy Sandbox

Android 16 incorporates the latest version of the Privacy Sandbox on Android, part of our ongoing work to develop technologies where users know their privacy is protected. Our website has more about the Privacy Sandbox on Android developer beta program to help you get started. Check out the SDK Runtime which allows SDKs to run in a dedicated runtime environment separate from the app they are serving, providing stronger safeguards around user data collection and sharing.

安全性

Android 16 包含多項功能,可協助您提升應用程式的安全性及保護應用程式資料。

金鑰共用 API

Android 16 adds APIs that support sharing access to Android Keystore keys with other apps. The new KeyStoreManager class supports granting and revoking access to keys by app uid, and includes an API for apps to access shared keys.

裝置板型規格

Android 16 可讓應用程式充分運用 Android 的板型規格。

電視的標準化影像和音訊品質架構

The new MediaQuality package in Android 16 exposes a set of standardized APIs for access to audio and picture profiles and hardware-related settings. This allows streaming apps to query profiles and apply them to media dynamically:

  • Movies mastered with a wider dynamic range require greater color accuracy to see subtle details in shadows and adjust to ambient light, so a profile that prefers color accuracy over brightness may be appropriate.
  • Live sporting events are often mastered with a narrow dynamic range, but are often watched in daylight, so a profile that preferences brightness over color accuracy can give better results.
  • Fully interactive content wants minimal processing to reduce latency, and wants higher frame rates, which is why many TV's ship with a game profile.

The API allows apps to switch between profiles and users to enjoy tuning supported TVs to best suit their content.

國際化

Android 16 新增多項功能,可提升使用者在不同語言環境下的裝置使用體驗。

直書文字

Android 16 添加了对垂直渲染和测量文本的低级支持,以便为库开发者提供基本的垂直书写支持。这对于日语等通常使用竖向书写系统的语言特别有用。Paint 类中添加了一个新标志 VERTICAL_TEXT_FLAG。使用 Paint.setFlags 设置此标志后,Paint 的文本测量 API 将报告垂直进度,而不是水平进度,并且 Canvas 将垂直绘制文本。

val text = "「春は、曙。」"
Box(
    Modifier.padding(innerPadding).background(Color.White).fillMaxSize().drawWithContent {
        drawIntoCanvas { canvas ->
            val paint = Paint().apply { textSize = 64.sp.toPx() }
            // Draw text vertically
            paint.flags = paint.flags or VERTICAL_TEXT_FLAG
            val height = paint.measureText(text)
            canvas.nativeCanvas.drawText(
                text,
                0,
                text.length,
                size.width / 2,
                (size.height - height) / 2,
                paint
            )
        }
    }
) {}

自訂計量系統

Users can now customize their measurement system in regional preferences within Settings. The user preference is included as part of the locale code, so you can register a BroadcastReceiver on ACTION_LOCALE_CHANGED to handle locale configuration changes when regional preferences change.

Using formatters can help match the local experience. For example, "0.5 in" in English (United States), is "12,7 mm" for a user who has set their phone to English (Denmark) or who uses their phone in English (United States) with the metric system as the measurement system preference.

To find these settings, open the Settings app and navigate to System > Languages & region.