Jetpack Compose 1.8 新特性来袭,打造丝滑开发体验

0 阅读15分钟

Jetpack Compose 1.8 新特性来袭,打造丝滑开发体验

Jetpack Compose 1.8 版本更新亮点

Jetpack Compose 1.8 版本的发布,无疑在 Android 开发领域扔下了一颗重磅炸弹,为开发者们带来了一系列令人兴奋的新特性和改进。这次更新涵盖了自动填充、文本优化、可见性追踪以及动画等多个方面,每一项都直击开发者日常痛点,致力于提升应用开发效率与用户体验。

就拿自动填充功能来说,在以往的开发中,实现一个好用的自动填充功能往往需要耗费大量精力,而在 Jetpack Compose 1.8 里,只需简单设置contentType语义,就能轻松实现文本字段的自动填充,极大简化了表单、登录等场景的开发流程。在文本优化方面,新增的自动适配大小和智能省略号特性,让文本在不同屏幕尺寸和复杂内容下都能完美展示,告别文本截断或显示异常的尴尬。可见性追踪功能则为分析用户行为、优化界面性能提供了有力支持,开发者能更精准地了解用户与界面的交互情况 。而动画相关的改进,让动画效果更加流畅自然,还能实现一些之前难以达成的高级动画效果,为用户带来更炫酷的视觉体验。

12 个新特性逐一揭秘

自动填充革命,告别手动输入

在日常使用手机应用时,每次登录都要手动输入冗长的邮箱和密码,着实让人头疼。而 Jetpack Compose 1.8 带来的原生自动填充支持,就像是一位贴心助手,轻松化解了这一难题。

实现这一功能非常简单,只需在文本字段设置contentType语义即可。比如在登录页面,设置用户名和密码字段的contentType分别为ContentType.UsernameContentType.Password ,系统就能自动识别并提供填充建议。当用户点击这些字段时,之前保存的凭据便会自动弹出,一键点击即可完成填充,大大节省了输入时间,降低了出错概率。不仅如此,Compose 还支持处理多种内容类型,甚至能在自动填充发生时获取回调,进一步拓展了其应用场景。


@Composable
fun LoginForm() {
    Column {
        TextField(
            state = rememberTextFieldState(),
            modifier = Modifier.semantics {
                contentType = ContentType.Username
            },
            label = { Text("用户名") }
        )
        TextField(
            state = rememberTextFieldState(),
            modifier = Modifier.semantics {
                contentType = ContentType.Password
            },
            label = { Text("密码") }
        )
        // ... 其他 UI 元素
    }
}

AutoSize 让文本适配更智能

在不同屏幕尺寸和复杂布局下,文本适配一直是开发者的心头之患,要么文本被无情截断,要么字体过小难以辨认。Jetpack Compose 1.8 引入的AutoSize参数,为这一难题提供了完美解决方案。在BasicText组件中,通过设置autoSize参数,文本能够自动根据容器大小调整自身尺寸。

开发者可以自由设定最小字体大小minFontSize、最大字体大小maxFontSize以及步长stepSize ,让文本在合理范围内自适应。例如,在一个固定宽度的卡片中展示标题,设置合适的autoSize参数后,无论在手机还是平板上,标题都能以最佳尺寸呈现,既不会浪费空间,也不会出现显示不全的情况,极大提升了用户界面的美观度和可读性。


BasicText(
    text = "这是一段会自动适配大小的文本",
    maxLines = 1,
    autoSize = TextAutoSize.StepBased(
        minFontSize = 12.sp,
        maxFontSize = 24.sp,
        stepSize = 2.sp
    )
)

智能省略号,文本展示新玩法

以往,省略号总是固定出现在文本结尾,当遇到文件路径、长用户名等需要从开头或中间截断展示的情况时,就显得力不从心。Jetpack Compose 1.8 新增的TextOverflow.StartEllipsisTextOverflow.MiddleEllipsis选项,彻底打破了这一局限。

现在,开发者可以根据实际需求,灵活选择在文本开头或中间显示省略号。比如展示长文件路径时,使用TextOverflow.StartEllipsis ,能让用户快速识别文件类型和关键目录;展示用户名时,用TextOverflow.MiddleEllipsis ,既能保护隐私,又能保留关键信息,使文本展示更加智能、人性化,有效提升了用户体验。


// 中间显示省略号
Text(
    text = "这是一个非常非常长的文本,中间会显示省略号",
    overflow = TextOverflow.MiddleEllipsis,
    maxLines = 1
)

// 开头显示省略号
Text(
    text = "这是一个非常非常长的文本,开头会显示省略号",
    overflow = TextOverflow.StartEllipsis,
    maxLines = 1
)

预测未来的动画,体验丝滑过渡

