JetPack Compose 学习笔记(持续整理中...)

这篇具有很好参考价值的文章主要介绍了JetPack Compose 学习笔记(持续整理中...)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.为什么要学?

 1.命令式和声明式 UI大战,个人认为命令式UI自定义程度较高,能更深入到性能,内存优化方面,而申明式UI 是现在主流的设计,比如React,React Native,Flutter,Swift UI等等,现在性能也逐渐在变得更好
2.还有一个原因compose 是KMM 是完整跨平台的UI基础
3.声明式UI 个人觉得是非常适合MVVM的设计的,比android databinding 实现的xml 里面绑定vm 更适合,声明式UI一般都是基于状态管理的,只需要处理状态,至于怎么组合,怎么刷新比对 是框架给处理好的,开发不需要关心,所以逻辑稍微简单些

2.前景?

1.RN官方放弃,Flutter 官方宣停,Flutter也是Google ,同样compose 和kmm也是google搞的,说明google 目前是把KMM放在第一梯队的,极大成为后期的主力推荐,现在最新的Android Studio 创建的模版工程就是compose的,而且还支持iOS;
2.我的建立认知是KMM>Flutter>RN;kotlin的的语言优势较大,和Java 无缝通用

hello word

下载最新的Android Studio,(具体是从哪个版本开始没必要深纠,我的版本是Android Studio Giraffe | 2022.3.1)

JetPack Compose 学习笔记(持续整理中...),混合开发,android 开发,学习,笔记

 JetPack Compose 学习笔记(持续整理中...),混合开发,android 开发,学习,笔记

 JetPack Compose 学习笔记(持续整理中...),混合开发,android 开发,学习,笔记

List列表组建(LazyColum)

class LazyColumnActivity: ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            Surface(
                modifier = Modifier.fillMaxSize(),
                color = MaterialTheme.colorScheme.background
            ) {
                MyLazyList()
            }
        }
    }

    @Composable
    fun MyLazyList(){
        val state= rememberLazyListState();
        LazyColumn(state=state){
            items(100){
                Text(text="item $it")
            }
        }
    }
}

JetPack Compose 学习笔记(持续整理中...),混合开发,android 开发,学习,笔记

 确实比写Adapter,和CollectionViewDelegate简单

Compose函数


"Jetpack Compose 是围绕可组合函数构建的。这些函数可让您以程序化方式定义应用的界面,只需描述应用界面的外观并提供数据依赖项,而不必关注界面的构建过程(初始化元素、将其附加到父项等)。如需创建可组合函数,只需将 @Composable 注解添加到函数名称中即可。" 官话

 @Composable
    fun MyText(){
        Text(text = "00000");
        return Text(text = "xfdft");
    }

上面这段代码 执行结果显示 两个重叠的文字, 其实这个return 是无效的,内嵌的两个text函数都会执行,@Composable函数的返回值是UNIT

 @Composable
    fun MyText():Int{
        Text(text = "00000FFF");
        return 1;
    }

这样改造成返回值int 类型 在实际的结果中依旧是展示了这个text 也不报错,这尼玛就有点神奇了?

Kotlin 中间代码(intermediate representation, IR),
这个是kotlin插件,是编译时的,比较深奥,参考
 

预览函数


基于xml的布局都提供预览,Android layout ios storeboard 等,同样compose 也具备这个特性


    @Preview(name = "第一个预览区域")
    @Composable
    fun preview(){
        Text(text="Hello,my name is jack,What's your name");
    }

    @Preview(name = "第二个预览区域")
    @Composable
    fun preview2(){
        Text(text="停车坐爱枫林晚,窗前明月光");
    }

在android studio 的预览区域就会显示出来了,可以支持多个,但是在编辑的时候不是很流畅,官方还有很大的优化空间

JetPack Compose 学习笔记(持续整理中...),混合开发,android 开发,学习,笔记

Compose 组件清单大全

Text:用于显示文本内容。
Image:用于显示图片。
Button:用于创建按钮。
TextField:用于接收用户输入的文本。
Column:用于垂直排列多个组件。
Row:用于水平排列多个组件。
Box:用于在屏幕上创建一个矩形的区域。
Surface:用于绘制一块可交互的区域。
Card:用于显示一个卡片式的 UI 元素。
Divider:用于在 UI 中添加分隔线。

