当前位置:   article > 正文

Jetpack Compose实战教程(二)_jetpack compose 新建activity

jetpack compose 新建activity

Jetpack Compose实战教程(二)

第二章 实战一个简易的页面



一、本章目标

在这里插入图片描述
上图即为我们本章要实现的功能,看起来很简单,如果使用xml的话,相信各位看官很快就能实现出来,那么我们来看一下,如果是使用xml的话,我们大致需要哪些:
1.设置全屏背景为黑色
2.头部有一个横向布局(返回图片和标题)
3.滚动布局(scrollview),里面嵌套一个线性布局
4.几个文本Textview

二、了解我们本章将要用到的几种布局

本章我们将要用到的布局分别有Box、Column、Row,它们也是我们接下来的开发实践中使用的最多的布局方式,用一张图来看看它们的区别
在这里插入图片描述

2.1 Box布局

Box布局类似于我们xml里面的RelativeLayout,按照编写代码的顺序,下一个布局会覆盖在上一个布局上方,起点都为左上角

2.2 Row布局

Row布局类似于我们的LinearLayout,并且设置了方向是horizontal

2.3 Column布局

Column 布局类似于我们的LinearLayout,并且设置了方向是vertical

三、开始编码

3.1 新建一个Activity

创建一个activity,并编写最基本的代码

class HeartbeatRuleActivity:ComponentActivity() {
	override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //这行代码只是强制页面竖屏显示,各位看官根据需要来决定是否加这行代码
        requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
        setContent {
            contentUI() //为了方便预览,我将布局文件抽离了出来
        }
    }
}

