Jetpack Compose实战教程(六)

news2024/11/27 21:00:13

Jetpack Compose实战教程(六)

第六章 没有了margin,如何区分外边距?内边距?


文章目录

  • Jetpack Compose实战教程(六)
  • 一、前言
  • 二、本章目标
  • 三、开始编码
    • 3.1 特殊情况下的margin
    • 3.2 使用padding设置外边距
    • 3.3 使用padding设置内边距
    • **修饰符(Modifier)的函数调用先后顺序很重要!!**
    • **修饰符(Modifier)的函数调用先后顺序很重要!!**
    • **修饰符(Modifier)的函数调用先后顺序很重要!!**


一、前言

我们在写xml布局的时候,经常会用到android:margin属性,毕竟除了居中以外,固定位置的偏移就得用到margin,xml中我们使用margin来设置外边距,使用padding来设置内边距。但在compose中,没有了margin属性,只有一个padding,那么我们如何设置外边距和内边距呢?

二、本章目标

能熟练的使用padding来设置内边距和外边距

友情提醒,如果各位看官有不懂的代码可以先看一下之前的章节,循序渐进,如果还是有不懂的,可以给我留言

三、开始编码

请留意:以下代码都是在清单文件中设置了横屏的

3.1 特殊情况下的margin

之所以先说特殊情况下的margin,是为了防止杠精说:明明有margin啊,只是要引入一个组件而已。没错,它就是我们第四章中提到的ConstraintLayout。 compose中的约束布局用法基本和xml一致,第四章我们也进行了一些解析,这里我们就简单上代码说明一下margin的使用

BaseTheme {
            Surface(
                modifier = Modifier.fillMaxSize(),
                color = MaterialTheme.colorScheme.background
            ) {
                ConstraintLayout(
                    Modifier
                        .fillMaxSize()
                        .background(color = Color.Yellow)) {
                    Box(modifier = Modifier
                        .size(200.dp)
                        .constrainAs(createRef()) {
                            top.linkTo(parent.top,100.dp)
                            start.linkTo(parent.start,100.dp)
                        }.background(color = Color.Blue))
                }
            }
        }

在这里插入图片描述

3.2 使用padding设置外边距

在使用xml代码时,我们设置外边距(margin)是在子View设置的,比如有如下代码:

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:background="#ffff00">

    <RelativeLayout
        android:layout_width="200dp"
        android:layout_height="200dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        android:background="#0000ff"
        android:layout_marginTop="100dp"
        />

</androidx.constraintlayout.widget.ConstraintLayout>

这段代码产生的UI效果如下:
在这里插入图片描述
但在compose中,设置外边距恰恰是反过来的,它是在父View中设置,等价的代码写法如下:

BaseTheme {
            Surface(
                modifier = Modifier.fillMaxSize(),
                color = MaterialTheme.colorScheme.background
            ) {
                ConstraintLayout(
                    Modifier
                        .fillMaxSize()
                        .background(color = Color.Yellow).padding(top=100.dp)) {
                    Box(modifier = Modifier
                        .size(200.dp)
                        .constrainAs(createRef()) {
                            top.linkTo(parent.top)
                            start.linkTo(parent.start)
                        }.background(color = Color.Blue))
                }
            }
        }

这时候,有好奇的小伙伴会问了,那如果我就把这个padding写到Box 里面去,会出现什么效果呢?那么我们就来实践一下

BaseTheme {
            Surface(
                modifier = Modifier.fillMaxSize(),
                color = MaterialTheme.colorScheme.background
            ) {
                ConstraintLayout(
                    Modifier
                        .fillMaxSize()
                        .background(color = Color.Yellow)) {
                    Box(modifier = Modifier
                        .size(200.dp)
                        .constrainAs(createRef()) {
                            top.linkTo(parent.top)
                            start.linkTo(parent.start)
                        }.background(color = Color.Blue)
                        .padding(top=100.dp)
                    )
                }
            }
        }

运行结果如下:
在这里插入图片描述
可以看到,我们移除了ConstraintLayout(父View)的padding,所以Box(子View)的外间距就没有了,而我们在Box 设置的padding是应用于Box的子View的外边距,那么我们现在来给Box添加一下子View