Spacer:间距组件

例子:结合行列间距来实现简单的列表样式

class LazyColumnActivity2: ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            Surface(
                modifier = Modifier.fillMaxSize(),
                color = MaterialTheme.colorScheme.background
            ) {
                MyLazyList()
            }
        }
    }

    @Composable
    fun MyLazyList(){
        val state= rememberLazyListState();
        val items= listOf<Item>(Item("张三","我是中国的"),
            Item("李四","我是中国的"),
            Item("王武","我是中国的"))
        LazyColumn(state=state){
            items(items){
                MyItem(item = it)
            }
        }
    }

    @Composable
    @Preview
    fun MyItemPreview(){
        MyItem(item = Item("张三","我是中国的"))
    }
    
    @Composable
    fun MyItem(item:Item){
        return Row(modifier = Modifier.padding(10.dp)) {
            Image(painter = painterResource(id = R.drawable.ic_launcher_background), contentDescription ="这是头显",
                modifier = Modifier
                    .size(40.dp)
                    .clip(CircleShape))
            Spacer(modifier = Modifier.width(8.dp))
            Column {
                Text(text = item.name);
                Spacer(modifier = Modifier.height(8.dp))
                Text(text = item.desc);
            }
        }
    }

     class Item(val name:String,val desc:String){
    }

}

JetPack Compose 学习笔记(持续整理中...),混合开发,android 开发,学习,笔记

例子:自定义线性布局cloumn

/**
 * @ProjectName: Jetpack_Compose_Study
 * @Package: com.xxf.jetpack.compose.study.ui.theme
 * @ClassName: MyColumnActivity
 * @Description:
 * @Author: xuanyouwu@163.com 17611639080
 * @Date: 2023/9/4 10:25
 */
class MyColumnActivity: ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            Jetpack_Compose_StudyTheme {
                MyColumnWidget(modifier = Modifier
                    .padding(10.dp)
                    .background(Color.Yellow)) {
                    Text("第一行",color = Color.Black)
                    Text("第二行",color= Color.Red)
                    Text("第三行",color= Color.Green)
                    Text("第四行",color= Color.Blue)
                }
            }
        }
    }

    @Composable
    fun MyColumnWidget(modifier: Modifier=Modifier,
                       content:@Composable ()->Unit){
        Layout(modifier=modifier,content=content){ measurables, constraints->
            //测量元素
            val placeables = measurables.map {
                it.measure(constraints);
            }

            //布局
            var yPostion=0;
            layout(constraints.maxWidth,constraints.maxHeight) {
                placeables.forEach {
                    it.placeRelative(x=0,y=yPostion);
                    yPostion+=it.height;
                }
            }
        }
    }
}

JetPack Compose 学习笔记(持续整理中...),混合开发,android 开发,学习,笔记

这个很像android 自定义组件的步骤,measure->layout

例子:用ConstraintLayout来实现相对布局

需要引入 

implementation "androidx.constraintlayout:constraintlayout-compose:1.0.1"

大致步骤
1.使用createRefs()或者createRefFor()为ConstraintLayout中的每个组合项创建引用
2.建立绑定关系,是用modifer 中constrainAs来建立 引用绑定
3.通过约束方法linkto等 可以建立createRefs创建的引用之间的布局依赖

class ConstraintLayoutActivity: ComponentActivity() {


    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            MyConstraintLayout()
        }
    }
    @Composable
    fun MyConstraintLayout(){
        ConstraintLayout {
            //用createRefs 创建组件的引用

            //用Modifier.constrainAs(xxx)进行连接赋值
            val (button,text)=createRefs();
            Button(onClick = {  }, modifier = Modifier.constrainAs(button){
                this.top.linkTo(parent.top, margin = 10.dp);
            }) {
                Text(text = "Button")
            }

            Text(text = "文本", modifier = Modifier.constrainAs(text){
                this.top.linkTo(button.bottom, margin = 10.dp);
            })
        }
    }

}