在传统动画开发中,手动设置动画和复杂的状态管理常常让开发者焦头烂额。Jetpack Compose 1.8 的Modifier.animateBounds横空出世,为动画开发带来了前所未有的变革。它基于LookaheadScope,能够自动为Composable的大小和位置变化添加动画,实现平滑、预测性的过渡效果。

比如实现一个展开收起的卡片动画,只需定义展开和收起状态下卡片的大小和位置,animateBounds就能自动完成中间的过渡动画,无需手动编写复杂的动画逻辑。动画过程中,元素仿佛能 “预见” 目标位置,过渡自然流畅,为用户带来极致的视觉享受,同时也大大简化了开发者的工作,提高了开发效率。


LookaheadScope {
    var expanded by remember { mutableStateOf(false) }
    Box(
        Modifier
           .width(if (expanded) 180.dp else 110.dp)
           .offset(x = if (expanded) 0.dp else 100.dp)
           .animateBounds(lookaheadScope = this@LookaheadScope)
           .background(Color.LightGray, shape = RoundedCornerShape(12.dp))
           .height(50.dp)
           .clickable { expanded = !expanded }
    ) {
        Text("Layout Content", Modifier.align(Alignment.Center))
    }
}

可见性追踪,掌握用户行为

在应用开发中,了解用户实际看到的内容至关重要,但以往追踪Composable可见性的方法要么繁琐,要么效果不佳。Jetpack Compose 1.8 引入的onLayRectChanged,成为解决这一问题的利器。它能够精准追踪Composable在屏幕内的位置和可见性变化,且开销更低。

通过这一特性,开发者可以轻松实现诸如分析用户浏览行为、优化屏幕外内容加载策略、智能展示图片和视频广告等功能。例如,在一个图片列表中,利用onLayRectChanged判断图片是否进入可视区域,进而决定是否加载图片,既能节省流量,又能提升页面加载速度,为用户提供更流畅的使用体验。


Box(
    Modifier
       .onLayRectChanged { rect ->
            // 在这里处理可见性变化逻辑,rect为当前Composable的位置和大小信息
        }
       .size(200.dp)
       .background(Color.Blue)
)

触觉反馈升级,交互体验更灵敏

触觉反馈是提升应用交互体验的关键因素,Jetpack Compose 1.8 在这方面更进一步,支持更多类型的触觉反馈,如ConfirmContextClickGestureEnd等。这些丰富的反馈类型,能够让用户在操作按钮、开关或进行手势操作时,获得更加真实、细腻的反馈。

比如当用户点击按钮时,通过LocalHapticFeedback.current.performHapticFeedback(HapticFeedbackType.Confirm) ,设备会立即给出轻微震动反馈,确认操作已被接收,增强了操作的即时感和交互性。在游戏应用中,不同的手势操作可以对应不同的触觉反馈,让玩家更沉浸于游戏世界,大大提升了应用的交互品质和用户满意度。


val haptics = LocalHapticFeedback.current
Button(
    onClick = {
        haptics.performHapticFeedback(HapticFeedbackType.Confirm)
        // 处理点击逻辑
    }
) {
    Text("Tap me!")
}

焦点管理优化,导航更顺畅

对于使用键盘和辅助工具进行导航的用户来说,焦点管理的优劣直接影响着使用体验。Jetpack Compose 1.8 中多焦点 API 的稳定,让导航变得更加轻松顺畅。现在,开发者可以使用Modifier.focusRestorer()onEnteronExit FocusProperties等功能,更精准地控制焦点的获取、移动和恢复。

在电视应用中,用户通过遥控器进行方向导航时,焦点能够按照预期在各个元素间平滑切换,不会出现焦点丢失或跳转异常的情况;对于依赖屏幕阅读器的视障用户,优化后的焦点管理也能提供更清晰、准确的焦点提示,极大地提升了应用的可访问性和易用性,使更多用户能够便捷地使用应用。


Column {
    TextField(
        value = "",
        onValueChange = {},
        modifier = Modifier
           .focusRestorer()
           .onFocusChanged { focusState ->
                if (focusState.isFocused) {
                    // 获得焦点时的逻辑
                } else {
                    // 失去焦点时的逻辑
                }
            }
    )
    Button(
        onClick = {},
        modifier = Modifier
           .focusProperties {
                // 定义焦点相关属性,如是否可聚焦、聚焦方向等
            }
    ) {
        Text("Button")
    }
}

文本渲染加速,加载更快

在旧版本的 Compose 中,文本渲染速度一直不尽如人意,尤其是在低端设备上,加载大量文本时容易出现卡顿现象。Jetpack Compose 1.8 对文本渲染进行了深度优化,通过一系列底层技术改进,大大提升了文本渲染速度。现在,应用能够在后台提前加载和渲染文本,当页面需要展示时,文本能够迅速呈现,几乎实现了瞬间加载。

