Jetpack Compose:Android 中的声明式 UI

三思系列:“声明式UI“和“命令式UI“,你的理解可能是错的 各行各样都会淘汰一些能力差的,不仅仅是IT这个行业,所以,不要被程序猿是吃青春饭等等这类话题所吓倒,也不要觉得,找到一份工作,就享受安逸的生活,你在安逸的同时,别人正在奋力的向前跑,这样与别人的差距也就会越来越遥远,加油,希望,我们每一个人,成为更好的自己。BAT大厂面试题、独家面试工具包,资料包括 数据结构、Kotlin、计算机网络、Framework源码、数据结构与算法、小程序、NDK、Flutter,《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取! 阅读详情

前言

Jetpack Compose 被官方称为 Android 用于构建原生 UI 的现代工具包,它简化并加速了 Android 上的 UI 开发,并以更少的代码、强大的工具和直观的 Kotlin API 快速将应用程序变为现实。

谷歌推出了用于构建 Android 应用程序的最新工具包 Jetpack Compose,预计将取代 Android View System。它不是唯一可用的声明性 UI 概念。React Native、Flutter 和 Swift UI 都基于声明式 UI 概念。

在这里,在本文中,我试图帮助新手了解使用 Android Studio 的 Jetpack Compose 的基础知识。写这篇文章时稳定的 android studio 版本是 Chipmunk。让我们上车吧。

第一个 Jetpack Compose 项目

创建 compose 项目的最佳方式是通过 Android Studio 中的 New Project,如下图所示。





创建新项目并成功构建后,Hello Android在预览面板中如上图所示。

让我们分解最初的项目并尝试了解一些基础知识。

项目结构

生成的 android 项目具有以下文件夹结构,应用程序以 MainActivity 以及与主题相关的文件(如Color.kt、Theme.kt、Type.kt.


可组合函数

可组合函数必须@Composable在顶部使用注释。这些函数没有返回类型,但可以有多个函数参数。可组合函数内部的内容被渲染以进行应用程序布局设计。

@Composable
fun Greeting(name: String) {
    Text(text = "Hello $name!")
}

预习

如果任何可组合函数进一步用@Preview.

@Preview(showBackground = true)
@Composable
fun DefaultPreview() {
    FirstComposeAppTheme {
        Greeting("Android")
    }
}


如果showSystemUI在预览中设置为 true。设计预览显示在 Android 设备框架中。

@Preview(showBackground = true, showSystemUi = true)
@Composable
fun DefaultPreview() {
    FirstComposeAppTheme {
        Greeting("Android")
    }
}

MainActivity.kt

此文件(活动类)是使用 Compose UI 的起点。这个活动类也必须在app/src/main/AndroidManifest.xmlas launcher 活动中定义。Compose 代码必须写在setContentdsl 函数中。

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            FirstComposeAppTheme {
                // A surface container using the 'background' color from the theme
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    Greeting("Android")
                }
            }
        }
    }
}

主题.kt

此文件用于为应用程序内部使用的可组合功能(UI 组件)定义配色方案和主题。在这里,定义了一个可组合函数来为子可组合项提供主题包装器。此包装器有助于将定义的主题继承给子组合 UI 组件。

@Composable
fun FirstComposeAppTheme(
    darkTheme: Boolean = isSystemInDarkTheme(),
    // Dynamic color is available on Android 12+
    dynamicColor: Boolean = true,
    content: @Composable () -> Unit
) {
    val colorScheme = when {
        dynamicColor && Build.VERSION.SDK_INT >= Build.VERSION_CODES.S -> {
            val context = LocalContext.current
            if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context)
        }
        darkTheme -> DarkColorScheme
        else -> LightColorScheme
    }
    val view = LocalView.current
    if (!view.isInEditMode) {
        SideEffect {
            (view.context as Activity).window.statusBarColor = colorScheme.primary.toArgb()
            ViewCompat.getWindowInsetsController(view)?.isAppearanceLightStatusBars = darkTheme
        }
    }

    MaterialTheme(
        colorScheme = colorScheme,
        typography = Typography,
        content = content
    )
}

基本的可组合组件

显示文本并提供语义/可访问性信息的高级元素。

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            FirstComposeAppTheme {
                // A surface container using the 'background' color from the theme
                Surface(
                    modifier = Modifier.fillMaxSize(),
                    color = MaterialTheme.colorScheme.background
                ) {
                    LayoutBasics()
                }
            }
        }
    }
}