createRefs是强引用关系,我们可以通过类似android:id        这样的方式解耦
createRefFor(id) 参数id类似于android:id 取id的方法
如下:ConstraintLayout参数形式指定约束,实现横竖屏间距不等问题
 

    @Composable
    fun DecoupledConstraintLayout(){
        BoxWithConstraints {
            //横竖屏设置不一样的间距
            val constraints=if(this.maxWidth<this.maxHeight){
                decoupledConstraints(10.dp)
            }else{
                decoupledConstraints(60.dp)
            }
            ConstraintLayout(constraints) {
                Button(onClick = {  }, modifier = Modifier.layoutId("button")) {
                    Text(text = "Button")
                }
                Text(text = "文本", modifier = Modifier.layoutId("text"))
            }
        }
    }

    private fun decoupledConstraints(margin:Dp):ConstraintSet{
        return ConstraintSet{
            val button=createRefFor("button");
            val text=createRefFor("text");
            constrain(button){
                this.top.linkTo(this.parent.top,margin=margin);
            }
            constrain(text){
                this.top.linkTo(button.bottom,margin);
            }
        }
    }

JetPack Compose 学习笔记(持续整理中...),混合开发,android 开发,学习,笔记JetPack Compose 学习笔记(持续整理中...),混合开发,android 开发,学习,笔记

状态管理


状态管理的常见三个函数,remember、mutableStateOf、rememberSaveable的区别
mutableStateOf:标识这个data是有状态的,如果状态发生改变,所有引用这个状态的view都将重绘;
remember:存储值,当界面重新绘制,会读取之前的值,相当于在mutableStateOf之上包了一层,把这个变量存储脱离函数,那么即使这个函数再次执行这个值并不会变成初始值,但是如果页面切换就会失效
rememberSaveable:在remember上保证了可以在页面切换的过程中保存数据,rememberSaveable==remember+onSaveInstaneState+onCreate中的read savedInstanceState,当configChanges的时候,将remember的值写入bundle中,然后重新构建activity的时候,从bundle中读取数据

class StateActivity: ComponentActivity() {
    val vm:MyViewModel by viewModels<MyViewModel>();
    val s= androidx.compose.runtime.mutableStateOf("");
    @OptIn(ExperimentalMaterial3Api::class)
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            Column {
                //对于输入框如果不记录 就会一直输入不了,所以采取提升状态 方式将mutableStateOf升级为activity的成员
                test2(s.value) {
                    s.value = it;
                };

                //提升状态采用remember函数记录
                test();
            }
        }
    }

    @OptIn(ExperimentalMaterial3Api::class)
    @Composable
    fun test(){
        val (text,setText)= remember {
            mutableStateOf("");
        }
        Row {
            TextField(value =text , onValueChange ={
                setText(it)
            },
                    modifier = Modifier
                        .background(Color.Green))
            Button(onClick = {
                setText("");
            }, enabled = text.isNotBlank()) {
                Text(text = "搜索")
            }
        }
    }


    @OptIn(ExperimentalMaterial3Api::class)
    @Composable
    fun test2(value:String,onTextChange:(String)->Unit){
        Row {
            TextField(value =value , onValueChange =onTextChange,
                modifier = Modifier
                    .background(Color.Green))
            Button(onClick = {
                onTextChange("");
            }, enabled = value.isNotBlank()) {
                Text(text = "搜索")
            }
        }
    }

    class MyViewModel: ViewModel() {
        val state= MutableLiveData<Boolean>(true);
    }
}

JetPack Compose 学习笔记(持续整理中...),混合开发,android 开发,学习,笔记

下面将对博客进行分篇,点击下面的链接

Text组件文章来源地址https://www.toymoban.com/news/detail-651973.html