以新闻类应用为例,在加载长篇文章时,新版本 Compose 能够快速渲染出文本内容,用户无需等待,即可流畅阅读。与之前版本相比,加载时间大幅缩短,有效提升了应用的响应速度和用户体验,让用户在获取信息时更加高效。

懒加载布局优化,性能提升

在处理大量数据展示时,懒加载布局是提升应用性能的关键。Jetpack Compose 1.8 对懒加载布局进行了全面优化,使其更加智能高效。优化后的懒加载布局能够更精准地预测用户行为,提前加载即将显示的内容,同时减少不必要的资源消耗。

比如在一个商品列表应用中,当用户快速滑动列表时,优化后的懒加载布局能够提前加载下一页的商品图片和信息,确保用户在滑动过程中不会出现图片加载延迟或空白的情况,使列表滚动更加流畅,有效提升了应用的性能和用户体验,让用户在浏览商品时更加顺畅便捷。

可暂停合成,减轻负载

可暂停合成是 Jetpack Compose 1.8 引入的一项重要特性,它能够将合成工作负载巧妙地分布到多个帧中,避免在单帧内处理过多任务导致卡顿。在复杂界面中,当进行大量数据更新或复杂动画渲染时,可暂停合成功能会自动启动,将合成任务拆分成多个小任务,依次在后续帧中完成。

例如在一个实时更新数据的股票行情界面,同时还伴有动态图表展示,可暂停合成功能能够确保数据更新和图表动画流畅进行,不会因为瞬间的大量计算而使界面出现卡顿或掉帧现象,为用户提供稳定、流畅的交互体验,提升了应用在复杂场景下的性能表现。

减少卡顿,流畅度飙升

卡顿问题一直是影响用户体验的一大顽疾,Jetpack Compose 1.8 从多个方面入手,对滚动和动画进行了全面优化,显著减少了卡顿现象。在滚动方面,优化了滚动算法,使列表滚动更加顺滑,能够实时响应用户的滑动操作,不再出现拖影或卡顿。在动画方面,采用了更高效的动画引擎,提升了动画的帧率和流畅度,动画过渡更加自然。

比如在一个包含图片和文字的滚动列表中,同时还有图片放大缩小的动画效果,在 Jetpack Compose 1.8 的优化下,用户在滚动列表时,图片和文字的加载与动画的播放能够完美协同,不会出现任何卡顿或延迟,为用户带来了极致的流畅体验,让应用的交互更加丝滑。

AnnotatedString 支持 HTML,富文本展示无忧

在展示从后端获取的富文本内容时,以往的处理方式往往复杂繁琐。Jetpack Compose 1.8 为AnnotatedString添加了对 HTML 的支持,让富文本展示变得轻而易举。现在,只需将包含 HTML 标签的字符串传递给AnnotatedString ,Compose 就能自动解析并正确渲染出富文本效果。

无论是带有加粗、倾斜、超链接等基本格式的文本,还是包含图片、列表等复杂结构的内容,都能完美呈现。例如在一个资讯类应用中,展示的新闻内容包含多种格式和图片,使用AnnotatedString结合 HTML 支持,能够准确无误地将新闻内容以丰富的格式展示给用户,极大地提升了内容展示的丰富度和可读性,满足了用户对多样化内容呈现的需求。

如何在项目中应用这些新特性

在项目中应用 Jetpack Compose 1.8 的新特性,能显著提升应用的用户体验和开发效率。下面为大家介绍在项目中使用这些新特性的具体步骤和建议:

自动填充

要在项目中使用自动填充功能,首先需要确保项目使用的是 Jetpack Compose 1.8 及以上版本。在布局文件中,对于需要自动填充的文本字段,使用Modifier.semantics来设置contentType语义,例如:


TextField(
    state = rememberTextFieldState(),
    modifier = Modifier.semantics {
        contentType = ContentType.Username
    },
    label = { Text("用户名") }
)

如果需要在用户提交表单时显式保存凭据,可以获取本地的AutofillManager并调用commit()方法 :


@Composable
fun ExplicitCommitButton() {
    val autofill = LocalAutofill.current
    Button(onClick = {
        autofill?.commit()
    }) {
        Text("提交并保存")
    }
}

文本优化

在使用AutoSize特性时,在BasicText组件中设置autoSize参数,定义好最小、最大字体大小和步长:


BasicText(
    text = "这是一段会自动适配大小的文本",
    maxLines = 1,
    autoSize = TextAutoSize.StepBased(
        minFontSize = 12.sp,
        maxFontSize = 24.sp,
        stepSize = 2.sp
    )
)

对于智能省略号特性,在Text组件中根据需求设置overflow属性为TextOverflow.StartEllipsisTextOverflow.MiddleEllipsis


Text(
    text = "这是一个非常非常长的文本,中间会显示省略号",
    overflow = TextOverflow.MiddleEllipsis,
    maxLines = 1
)