BaseTheme {
            Surface(
                modifier = Modifier.fillMaxSize(),
                color = MaterialTheme.colorScheme.background
            ) {
                ConstraintLayout(
                    Modifier
                        .fillMaxSize()
                        .background(color = Color.Yellow)) {
                    Box(modifier = Modifier
                        .size(200.dp)
                        .constrainAs(createRef()) {
                            top.linkTo(parent.top)
                            start.linkTo(parent.start)
                        }
                        .background(color = Color.Blue)
                        .padding(top = 100.dp)
                    ){
                        Box(modifier = Modifier.size(100.dp).background(color = Color.Red))
                    }
                }
            }
        }

在这里插入图片描述
这样就很好理解了吧

3.3 使用padding设置内边距

在尝试使用padding设置内边距之前,大家需要先留意一个坑,这也是为什么我上面的例子全部是用background 来说明的原因,在xml中,我们可以给一个View设置android:background属性,然后如果再设置android:alpha是可以应用到背景上的,并且不需要关心属性设置的先后顺序,比如如下代码:

<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:background="#ffff00">

    <RelativeLayout
        android:layout_width="200dp"
        android:layout_height="200dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        android:background="#0000ff"
        android:alpha="0.6"
        android:layout_marginTop="100dp"
        />

</androidx.constraintlayout.widget.ConstraintLayout>

在这里插入图片描述
我们设置的颜色是蓝色,但因为设置了40%的透明度,最终和黄色的底色交融,就变成了这个灰色,但使用compose的话,必须要将alpha的属性提前,否则将失效,所以重要的话说三遍:

修饰符(Modifier)的函数调用先后顺序很重要!!

修饰符(Modifier)的函数调用先后顺序很重要!!

修饰符(Modifier)的函数调用先后顺序很重要!!

那么我们来看compose的等价代码:

BaseTheme {
            Surface(
                modifier = Modifier.fillMaxSize(),
                color = MaterialTheme.colorScheme.background
            ) {
                ConstraintLayout(
                    Modifier
                        .fillMaxSize()
                        .background(color = Color.Yellow).padding(top = 100.dp)) {
                    Box(modifier = Modifier
                        .size(200.dp)
                        .constrainAs(createRef()) {
                            top.linkTo(parent.top)
                            start.linkTo(parent.start)
                        }
                        .alpha(0.6f) //如果这行代码放在.background之后,那么将失效
                        .background(color = Color.Blue)
                    )
                }
            }
        }

好,进入整体,为了让大家更好的理解内边距,这里我不再单纯使用background,而是添加一张图片,我们先看如下代码:

BaseTheme {
            Surface(
                modifier = Modifier.fillMaxSize(),
                color = MaterialTheme.colorScheme.background
            ) {
                ConstraintLayout(
                    Modifier
                        .fillMaxSize()
                        .background(color = Color.Yellow)
                        .padding(50.dp)) {
                    Box(modifier = Modifier
                        .size(200.dp)
                        .constrainAs(createRef()) {
                            top.linkTo(parent.top)
                            start.linkTo(parent.start)
                        }
                        .background(color = Color.Blue)){
                        Image(painter = painterResource(id = R.mipmap.ic_person_detail_delete_unable),
                         contentDescription = null, modifier = Modifier.background(color = Color.Green)
                         .size(100.dp).padding(20.dp))
                    }
                }
            }
        }

在这里插入图片描述
但还记得我们上面说的“修饰符(Modifier)的函数调用先后顺序很重要!!” 吗?让我们来稍微改一下代码,改变一下padding的位置

BaseTheme {
            Surface(
                modifier = Modifier.fillMaxSize(),
                color = MaterialTheme.colorScheme.background
            ) {
                ConstraintLayout(
                    Modifier
                        .fillMaxSize()
                        .background(color = Color.Yellow)
                        .padding(50.dp)) {
                    Box(modifier = Modifier
                        .size(200.dp)
                        .constrainAs(createRef()) {
                            top.linkTo(parent.top)
                            start.linkTo(parent.start)
                        }
                        .background(color = Color.Blue)){
                        Image(painter = painterResource(id = R.mipmap.ic_person_detail_delete_unable), 
                        contentDescription = null, modifier = Modifier.background(color = Color.Green)
                        .padding(20.dp).size(100.dp)) //我们将padding的调用提升至size之前
                    }
                }
            }
        }