@Composable
fun LayoutBasics() {
    Text(text = "Hello Jetpack!")
}

@Preview(showBackground = true, showSystemUi = false)
@Composable
fun DefaultPreview() {
    FirstComposeAppTheme {
        LayoutBasics()
    }
}

这里,LayoutBasics是一个可组合函数,它包含另一个可组合函数Text并呈现如下图所示的文本Hello Jetpack!。


该Text函数有各种参数来定义颜色、字体大小、字体类型、字体样式、文本对齐方式等。这里是一个两行文本的示例,溢出省略号和其他各种样式。

@Composable
fun LayoutBasics() {
    val longText =
        "Hello Jetpack!\nThe quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy dog"
    Text(
        text = longText,
        modifier = Modifier.padding(16.dp),
        color = Color.Red,
        fontSize = 20.sp,
        fontStyle = FontStyle.Italic,
        letterSpacing = 5.sp,
        textDecoration = TextDecoration.Underline,
        textAlign = TextAlign.Start,
        overflow = TextOverflow.Ellipsis,
        softWrap = true,
        maxLines = 2,
        style = TextStyle.Default,
    )
}

@Preview(showBackground = true, showSystemUi = false)
@Composable
fun DefaultPreview() {
    FirstComposeAppTheme {
        LayoutBasics()
    }
}

图片

创建一个可组合的布局并绘制给定的来源,如画家。可绘制图像资源在画家资源内部传递,并用作Image可组合的参数。

@Composable
fun LayoutBasics() {
    // image path: app/src/main/res/drawable/jetpack_compose.png
    Image(
        painter = painterResource(R.drawable.jetpack_compose),
        contentDescription = null,
        modifier = Modifier
            .padding(16.dp)
            .size(100.dp)
            .border(1.dp, MaterialTheme.colorScheme.secondary, RoundedCornerShape(8.dp))
    )
}

@Preview(showBackground = true, showSystemUi = false)
@Composable
fun DefaultPreview() {
    FirstComposeAppTheme {
        LayoutBasics()
    }
}


矢量图像也可以像下面的示例一样呈现。

@Composable
fun LayoutBasics() {
    Image(
        imageVector = Icons.Filled.AccountCircle,
        contentDescription = null, // decorative
        modifier = Modifier.size(40.dp),
        colorFilter = ColorFilter.tint(color = Color.LightGray),
        contentScale = ContentScale.Fit
    )
}

排

一种可组合的布局,将其子项按水平顺序放置。

Row用于以水平方式并排放置组件的组合。这是连续图像图标的示例。

@Composable
fun LayoutBasics() {
   Row {
       ImageIcon()
       ImageIcon()
       ImageIcon()
   }
}

@Composable
fun ImageIcon(){
    Image(
        imageVector = Icons.Filled.AccountCircle,
        contentDescription = null, // decorative
        modifier = Modifier.size(40.dp),
        colorFilter = ColorFilter.tint(color = Color.Gray),
        contentScale = ContentScale.Fit
    )
}

@Preview(showBackground = true, showSystemUi = false)
@Composable
fun DefaultPreview() {
    FirstComposeAppTheme {
        LayoutBasics()
    }
}

柱子

一种可组合的布局,将其子项按垂直顺序放置。

一个Column可组合的,用于以垂直方式一个接一个地放置组件。这是列中的文本示例。

@Composable
fun LayoutBasics() {
   Column {
       Text("First Text")
       Text("Second Text")
       Text("Third Text")
       Text("Fourth Text")
   }
}

@Preview(showBackground = true, showSystemUi = false)
@Composable
fun DefaultPreview() {
    FirstComposeAppTheme {
        LayoutBasics()
    }
}

行列组合

Row 和 Column 可以组合起来表示 UI 组件。让我们看下面的例子。该列包含一个图像和行。内行包含一个图像和另一列。

@Composable
fun LayoutBasics() {
    Column(
        Modifier
            .background(Color.LightGray)
            .padding(16.dp)
    ) {

        Image(
            painter = painterResource(R.drawable.begin_cup),
            contentDescription = null,
            modifier = Modifier.clip(RoundedCornerShape(8.dp)),
            contentScale = ContentScale.Fit
        )

        Row(
            modifier = Modifier
                .background(Color.White)
                .fillMaxWidth()
                .padding(PaddingValues(16.dp))
        ) {
            Image(
                imageVector = Icons.Default.AccountCircle,
                modifier = Modifier
                    .size(40.dp)
                    .clip(CircleShape)
                    .background(Color.LightGray),
                contentDescription = null,
                contentScale = ContentScale.Fit,
                colorFilter = ColorFilter.tint(color = Color.Green)
            )

            Spacer(modifier = Modifier.width(16.dp))

            Column {
                Text(text = "Begin Cup", fontWeight = FontWeight.Bold)
                Text(text = "A good morning coffee")
            }
        }
    }
}