动画改进

使用Modifier.animateBounds实现动画效果时,将需要动画的Composable放置在LookaheadScope中,并添加animateBounds修饰符:


LookaheadScope {
    var expanded by remember { mutableStateOf(false) }
    Box(
        Modifier
           .width(if (expanded) 180.dp else 110.dp)
           .offset(x = if (expanded) 0.dp else 100.dp)
           .animateBounds(lookaheadScope = this@LookaheadScope)
           .background(Color.LightGray, shape = RoundedCornerShape(12.dp))
           .height(50.dp)
           .clickable { expanded = !expanded }
    ) {
        Text("Layout Content", Modifier.align(Alignment.Center))
    }
}

可见性追踪

利用onLayRectChanged追踪Composable可见性时,在需要追踪的Composable上添加该修饰符,并在回调中处理可见性变化逻辑:


Box(
    Modifier
       .onLayRectChanged { rect ->
            // 在这里处理可见性变化逻辑,rect为当前Composable的位置和大小信息
        }
       .size(200.dp)
       .background(Color.Blue)
)

触觉反馈

在按钮、开关等组件中添加触觉反馈,首先获取LocalHapticFeedback.current ,然后在点击事件中调用performHapticFeedback方法,并传入相应的反馈类型:


val haptics = LocalHapticFeedback.current
Button(
    onClick = {
        haptics.performHapticFeedback(HapticFeedbackType.Confirm)
        // 处理点击逻辑
    }
) {
    Text("Tap me!")
}

焦点管理

在需要控制焦点的组件上,使用Modifier.focusRestorer()来恢复焦点,通过onEnteronExit FocusProperties来处理焦点的进入和退出事件:


Column {
    TextField(
        value = "",
        onValueChange = {},
        modifier = Modifier
           .focusRestorer()
           .onFocusChanged { focusState ->
                if (focusState.isFocused) {
                    // 获得焦点时的逻辑
                } else {
                    // 失去焦点时的逻辑
                }
            }
    )
    Button(
        onClick = {},
        modifier = Modifier
           .focusProperties {
                // 定义焦点相关属性,如是否可聚焦、聚焦方向等
            }
    ) {
        Text("Button")
    }
}

文本渲染加速、懒加载布局优化、可暂停合成、减少卡顿

这些特性大多是在底层实现的优化,开发者在使用时无需进行额外的复杂配置。在构建包含大量文本、图片或复杂动画的界面时,这些优化会自动生效,提升应用性能和用户体验。例如,在展示长列表时,懒加载布局优化会使列表滚动更加流畅;在处理复杂动画时,可暂停合成能有效避免卡顿 。开发者只需按照正常的开发流程构建界面,Jetpack Compose 1.8 会自动利用这些优化。

AnnotatedString 支持 HTML

当需要展示包含 HTML 格式的富文本时,创建AnnotatedString并传入 HTML 字符串,然后在Text组件中使用该AnnotatedString


val htmlText = "<b>这是一段加粗的文本</b> <i>这是一段倾斜的文本</i>"
val annotatedString = buildAnnotatedString {
    appendHtml(htmlText)
}
Text(text = annotatedString)

在应用中使用 Jetpack Compose 1.8 的新特性时,还需要注意兼容性问题。确保项目中的其他依赖库与 Compose 1.8 版本兼容,避免出现冲突。在使用新特性前,可以先在测试环境中进行充分测试,确保功能正常且不会对现有功能造成影响。同时,建议及时关注官方文档和社区动态,获取最新的使用方法和最佳实践,以便更好地利用这些新特性提升应用质量 。

总结与展望

Jetpack Compose 1.8 版本的这 12 个新特性,无疑为 Android 开发注入了新的活力。从自动填充功能带来的便捷交互,到文本优化、动画改进、可见性追踪等全方位的体验升级,再到性能优化和富文本展示的突破,每一项都让开发者在构建应用时更加得心应手,同时也为用户带来了更加优质、流畅的使用感受 。

展望未来,相信 Jetpack Compose 团队会继续秉持创新精神,不断优化现有功能,推出更多实用且强大的特性。也许在未来版本中,动画功能会更加丰富多样,实现更复杂的交互动画效果;文本处理能力会进一步提升,支持更多高级排版需求;性能优化也会持续深入,让应用在各种设备上都能稳定高效运行。

如果你还在使用旧版本的 Jetpack Compose,不妨尽快升级到 1.8 版本,体验这些全新特性带来的开发乐趣和优势。在实际项目中大胆尝试运用这些新特性,将它们融入到应用的各个角落,相信你的应用会因此脱颖而出,收获用户的喜爱和好评。期待大家在使用过程中发现更多惊喜,一起见证 Jetpack Compose 的不断成长与进步 !