在这里插入图片描述
由于我们在设置图片的size之前先设置了padding,所以最终Image所占据的宽高都加上了padding的值,就变成了140dp,这也是实际开发中我们最容易疏忽的地方


至此,各位看官应该可以比较熟练的运用padding来设置内外边距了,实践大于阅读,一定要去实际使用才能牢固的掌握哦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2034989.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Springboot+netty 的IM聊天室弹幕

代码地址 仓库地址 聊天室 创建springboot项目 因为我的NettyServer 是8080 所以我把服务端口改为了8081 引入netty 依赖 <dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.92.Final</versi…

Prometheus+Grafana保姆笔记(1)——Prometheus+Grafana的安装

Prometheus Grafana 的组合在微服务项目中可以完成许多DevOps任务&#xff0c;它们共同提供了强大的监控和可视化功能。 我们陆续介绍Prometheus Grafana 的相关用法。 首先介绍PrometheusGrafana的安装。 安装 Prometheus Prometheus 是GO写的&#xff0c;并不依赖于 Ja…

【深度学习】注意力机制(Transformer)

注意力机制 1.基础概念 1.1 查询、键和值 在人类的注意力方式中&#xff0c;有自主性的与非自主性的注意力提示两种解释方式。所谓自主性注意力提示&#xff0c;就是人本身主动想要关注到的某样东西&#xff1b;非自主性提示则是基于环境中物体的突出性和易见性&#xff0c;…

8.13面试题目

美团商业分析实习生 一、8个球有一个重一点&#xff0c;最少称几次找出 2次 8个球中有一个重一点&#xff0c;最少称2次能找出来。 具体称重步骤如下&#xff1a; 第一次称重&#xff1a;将8个球分成三组&#xff0c;分别为3个球、3个球和2个球。将两组各3个球放在天平的两端…

【搜索二维矩阵】python刷题记录

R4-二分查找专题 直接二维变一维&#xff0c;然后二分查找就可以了 class Solution:def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:nums[i for row in matrix for i in row]def binfind(the,target):low,high0,len(the)-1while low<high:mid(l…

猫罐头挑选指南!猫咪肥胖有什么危害?健康主食罐挑选攻略!

今天有位铲屎官带着一只17斤的布偶来我们医院。猫猫三岁了&#xff0c;绝育两年&#xff0c;现在因为太胖了&#xff0c;舔毛都不太方便。铲屎官说它平时不太爱动。我给体检后发现甘油三酯高&#xff0c;其他都正常&#xff0c;但必须开始减肥了&#xff0c;猫咪太胖可不好。 一…

江协科技STM32学习笔记

第01章 STM32简介及开发环境搭建 1.1 STM32简介 1.1.1 STM32F103C8T6 系列&#xff1a;主流系列STM32F1 内核&#xff1a;ARM Cortex-M3 主频&#xff1a;72MHz RAM&#xff1a;20K&#xff08;SRAM&#xff09; ROM&#xff1a;64K&#xff08;Flash&#xff09; 供电…

开学季好物分享!全能抗打运动耳机!

大家好&#xff01;开学季来临&#xff0c;在学校的时候&#xff0c;一些运动和体育项目是在所难免的&#xff0c;但是在运动过程中肯定是枯燥无味的&#xff0c;所以这时候就需要一款合适的运动耳机陪伴我们。作为一名对运动耳机有较高要求的学生&#xff0c;我最近发现了一款…

配置jconsole远程监控

# 启动命令 -Djava.rmi.server.hostname192.168.0.67 #java程序所在机器ip -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port8011 #jconsole端口 -Dcom.sun.management.jmxremote.authenticatetrue # 配置为false 就不需要后面的password和access配置 -D…

普元EOS-用户、角色、权限的设计思路