@Preview(showBackground = true, showSystemUi = true)
@Composable
fun DefaultPreview() {
    FirstComposeAppTheme {
        LayoutBasics()
    }
}


在本文中,我介绍了 Jetpack Compose 的一些基础知识。将来,我将介绍更高级的主题。敬请关注!

Android声明式UI框架-Litho-初探——基础使用篇 初衷 Litho作为一个高性能的UI引擎,学习曲线还是比较高的,但是在国内能用的资料非常少(大部分都是相互复制的”Hello Word“教程),国外除了Litho自己的文档外,也没有太多教程。这几篇教程也是我边学边写。如果有那里理解不到位的地方,欢迎指正。 Litho 是什么 Litho是一个用于在Android上构建高效用户界面(UI)的声明性框架。但不同以往的UI框架,它的底层是Yoga,它通过将不需要交互的UI转换为Drawable来渲染视图,通过Yoga来完成组件布局的异步或同步(可根据场景定制)测 阅读详情

相关推荐

声明式UI是否会成为Android开发的主流?

从Windows到Web,到Android,到iOS,我们编写应用 (App) 最初的方式都是命令式的 (Imperative Style) 。但随着声明式 (Declarative Style) 的出现,情况正在发生极速的变化。

clcwcxfwf的专栏 1373

写给Android工程师的声明式UI快速指北

Compose推出之初,就曾引发广泛的讨论,其中一个比较普遍的声音就是——“🤨这跟Flutter也长得太像了吧?!” 这里说的长得像,实际更多指的是UI编码的风格相似,而关于这种风格有一个专门的术语,叫做声明式UI。

Android 开发架构 824

Android Jetpack Compose:声明式UI开发

本文详细阐述了Android Jetpack Compose:声明式UI开发的优势和应用。通过简化UI构建过程、提高开发效率、优化用户体验等方面,我们可以看到Jetpack Compose 在移动应用开发领域的巨大潜力。随着Jetpack Compose 的不断发展和完善,相信会有越来越多的开发者选择使用这种方式进行Android应用开发。为了更好地发挥Jetpack Compose 的优势,开发者需要深入学习其原理和技巧。

2501_92487820的博客 1161

声明式UI语法

在ArkUI中,UI显示的内容均为组件,由框架直接提供的称为系统组件,由开发者定义的称为自定义组件。自定义组件具有以下特点:可组合:允许开发者组合使用系统组件、及其属性和方法。可重用:自定义组件可以被其他组件重用,并作为不同的实例在不同的父组件或容器中使用。数据驱动UI更新:通过状态变量的改变,来驱动UI的刷新。a、struct:自定义组件基于struct实现,struct + 自定义组件名 + {...}的组合构成自定义组件,不能有继承关系。对于struct的实例化,可以省略new。

sinat_34896766的博客 2259

Jetpack Compose:Android声明式UI开发实战指南

声明式UI框架正逐渐成为现代移动开发的主流范式,其核心原理是通过描述界面状态而非操作视图对象来实现界面更新。Jetpack Compose作为Android官方推出的声明式UI工具包,采用Kotlin语言特性重构了UI开发方式,大幅提升了代码复用率和开发效率。在技术实现上,Compose通过函数式组件和状态自动管理机制,解决了传统XML布局的维护难题,特别适合复杂交互场景。对于Android开发者而言,掌握Compose不仅能提升开发效率(代码量减少40%的实测数据),还能更好地适配Material Des

weixin_42523670的博客 292

Android Jetpack Compose入门:声明式UI开发指南

声明式UI是现代移动应用开发的重要范式,通过描述界面状态而非逐步构建视图层级,大幅提升了开发效率和代码可维护性。Jetpack Compose作为Android官方推出的声明式UI框架,采用Kotlin DSL实现组件化开发,解决了传统View系统在状态管理、性能优化等方面的痛点。其核心原理是基于状态变化的自动重组机制,配合Modifier系统实现灵活的样式控制。在工程实践中,Compose可减少约40%的代码量,已被Twitter、Airbnb等知名应用采用。本指南从环境配置到核心概念,系统介绍如何利用C