到了这里,关于JetPack Compose 学习笔记(持续整理中...)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 对于Android开发,我们为何要学Jetpack Compose?

    对于Android开发,我们为何要学Jetpack Compose?

    Jetpack Compose 是用于构建原生 Android 界面的新工具包。它可简化并加快 Android 上的界面开发,使用更少的代码、强大的工具和直观的 Kotlin API,快速让应用生动而精彩。Compose 使用全新的组件——可组合项 (Composable) 来布局界面,使用修饰符 (Modifier) 来配置可组合项。 为何Jetp

    2024年02月10日
    浏览(46)
  • 动脑学院Jetpack Compose学习笔记

    动脑学院Jetpack Compose学习笔记

    最近b站学习了一下Compose相关内容,整理了相关笔记,仅供大家参考。  资源链接如下,象征性收取1个积分 https://download.csdn.net/download/juliantem/88125198

    2024年02月15日
    浏览(10)
  • Android开发中的前五个代码异味:Jetpack Compose UI和MVVM

    Android开发中的前五个代码异味:Jetpack Compose UI和MVVM

    代码异味是指软件代码中潜在问题的指标,可能并不一定是错误,但可能会导致问题,如增加维护复杂性、降低性能或降低可读性。我们将探讨Android开发中的前五个代码异味,其中包括使用Jetpack Compose UI和Model-View-ViewModel(MVVM)架构的示例。 上帝对象或上帝类是指试图做太

    2024年02月02日
    浏览(14)
  • Android Jetpack Compose 别裁

    一、简介 二、compose优缺点 三、compose好学吗 四、Android Jetpack Compose 跟 fluter 哪个更好 五、Android Jetpack Compose 跟 fluter 技能学习选择 之所以叫Android Jetpack Compose别裁是希望能取舍网上的对compose的资料,推出别出心裁的文章,文章结束都会有一个案例,通过实践学习,让学习的

    2024年02月03日
    浏览(49)
  • Jetpack Compose: Hello Android

    Jetpack Compose: Hello Android

    Jetpack Compose 是一个现代化的工具包,用于使用声明式方法构建原生 Android UI。在本博文中,我们将深入了解一个基本的 “Hello Android” 示例,以帮助您开始使用 Jetpack Compose。我们将探讨所提供代码片段中使用的函数和注解。 在深入代码之前,请确保您已经准备好使用 Jetpac

    2024年03月10日
    浏览(57)
  • Android Jetpack Compose — Slider滑动条

    Android Jetpack Compose — Slider滑动条

            在Android Jetpack Compose中,Slider(滑动条)是一个常用的用户界面控件,它允许通过滑动条来选择一个范围或数值。Slider控件非常适用于调整音量、亮度、进度等需要连续调整的场景。 一、Slider的属性         Slider是Android Jetpack Compose中的一个控件,用于实现滑动条

    2024年02月11日
    浏览(45)
  • 探索Android Jetpack Compose的Surface组件

    探索Android Jetpack Compose的Surface组件

    随着声明性 UI 框架 Jetpack Compose 的出现,Android 开发变得更加简洁和直观。在这篇博客中,我们将深入探讨其中的一项基本构建块 —— Surface 组件,了解它如何影响 UI 的显示和设计。 一、Jetpack Compose和Surface组件 二、Surface组件的基本使用 三、影响Surface的属性 一、Jetpack Co

    2024年02月11日
    浏览(50)
  • Android Jetpack Compose之RadioGroup的使用

    Android Jetpack Compose之RadioGroup的使用

    Android Jetpack Compose是一个现代化的UI工具包,帮助开发者以声明式的方式构建出美观且功能强大的Android应用。在本文中,我们将详细介绍其中的一个重要组件—— RadioGroup 。 一. RadioGroup简介 Jetpack Compose中并没有像传统View系统中那样直接提供 RadioGroup ,但我们可以很方便地通

    2024年02月06日
    浏览(51)
  • Android Jetpack Compose实现轮播图效果

    Android Jetpack Compose实现轮播图效果

    在最近思索如何使用Compose方式改进我的开源TMDB电影列表应用程序的主屏幕时,一个激动人心的概念浮现在我的脑海中——为什么不整合一个吸引人的轮播图来展示即将上映的电影呢?在本文中,我将分享我的开发和实现自定义轮播图的经历,提供涉及不同步骤的见解。 首先

    2024年02月08日
    浏览(69)
  • Android Jetpack Compose中使用字段验证的方法

    Android Jetpack Compose中使用字段验证的方法

    数据验证是创建健壮且用户友好的Android应用程序的关键部分。随着现代UI工具包Jetpack Compose的引入,处理字段验证变得更加高效和直观。在这篇文章中,我们将探讨如何在Android应用中使用Jetpack Compose进行字段验证。 字段验证是确保用户在各种输入字段中输入的数据符合特定

    2024年02月11日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包