@Composable
    fun contentUI(){
        BaseTheme{
	        Surface(
	                modifier = Modifier.fillMaxSize(),
	                color = Color.Transparent
	            ) {
	            }
        }
    }

	@Preview(showBackground = true)
    @Composable
    fun previewUI(){
    //看到抽离出来的好处了吗?调用的同一个函数,只要有修改,就能预览了
        contentUI() 
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

3.2 设置一个背景

根据设计图,背景是一个黑色的

	@Composable
    fun contentUI(){
        BaseTheme{
        //整体的布局使用了Surface,然后Modifier.fillMaxSize表示宽高都为屏幕的宽高
            Surface(
                modifier = Modifier.fillMaxSize(),
                color = Color.Transparent
            ) {
            //这里同样设置Modifier.fillMaxSize(),但这个宽高是受外部的Surface的宽高限制的
            //只有当外部的Surface的宽高为屏幕的宽高,那么fillMaxSize才能达到屏幕宽高
            //就相当于我们xml里面的match_parent
            //然后设置全局背景为黑色
                Box(Modifier.fillMaxSize().background(Color.Black)) {
                /**
                *这里添加一种写法,如果背景是一张图片的话,则用到以下代码
                *各位看官可以自己试试,上面的background是不可以设置图片的
                    Image(
                        painter = painterResource(id = R.mipmap.ic_common_bg),
                        contentDescription = null,
                        Modifier.fillMaxWidth().fillMaxHeight()
                    )
                    */
                  
                }
            }
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

3.3 添加头部

同样的,我将头部的方法抽离出来

	@Composable
    fun title(){
    //Modifier.fillMaxWidth() 表示这个Box布局的宽度为屏幕的宽度
    //没有设置高度的情况下,高度就取决于内容的高度,自适应
        Box(Modifier.fillMaxWidth()){
            Image(painter = painterResource(id = R.mipmap.ic_back_white2),
                null,
                modifier = Modifier
                    .size(48.dp)
                    //根据UI图的话,图片的大小是24dp*24dp,为了扩大点击热点
                    //所以上面设置了size为48dp,然后padding为12dp
                    //这里请留意,compose里面是没有margin的,只有padding,那么到底是
                    //margin还是padding就取决于上下文以及调用padding的顺序
                    .padding(12.dp) 
                    .clickable { //添加点击事件
                        finish()
                    }
            )

            Text(
                text = "心动信号规则描述",
                //这里请留意,如果是要像我这样使用十六进制的颜色的话,一定要是argb
                //比如如果写成0xffffff是会报错的
                color = Color(0xffffffff), 
                fontSize = 18.sp,
                fontWeight = FontWeight.Bold,
                modifier = Modifier.align(alignment = Alignment.Center)
            )
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

然后将头部添加到内容里面

@Composable
    fun contentUI(){
        BaseTheme{
            Surface(
                modifier = Modifier.fillMaxSize(),
                color = Color.Transparent
            ) {
                Box(Modifier.fillMaxSize().background(Color.Black)) {
                   
                    Column {
                        title()
                        
                    }

                }
            }
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

3.4 添加内容

同样的,内容也抽离出来

@Composable
    fun content(){
        Column(
            Modifier
            //添加代码表示布局超过一行可以滚动,就不用写ScrollView了
                .verticalScroll(rememberScrollState()) 
                .padding(16.dp, 16.dp, 0.dp, 0.dp)) {

            Text(text = "一、心动匹配方式描述",
                fontWeight = FontWeight.Bold,
                color = Color.White,
                fontSize = 16.sp
            )

            Text(text = "内容,这里我简化了",
                Modifier.padding(top = 8.dp,end = 16.dp),
                fontSize = 12.sp,
                fontWeight = FontWeight.Bold,
                color = Color(0x99ffffff)
                )

            Text(text = "二、道具卡功能说明",
                Modifier.padding(top = 16.dp),
                fontWeight = FontWeight.Bold,
                color = Color.White,
                fontSize = 16.sp
            )

            Text(
                text = "内容,这里我简化了",
                Modifier.padding(top = 8.dp,end = 16.dp),
                fontSize = 12.sp,
                fontWeight = FontWeight.Bold,
                color = Color(0x99ffffff)
                )

            Text(
                text = "内容,这里我简化了",
                Modifier.padding(top = 12.dp,end = 16.dp),
                fontSize = 12.sp,
                fontWeight = FontWeight.Bold,
                color = Color(0x99ffffff)
            )

            Text(
                text = "内容,这里我简化了",
                Modifier.padding(top = 12.dp,end = 16.dp),
                fontSize = 12.sp,
                fontWeight = FontWeight.Bold,
                color = Color(0x99ffffff)
            )
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53

然后将内容也添加进去

@Composable
    fun contentUI(){
        BaseTheme{
            Surface(
                modifier = Modifier.fillMaxSize(),
                color = Color.Transparent
            ) {
                Box(Modifier.fillMaxSize().background(Color.Black)) {
                    
                    Column {
                        title()
                        content()
                    }

                }
            }
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

3.5 美化布局

OK,运行,界面是出来了,不过有点丑,和我们的UI图布局不太一样,表现为:

  1. 滑动到底部之后,文字都贴底了,不美观
  2. 导航条的颜色和我们的对应不上,没有做沉浸式

我们给底部也添加一个间距,文字就不会贴底了

@Composable
    fun content(){
        Column(
            Modifier
                .verticalScroll(rememberScrollState())
                .padding(16.dp, 16.dp, 0.dp, 0.dp)) {

            // ....这里省略了上面的布局代码
            //Spacer标签就类似于xml里面的View标签,这里就是设置一个空白高度
            Spacer(modifier = Modifier.height(82.dp))
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

接下来就是沉浸式了

@Composable
    fun contentUI(){
        BaseTheme{
        //添加这行代表,让内容可以延伸到导航栏
            WindowCompat.setDecorFitsSystemWindows(window, false)
            Surface(
                modifier = Modifier.fillMaxSize(),
                color = Color.Transparent
            ) {
                Box(Modifier.fillMaxSize()) {
                    Image(
                        painter = painterResource(id = R.mipmap.ic_common_bg),
                        contentDescription = null,
                        Modifier.fillMaxWidth().fillMaxHeight()
                    )
                    Column {
                    //页面布局既然延伸到导航条了,那么我们的布局就要把导航条的空间留出来
                    //不然title布局就被导航条遮挡啦
                        Spacer(
                            modifier = Modifier.height(
                                DimenUtil.px2dp(this@HeartbeatRuleActivity,StatusBarUtils.getStatusBarHeight(this@HeartbeatRuleActivity).toFloat()).dp)
                        )
                        title()
                        content()
                    }

                }
            }
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

到此,一个简单的页面已经完工,大家一定要亲自编写代码,才会发现一些细节问题

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/917653
推荐阅读
相关标签
  

闽ICP备14008679号