weixin_33462927的博客 378

[安卓] 深度掌握Jetpack Compose:现代Android声明式UI革命

/ 传统命令式UI(基于View)) {// 命令式:明确告诉UI如何更新count++count" // 手动更新UI// 声明式UI(基于Compose)// 声明式:描述UI应该是什么样子Column {count")// 当count变化时,Compose会自动重组UI。

2301_77946674的博客 2380

MIC(Maximal Information Coefficient)最大互信息系数

MIC(Maximal Information Coefficient)最大互信息系数是一种用于衡量两个变量之间相关性的统计量。它扩展了传统的互信息(MI)和条件互信息(CMI)的概念,具有更广泛的应用范围。MIC能够捕获包括功能性和非功能性的广泛的关联,具有普遍性和公平性。普遍性意味着在足够的样本量下,MIC能够捕捉到广泛的相关关系,而不仅仅局限于特定的功能类型;公平性则意味着MIC对不同类型的包含同等噪声的关系给出了相似的分数。需要注意的是,虽然MIC具有很多优点,但它也有一些局限性。

qlkaicx的博客 4605

Android Jetpack Compose:声明式UI开发指南

声明式 UI 是一种编程范式,开发者只需描述 UI 应该是什么样子,框架会自动处理 UI 的变化和渲染。与传统的命令式 UI 编程相比,声明式 UI 让开发者更加专注于业务逻辑,提高了开发效率。本文对《Android Jetpack Compose:声明式UI开发指南》进行了详细阐述,介绍了声明式 UI 的概念、Jetpack Compose 的优势、核心概念与使用方法、实际应用案例以及性能优化与调试技巧。通过本文,开发者可以更好地理解和掌握 Jetpack Compose,提高移动应用开发的效率和质量。

2501_92488994的博客 1098

Li‘s 核磁共振影像数据处理-4-使用3D Slicer从DTI计算参数图(FA、ADC等)

从DTI计算参数图 通过3D Slicer软件计算 主要步骤 导入DICOM影像 3D Slicer似乎只能支持DICOM格式和NRRD格式的DTI处理,而无法支持NIFTI+磁场梯度信息文件的方式。(这里不确定,如有错误请指正。) 模块选择: 需要选择或设置的内容包括:选择DicomToNrrd,设置Output DWI Volume file,设置Input Dicom Data Directory。设置好后点击“Apply”。 制作mask。 实质就是去脑壳。 模块选择: 需要设置的内

weixin_38594676的博客 3921

视觉惯性SLAM系列——ORB-SLAM3的整体介绍及各个线程的功能(五)

跟踪线程(Tracking Thread)作用:负责处理每一帧图像,进行相机位姿的估计和定位。它首先执行与前一帧图像的特征匹配,然后通过仅运动(motion-only)BA(Bundle Adjustment)优化位姿。如果跟踪失败,它会尝试在所有地图中进行重定位。此外,跟踪线程还负责决定何时插入新的关键帧,以及何时将关键帧从局部地图中移除。详细介绍见局部建图线程(Local Mapping Thread)作用:管理局部地图,向活跃地图添加关键帧和点,移除多余的关键帧和点。

曾经也曾立志 1004

Jetpack Compose:重塑 Android UI 开发的声明式革命

Jetpack Compose 作为 Android 开发的下一代 UI 框架,以声明式编程、状态驱动、自适应布局等核心特性,彻底改变了 Android UI 的开发方式。相比传统 XML 布局,它不仅让开发效率提升 40% 以上,还通过精准重组、优化渲染等机制,实现了更优异的性能表现。其与现有技术栈的无缝兼容性,降低了存量项目的迁移成本,而持续完善的生态系统(与 Jetpack 组件深度集成、第三方库广泛支持),让 Compose 已成为 Android 开发的主流选择。

2301_80435500的博客 1186

RTX 50系显卡(5080/5090D)CUDA 12.8环境下的vLLM部署避坑与实战指南

本文为RTX 5080/5090D显卡用户提供了在CUDA 12.8环境下部署vLLM的完整实战指南。文章详细介绍了从驱动安装、CUDA 12.8环境配置、PyTorch Nightly版本精准匹配,到vLLM源码编译及常见报错排查的全过程,帮助开发者高效利用新一代硬件进行大模型推理。

gray5的博客 671

告别XML,拥抱声明式UI:Jetpack Compose在Android Studio中的实战入门

在传统的Android开发中,我们通常使用XML布局文件来定义UI界面,然后在Activity或Fragment中使用来获取控件引用,再通过setText()等方法来更新UI和添加交互。代码冗余:每个控件都需要在XML和Java/Kotlin中分别定义和引用容易出错:类型转换错误、空指针异常是常见问题状态管理困难:UI状态分散在各个地方,难以维护响应式编程复杂:需要手动同步数据和UIJetpack Compose的出现彻底改变了这一现状。作为Android官方推荐的现代UI工具包,Compose采用。

2302_81286824的博客 791

期末求生指南:手把手教你用浏览器开发者工具绕过百一测评切屏检测

本文详细介绍了如何利用浏览器开发者工具绕过百一测评的切屏检测功能。通过分析JavaScript事件监听机制,定位关键检测代码,并提供实时调试和本地覆盖两种修改方法,帮助学生在遵守规则的前提下更灵活地应对在线考试。文章还包含风险控制和替代方案等实用建议。

weixin_28698059的博客 551

JMeter 中实现 100 个用户在 3 秒内并发登录

通过以上配置,你可以在 JMeter 中实现 100 个用户在 3 秒内并发登录

南开大学 | 10 年 + 软件研发与测试实战 | 现任企业质控负责人 | 专注端到端交付质量 1682

告别XML:用Jetpack Compose开启Android声明式UI新时代

正是这些痛点的长期存在,催生了Jetpack Compose的诞生——它通过声明式UI范式状态驱动更新和完全Kotlin化的DSL,从根本上解决了上述问题。在Compose中,UI是代码,代码也是UI,二者终于实现了真正的统一。(2)Jetpack Compose的出现:一次开发思维的革新①从“命令式”到“声明式”的范式转移1:传统Android开发的“命令式”思维命令式UI的核心问题:开发者必须关注每一个细节步骤,告诉系统“如何做”。2:Jetpack Compose的“声明式”思维。

fjnu_se的博客 995

openclaw通俗入门系列9——流式传输 + 分块

流式传输 = 不等写完就开始发。分块流式传输是把长回复切成几条消息发(所有渠道),草稿流式传输是像打字一样实时显示(仅 Telegram)。可以配置块大小、发送时机、合并规则、类人延迟。

m0_60605453的博客 507

Android Jetpack Compose:使用声明式编程构建 UI 的全新框架

Android Jetpack Compose 是 Google 推出的一个全新的 UI 开发框架,它使用声明式编程方式构建 UI,并提供了一套现代化的 API,旨在简化 Android 应用的 UI 开发。

u011464172的专栏 1242

Java炫酷烟花③(完整代码)

Java语言实现炫酷烟花动画的完整代码。 下载代码 下载链接:我是一只有趣的兔子,感谢你的喜欢。

AIGC 784

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

移动开发:Android Jetpack Compose 的声明式 UI 实践

Jetpack Compose 的声明式 UI 实践通过状态驱动和可组合函数,让 Android 开发更高效。从简单计数器入手,逐步扩展到复杂应用(如列表、动画)。推荐官方文档()深入学习。遇到问题,可尝试社区资源如 Stack Overflow。实践出真知,动手编写代码是关键!

2501_93895868的博客 377

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Android Jetpack Compose:现代声明式UI开发指南

Jetpack Compose是Android的现代原生UI工具包,它简化并加速了Android上的UI开发。与传统的View系统不同,Compose采用声明式编程范式,允许开发者通过描述UI应该呈现的状态来构建界面,而不是逐步指导如何构建UI。Layout(content = { /* 子项 */ },// 测量和布局逻辑。

专注于移动开发的干货分享。提供高效解决方案、避坑指南与前沿技术解析。为开发者创造价值。 1414

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Android XML命令式和Jetpack Compose声明式UI

Android声明式UI(Jetpack Compose)与传统XML布局在开发范式上有显著差异。Compose采用声明式编程,UI与逻辑统一在Kotlin代码中,通过状态自动驱动UI更新;而XML布局是命令式编程,需手动同步UI与逻辑。Compose支持实时预览、智能重组和高效渲染,代码更简洁,适合动态UI和复杂动画开发。XML布局则更适合老旧项目维护。Google已推荐Jetpack Compose作为首选UI工具包,新项目应优先采用。

zyy_give的博客 463
上一篇: 如何在Android中用Java创建带有复选框的选项菜单
下一篇: 每个 Android 开发者都必须知道的 5 种设计模式
不秃头de程序猿
博客等级 码龄5年 4089粉丝 1478原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值