1 前言 普元EOS作为企业应用开发&#xff0c;肯定要对用户、角色、权限这些内容进行管理&#xff0c;本文就描述这些内容EOS的设计思想&#xff0c;以及如何使用这些工具。 2 传统的访问权限控制 先说一个RBAC的概念&#xff0c;就是 Role-Based Access Control&#xff0c;中…

Java Web —— 第五天(请求响应2)

响应数据 ResponseBody 类型:方法注解、类注解 位置: Controller方法上/类上 作用:将方法返回值直接响应&#xff0c;如果返回值类型是 实体对象/集合&#xff0c;将会转换为JSON格式响应 说明: RestController Controller ResponseBody ; package com.example.springbo…

嘉实基金“青黄不接”:董事长赵学军被调查,明星经理基金绿油油

尚未实现“打造中国版的贝莱德”之梦&#xff0c;手握万亿资产管理规模的嘉实基金便“出事”了。 近日&#xff0c;嘉实基金在官网披露了一则临时公告&#xff0c;称其于2024年8月9日从相关方面获悉&#xff0c;该公司董事长赵学军因个人问题正配合有关部门调查。目前&#xf…

录音怎么转换成mp3格式?6款免费音频转换mp3的软件大公开!(赶紧收藏)

录音怎么转换成mp3格式&#xff1f;录音是我们日常记录生活和工作的常见方式之一。然而&#xff0c;不同的音频格式往往会带来兼容性和播放上的困难。如果您曾因为无法播放某个录音而烦恼&#xff0c;或者希望能够方便地将录音转换成mp3格式&#xff0c;那么本文就能告诉您答案…

那些年我们一起遇到过的奇技淫巧

EVAL长度限制突破技巧 PHP Eval函数参数限制在16个字符的情况下 &#xff0c;如何拿到Webshell&#xff1f; 写一段限制长度在小于17位的字符&#xff0c;拿下webshell <?php highlight_file(__FILE__); $param $_REQUEST[param]; if (strlen($param) < 17 &&am…

【安卓】播放多媒体文件

文章目录 播放音频播放视频 播放音频 在Android中播放音频文件一般是使用MediaPlayer类实现的&#xff0c;它对多种格式的音频文件提供了非常全面的控制方法&#xff0c;从而使播放音乐的工作变得十分简单。 MediaPlayer类中常用的控制方法。 常用方法名描述setDataSource()设…

合作文章(IF=14.3)|RNA-Seq和ChIP-Seq助力SOX12调节肝癌细胞的机制研究以及肝癌联合治疗的免疫策略的发现

肝细胞癌(HCC)是全球严重的健康负担。长期以来&#xff0c;HCC的治疗选择很少&#xff0c;但免疫检查点阻断(ICB)近年来取得了重大突破。在肿瘤免疫微环境(TIME)中&#xff0c;免疫细胞通过配对的免疫检查点或其他信号与肿瘤细胞相互作用&#xff0c;形成异质的免疫抑制生态系统…

AI高级肖像动画神器LivePortrait

文章目录 前言一、安装1.1 源码安装1.2 windows一键启动包 二、人像生成2.1 浏览器2.2 输入图像2.3 选择驱动视频2.4 生成2.5 结果 三、动物生成3.1 浏览器3.2 输入图片3.3 选择视频3.4 生成3.5 最终结果 四、软件获取 前言 最近&#xff0c;快手可灵大模型团队、中国科学技术…

go 事件机制(观察者设计模式)

背景&#xff1a; 公司目前有个业务&#xff0c;收到数据后&#xff0c;要分发给所有的客户端或者是业务模块&#xff0c;类似消息通知这样的需求&#xff0c;自然而然就想到了事件&#xff0c;观察者比较简单就自己实现以下&#xff0c;确保最小功能使用支持即可&#xff0c;其…

LeetCode旋转图像

题目描述&#xff1a; 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3]…

100 Exercises To Learn Rust 挑战!构文・整数・变量

前一篇文章 【0】准备 【1】构文・整数・变量 ← 本次全部文章列表 《100 Exercise To Learn Rust》第2回&#xff0c;也就是实际演习的第1回&#xff01;从这次开始&#xff0c;我们会适度减少前置说明&#xff0c;直接进入问题的解决&#xff01; 本次的相关页面 1.1. Syn…