Compose 修饰符 - 外观(尺寸、样式、布局、行为)

compose——侧边栏(抽屉) 【代码】compose——侧边栏。 阅读详情

通过链式调用串接API,因此顺序会影响最终结果(例如边距padding)。

一、尺寸

1.1 指定具体值

设置首选值(如果指定的大小不满足父布局的约束,则尺寸将会无效。如果强制设置而不考虑父控件约束使用 requiredSize)。

width

.width(width: Dp)

.width(intrinsicSize: IntrinsicSize)        //参数为 IntrinsicSize.Min 或 IntrinsicSize.Max

height

.height(height: Dp)

.height(intrinsicSize: IntrinsicSize)

size

.size(size: Dp)        //同时设置宽高

.size(width: Dp, height: Dp)        //分开设置宽高

Modifier.width(5.dp).height(5.dp)
Modifier.size(5.dp)    //同时设置宽高

1.2 强制使用指定值

.requiredWidth(width: Dp)
.requiredHeight(height: Dp)
.requiredSize(size: Dp)

@Preview(showBackground = true)
@Composable
fun Demo1() {
    Column(modifier = Modifier.size(100.dp)) {
        Image(
            painter = painterResource(id = R.drawable.logo_wechat_rectangle),
            contentDescription = null,
            modifier = Modifier.size(150.dp)    //大于父控件尺寸,无效
        )
    }
}

@Preview(showBackground = true)
@Composable
fun Demo2() {
    Column(modifier = Modifier.size(100.dp)) {
        Image(
            painter = painterResource(id = R.drawable.logo_wechat_rectangle),
            contentDescription = null,
            modifier = Modifier.requiredSize(150.dp)    //强制使用指定值
        )
    }
}

1.3 占可用空间百分比

取值范围0.0~1.0。

.fillMaxWidth(fraction: Float = 1f)

.fillMaxHeight(fraction: Float = 1f)

.fillMaxSize(fraction: Float = 1f)

Modifier.fillMaxWidth(0.5f).fillMaxHeight(0.5f)
Modifier.fillMaxSize(0.5f)    //同时设置宽高

1.4 设置范围

限定在最大值和最小值之间。

.widthIn(min: Dp = Dp.Unspecified, max: Dp = Dp.Unspecified)

.heightIn(min: Dp = Dp.Unspecified, max: Dp = Dp.Unspecified)

.sizetIn(min: Dp = Dp.Unspecified, max: Dp = Dp.Unspecified)

父容器和子元素width一致,只看height
父heightIn(min=10、max=40)子 < 父:子显示3,父显示10
子 = 父:高度显示一致
子 > 度:都为父最大值40
父heightIn(min=50)子 < 父:子显示30,父显示50
子 = 父:高度显示一致
子 > 度:都为子高度100
父height(max=50)子 < 父:都为子高度30
子 = 父:高度显示一致
子 > 度:都为父最大值50
@Composable
fun Demo() {
    Box(Modifier
        .background(Color.Blue)
        .width(50.dp)
        .heightIn(min = 10.dp,max = 40.dp)
    ){
        Box(Modifier
            .background(Color.Red)
            .width(25.dp)
//            .height(30.dp)  //子元素在范围内,蓝色和红色一样高
//            .height(900.dp)  //子元素高于最大值,红色蓝色都显示40dp
            .height(3.dp)  //子元素低于最小值,红色显示3dp,蓝色显示10dp
        )
    }
}

1.5 权重

其它组件正常设置尺寸,设置了 weight(1F) 的组件会填充剩余布局。

    fun Modifier.weight(
        @FloatRange(from = 0.0, fromInclusive = false) weight: Float,
        fill: Boolean = true,        //为 true 时元素将占据所分配的全部高度
    ): Modifier

1.6 根据自身内容决定大小

根据固有特性测量决定。尽可能设置固定尺寸,或者用 remember 缓存固有特性计算结果再用。

例如可以让 Image 根据自身内容来决定控件的大小。根据子元素的宽高来确定自身的大小,如果自身设置了最小宽高的话则会被忽略。当无边界 unbounded = true 的时候,自身设置了最大宽高的话也会被忽略。

.wrapContentWidth(
    align: Alignment.Horizontal = Alignment.CenterHorizontally,        //对齐方式
    unbounded: Boolean = false
)
.wrapContentHeight(
    align: Alignment.Vertical = Alignment.CenterVertically,
    unbounded: Boolean = false
)
.wrapContentSize(
    align: Alignment = Alignment.Center,
    unbounded: Boolean = false
)
@Composable
fun Demo() {
    Column(modifier = Modifier.width(50.dp)) {
        Image(
            painter = painterResource(id = R.drawable.logo_baidu),
            contentDescription = null,
            modifier = Modifier.wrapContentSize()
        )
    }
}

1.7 宽高比

aspectRatio()fun Modifier.aspectRatio(
    @FloatRange(from = 0.0, fromInclusive = false) ratio: Float,
    matchHeightConstraintsFirst: Boolean = false,        //是否以高度为准适配宽度
)
Modifier.aspectRatio(1f)    //正方形
Modifier.aspectRatio(16f / 9f)    //16:9

二、样式

2.1 边距 padding

由于调整链式调用的顺序就能实现内外边距,因此是没有margin的。

分别设置:上下左右.padding(
    start = 0.dp,
    top = 0.dp,
    end: Dp = 0.dp,
    bottom: Dp = 0.dp
)
分别设置:水平、垂直.padding(
    horizontal: Dp = 0.dp,
    vertical: Dp = 0.dp
)
同时设置.padding(all: Dp)

val paddingValues = PaddingValues(10.dp,20.dp,30.dp,40.dp)

@Composable
fun Demo() {
    //传入一个PaddingValues对象
    Box(Modifier.padding(paddingValues)) {}
}

2.3 背景 background

.background(
    color: Color,        //颜色
    shape: Shape = RectangleShape        //形状
)

.background(

    brush: Brush,        //

    shape: Shape = RectangleShape,

    @FloatRange(from = 0.0, to = 1.0)

    alpha: Float = 1.0f

)

2.4 剪裁 clip

根据传入的 Shape 可以裁剪成对应的形状。

.clip(shape: Shape)

可传:CircleShape圆形、RectangleShape矩形、RoundedCornerShape圆角矩形、CutCornerShape切角矩形

@Composable
fun Demo() {
    Image(
        painter = painterResource(id = R.drawable.logo_wechat_square),
        contentDescription = null,
        modifier = Modifier.clip(CircleShape)
    )
}

2.5 边框 border

.border(width: Dp, brush: Brush, shape: Shape)

@Composable
fun Demo() {
    Image(
        painter = painterResource(id = R.drawable.logo_wechat_square),
        contentDescription = null,
        modifier = Modifier.border(
            width = 2.dp,
            color = Color.Blue,
            shape = CircleShape
        )
    )
}

2.6 阴影 shadow

详见

2.7 透明度 alpha

fun Modifier.alpha(
    alpha: Float        //取值范围0~1F
)

@Composable
fun Demo() {
    Column {
        Image(
            painterResource(id = R.drawable.logo_wechat_square),
            contentDescription = null,
            modifier = Modifier.alpha(0.8F)
        )
        Image(
            painterResource(id = R.drawable.logo_wechat_square),
            contentDescription = null,
            modifier = Modifier.alpha(0.3F)
        )
    }
}

2.8 模糊

2.8.1 Modifier.blur()

预设两种通过 BlurredEdgeTreatment 伴生对象调用:Rectangle和Unbounded。或者通过构造传个 Shape,Shape 不包含的区域不会显示。

blur()

fun Modifier.blur(
    radius: Dp,
    edgeTreatment: BlurredEdgeTreatment = BlurredEdgeTreatment.Rectangle,
)

fun Modifier.blur(
    radiusX: Dp,
    radiusY: Dp,
    edgeTreatment: BlurredEdgeTreatment = BlurredEdgeTreatment.Rectangle,
): Modifier

分别设置横向纵向的模糊半。

@Composable
fun BlurScreen() {
    Row {
        Image(
            modifier = Modifier.size(100.dp),
            painter = painterResource(R.drawable.rainbow),
            contentDescription = ""
        )
        Image(
            modifier = Modifier.size(100.dp)
                .blur(
                    radius = 30.dp,
                    edgeTreatment = BlurredEdgeTreatment.Unbounded
                ),
            painter = painterResource(R.drawable.rainbow),
            contentDescription = ""
        )
        Image(
            modifier = Modifier.size(100.dp)
                .blur(
                    radius = 10.dp,
                    edgeTreatment = BlurredEdgeTreatment.Rectangle
                ),
            painter = painterResource(R.drawable.rainbow),
            contentDescription = ""
        )
        Image(
            modifier = Modifier.size(100.dp)
                .blur(
                    radius = 10.dp,
                    edgeTreatment = BlurredEdgeTreatment(CircleShape)
                ),
            painter = painterResource(R.drawable.rainbow),
            contentDescription = ""
        )
    }
}

2.8.2 Modifier.graphicsLayer()

对 graphicsLayer() 的 renderEffect 赋值为 BlurEffect() 实现模糊效果,通过 clip = true 解决超出组件边界的问题,但裁剪后 Clamp、Repeated、Mirror 效果就没区别了。

BlurEffect()

public fun BlurEffect(
    radiusX: Float,        //x轴模糊半径
    radiusY: Float,        //y轴模糊半径
    edgeTreatment: TileMode = TileMode.Clamp        //边缘模糊模式
): BlurEffect

原图
TileMode.Clamp (默认)

会超出原图大小,超出边界后使用边界颜色继续。

TileMode.Repeated

会超出原图大小,右边超出边缘后采用了左边的颜色顺序继续。

TileMode.Mirror

会超出原图大小,右边超出边缘后采用了右边颜色倒过来的顺序继续。

TileMode.Decal

不会超出原图大小,更糊有暗角。

@Composable
fun Demo(
    renderEffect: RenderEffect? = null
) {
    Box(
        modifier = Modifier.size(150.dp).background(Color.Green),
        contentAlignment = Alignment.Center
    ) {
        Image(
            modifier = Modifier
                .size(100.dp)
                .graphicsLayer(
                    renderEffect = BlurEffect(20f, 20f),    //默认Clamp
                    clip = true
                ),
            painter = painterResource(R.drawable.rainbow),
            contentDescription = ""
        )
    }
}

2.9 跑马灯

basicMarquee()

fun Modifier.basicMarquee(
    iterations: Int = Iterations,
    animationMode: MarqueeAnimationMode = Immediately,
    repeatDelayMillis: Int = RepeatDelayMillis,
    initialDelayMillis: Int = if (animationMode == Immediately) repeatDelayMillis else 0,
    spacing: MarqueeSpacing = Spacing,
    velocity: Dp = Velocity,
): Modifier

参数 iterations:动画重复次数。Int.MAX_VALUE 表示无限重复,0 表示禁用。

参数 animationMode:跑马灯应立即开始动画还是仅在获得焦点时开始。在 WhileFocused 模式下,被修饰节点或其内容必须可聚焦。注意:initialDelayMillis 属于动画的一部分,因此此参数决定的是初始延迟何时开始倒计时,而非内容何时开始实际滚动。

参数 repeatDelayMillis:每次滚动前的等待时长。

参数 initialDelayMillis:首次迭代开始前的等待时长(毫秒)。默认情况下,若 animationMode 为 WhileFocused 则无初始延迟,否则初始延迟与 repeatDelayMillis 相同。

参数 spacing:指定内容末尾在重新显示开头之前应留出的空间间隔。

参数 velocity:动画速度(单位:dps/秒)。正速度表示跑马灯将沿当前 LayoutDirection 方向滚动。

三、布局

3.1 子元素对齐 align

Compose能理解当前代码所处作用域,例如给一个纵向布局设置子元素对齐,IDE给出的选项自动变成 Alignment.Horizontal,说明只能在水平方向上指定对齐方式。

具体选项和效果详见  

.align(alignment: Alignment)

四、行为

4.1 偏移 offset

.offset(x: Dp = 0.dp, y: Dp = 0.dp)
 fun Modifier.offset(offset: Density.() -> IntOffset)

@Composable
fun Demo() {
    Image(
        painter = painterResource(id = R.drawable.logo_wechat_square),
        contentDescription = null,
        modifier = Modifier.offset(x = 10.dp, y = 30.dp)
    )
}
val animatePlayerHeightOffset by animateDpAsState(
    targetValue = if (isShowPlayer) 0.dp else maxHeight
)

Player(
    modifier = Modifier.offset {
        IntOffset(x = 0, y = animatePlayerHeightOffset.roundToPx())
    }
)

4.2 旋转 rotate

围绕其中心点旋转的角度。

.rotate(degrees: Float)

@Composable
fun Demo() {
    Image(
        painter = painterResource(id = R.drawable.logo_wechat_square),
        contentDescription = null,
        modifier = Modifier.rotate(180F)
    )
}

4.3 可见性追踪

官方页面

4.3.1 可见性变化时 onVisibilityChanged

用于需要根据组件可见性变化触发副作用的场景,如自动播放/暂停视频或启动动画。

fun Modifier.onVisibilityChanged(
    @IntRange(from = 0) minDurationMs: Long = 0,        //达到该最小可见时间才触发(避免频繁触发带来的性能开销)
    @FloatRange(from = 0.0, to = 1.0) minFractionVisible: Float = 1f,        //最小可见比例
    viewportBounds: LayoutBoundsHolder? = null,
    callback: (Boolean) -> Unit,
)
Box(modifier = Modifier
    .size(100.dp)
    .background(Color.White)
    .onVisibilityChanged(
        minDurationMs = 500,
        minFractionVisible = 1F
    ) { visible ->
        if (visible) ... else ...
    }
) {}

4.3.2 第一次出现在屏幕上 onFirstVisible

已弃用:名称暗示仅触发一次,但在惰性布局中会在滚动时多次触发。改用 onVisibilityChanged() 根据具体使用场景的要求手动跟踪该布局之前是否已经可见。

处理元素首次出现在屏幕上的场景,如记录曝光日志。

fun Modifier.onFirstVisible(
    @IntRange(from = 0) minDurationMs: Long = 0,         //达到该最小可见时间才触发(避免频繁触发带来的性能开销)
    @FloatRange(from = 0.0, to = 1.0) minFractionVisible: Float = 1f,        //最小可见比例
    viewportBounds: LayoutBoundsHolder? = null,
    callback: () -> Unit,
)
Box(modifier = Modifier
    .size(100.dp)
    .background(Color.White)
    .onFirstVisible(
        minDurationMs = 500,
        minFractionVisible = 1F
    ) {
        //当元素可见超过500ms时...
    }
) {}

4.3.4 尺寸发生变化时 onSizeChanged

如需实现组件间的尺寸联动(即一个组件的尺寸影响另一个组件的尺寸),应当使用 Layout 或 SubcomposeLayout 布局组件。

fun Modifier.onSizeChanged(

    onSizeChanged: (IntSize) -> Unit        //拿到的是元素的新尺寸

)

Jetpack Compose 从入门到入门(三) 本篇开始介绍Jetpack Compose 中的修饰符Modifier。修饰符可以用来执行以下操作: 更改可组合项的大小、布局、行为和外观。 添加信息,如无障碍标签。 处理用户输入。 添加高级互动,如使元素可点击、可滚动、可拖动或可缩放。 1.常用修饰符 下面先介绍一些常用的方法: alpha(alpha: Float):设置透明度,范围0到1。 background(color: Color, shape: Shape?):设置背景色,shape可以指定形状,例如可以使用RoundedCorn 阅读详情

相关推荐

黑科技已上线|Lazada数据分析软件,一键式搞定你的店铺!

工欲利其事,必先利其器。在lazada跨境电商的整个流程中,适当的使用一些工具,不仅能大大的简化工作流程,而且可以提高实施效率。Mengla专为lazada电商卖家行业精细化分析lazada数据分析软件都有哪些强大功能! 一、两大优势: 1.海量数据: 数据覆盖面积大;数据分析维度逛;精确算法抓取海量数据;亿万数据秒级响应多种数据来源; 2.技术成熟: 深耕SaaS大数据挖掘;提供一站式数据分析服务;拥有领先的采集技术和运算模型架构; 二、Lazada数据分析软件的功能: 1.各国站点一键分析: 马来西亚

Menglakeji的博客 1146

JetPack Compose理解

每次点击该按钮时,调用方都会更新 clicks 的值。Compose 会再次调用 lambda 与 Text 函数以显示新值;此过程称为“重组”。不依赖于该值的其他函数不会进行重组。 重组过程 组合只能通过初始组合生成且只能通过重组进行更新。重组是修改组合的唯一方式。 重组通常由对 State 对象的更改触发。Compose 会跟踪这些操作,并运行组合中读取该特定 State 的所有可组合项以及这些操作调用的无法跳过的所有可组合项。 在重组期间,可组合项调用的可组合项与上个组合期间调用的可组合项不同,Com

jackzhouyu的专栏 1414

autoware 激光-相机联合标定

autoware进行激光-相机联合标定 ~~~ 刚开始进行激光-相机联合标定的时候,出现了不少问题,在此记录一下整体标定流程,以防忘记。在此,特别感谢佳明师弟,在录制数据集时提供的帮助。 ~~~ 0.系统配置: Ubuntu18.04系统 ROS Melodic opencv 3.2.0 vlp-16 一.安装autoware 这部分网上教程挺多的,但我在编译的过程中仍存在不少bug,唉~_~。 二.安装calibration_camera_lidar,从a...

nuo112的博客 1万+

Jetpack Compose | Modifier常用修饰符的使用(一)

设置内外边距,传统的View 体系中有padding和margin的区分,而在Compose中只有一个padding修饰符,根据不同的位置可以表示内、外边距。而如果改为使用fillMaxSize,则会被设置为父组件所允许的最大尺寸。对于border而言,在其前面的设置padding 可以认为是外边距,在其后面设置的 padding可以认为是内边距。上述示例中是一个综合示例,不仅使用了weight修饰符,还是用的clip、border等,最终展示是三个均分的底部Tab控件,其中图片大小不受父控件的约束。

小马快跑的博客 2096

从Applied Intelligence被拒到The Visual Computer录用:我的计算机视觉论文投稿时间线全记录(含详细修改意见)

本文详细记录了作者从Applied Intelligence被拒到The Visual Computer成功发表计算机视觉论文的全过程,重点分享了如何将模糊的拒稿理由转化为具体改进方案。文章包含技术改进细节、写作调整策略以及期刊选择经验,为计算机视觉领域的研究者提供了实用的投稿指南。

weixin_30872499的博客 467

ADRC自抗扰控制:工程抗扰“黑科技”,附C代码实战!

自抗扰控制(ADRC)是一种革新性的强鲁棒控制策略,通过主动估计和补偿系统扰动,无需精确数学模型即可实现优异控制性能。本文详细解析ADRC三大核心组件:跟踪微分器(TD)实现指令柔化,扩张状态观测器(ESO)实时估计总扰动,非线性状态反馈(NLSEF)完成动态补偿。针对二阶系统,文章提供完整的参数设计方法和C语言实现框架,包括关键函数fhan和fal的代码实现。ADRC将复杂对象"线性化"为积分器串联系统,显著提升抗扰能力,特别适用于电机控制、飞行器姿态等存在模型不确定性和强干扰的场景。

技术工作者 1736

为 Kotlin 的函数添加作用域限制(以 Compose 为例)

不知道各位是否已经开始了解 Jetpack Compose?如果已经开始了解并且上手写过。那么,不知道你们有没有发现,在 Compose 中对于作用域(Scopes)的应用特别多。比如, 修饰符只能用在 或者 作用域中。又比如, 组件只能用在 作用域中。如果你还没有了解过 Compose 的话,那你也应该知道,kotlin 标准库中有 5 个作用域函数: ,这 5 个函数会以不同的方式持有和返回上下文对象,即调用这些函数时,在它们的 lambda 参数中写的代码将处于特定的作用域。不知道你们

xiaokangss的博客 658

Windows Server+SqlServer Always On实战:5步搞定高可用集群搭建

本文详细介绍了在Windows Server环境中,通过5个关键步骤搭建SQL Server Always On高可用集群的实战指南。内容涵盖从底层故障转移集群配置、SQL Server实例启用Always On功能,到创建可用性组和侦听器的完整流程,并提供了核心运维与故障排查思路,帮助企业构建稳定可靠的数据库高可用架构。

milk5的博客 859

Android Compose边框样式输入框

【代码】Android Compose边框样式输入框。

简单记录工作和学习 1676

宋浩线性代数笔记

Miao-A-SongHao-Linear-Algebra-Notes bilibili 宋浩老师 “惊叹号” 系列 《线性代数》网课 笔记及时间点目录 Github项目地址:https://github.com/cy69855522/Miao-A-SongHao-Linear-Algebra-Notes ???? 前言 我发现吧,线代没记笔记真不行。 浩浩学习,天天向上。数学网课推荐????宋浩老师的免...

Knife丶小刀博客 4万+

机器学习特征选择-t检验

在特征选择的过程中通过计算检验统计量值,比较特征之间的统计量的大小,并降序排列,选取统计值较高的特征,从而起到去除差别小的特征(此差别小的特征难以区分不同的额类别)的目的。 以t检验(Student's t test)为例: 假设检验 通过比较两类样本的随机变化,通过计算其p值决定是否拒绝零假设,也即是说:通过计算p值,若p值小于某一阈值则认为两个样本具有显著差异,两个样本是不同的,此时拒绝...

heda3的博客 6700

Android Compose 修饰符类行为整理

compose 修饰符用来对界面组件装饰,类似View Tree系统的组件属性,compose对于修饰符用法做了限制,RowScope,ColumScope,BoxScope,等等限制为仅可以在这些组件使用的修饰符。各种修饰构成compose样式基础,入门第一步首先了解会使用修饰符。状态,副作用在掌握了修饰符之后进行梳理Compose 修饰符列表。

Android 工程化与移动架构实践 998

14、PostgreSQL日志文件、系统统计与查询优化全解析

本文全面解析了PostgreSQL数据库中的系统统计、日志文件配置与查询优化技巧。详细介绍了如何利用pg_stat_statements模块进行性能监控,配置日志记录以发现潜在问题,并深入探讨了查询优化器的工作原理和优化策略。通过实际案例分析,展示了如何综合应用这些技术提升数据库性能。适合希望提升PostgreSQL性能与稳定性的数据库管理员和开发人员阅读。

efc123456的博客 94

【Android】Compose布局

自定义的 Modifier 扩展函数 firstBaselineToTop,以及一个使用该 Modifier 的 Composable 函数 TextWithPaddingToBaseline。// 测量元素,并根据提供的约束条件获取其尺寸信息。// 获取文本内容的第一行基线距离顶部的距离。// 这个值用于计算文本相对于父容器顶部的位置。// 计算新的Y坐标,确保文本的第一行基线距离顶部为指定的Dp值。// 如果文本的第一行基线已经比指定的Dp值大,则placeableY将会是一个负数,

LeGuan_Ha的博客 966

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

我用AI学Android Jetpack Compose之Jetpack Compose学习路径篇

通过上述步骤,你可以逐步深入学习Jetpack Compose的各个方面,从基础概念到高级特性。建议你在学习过程中多动手实践,创建一些小型项目来应用所学的知识。随着经验的积累,你会逐渐成为一名熟练的Compose开发者。如果你有任何具体问题或需要进一步的帮助,请随时提问!希望你能享受学习Compose的过程,并开发出令人惊艳的应用程序。我想看图片,继续问Ai,通义千问不能生成图片,差评,不过还是帮我们整理了一下学习路径。

学无止境,止于至善 1827

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

告别XML布局:Jetpack Compose从Column到自定义布局的完全指南

你是否还在为Android传统XML布局的繁琐调试而烦恼?是否在多个屏幕尺寸适配中迷失在dp和sp的海洋里?本文将带你掌握Jetpack Compose布局系统,从基础的Column排列到构建复杂的自定义布局,用不到200行代码解决90%的UI排列难题。读完本文,你将能够:用声明式代码构建响应式界面、掌握5种核心布局组件、实现自定义滑动容器,并理解Compose布局的测量与放置原理。 [![项目...

gitblog_00527的博客 941

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

深入分析 Android Compose 框架的多平台布局适配(六十)

Android Compose 是 Google 推出的用于构建 Android UI 的声明式框架。它采用 Kotlin 语言编写,通过简洁的代码描述 UI 的外观和行为。与传统的基于 XML 和View声明式编程:开发者只需描述 UI 应该是什么样子,而无需关心 UI 是如何创建和更新的,代码更加简洁易读。高效性能:Compose 采用了智能的渲染机制,能够自动检测 UI 的变化并只更新需要更新的部分,减少了不必要的重绘,提高了性能。易于组合。

Android开发领域创作者 1288

揭秘Blueprint:Jetpack Compose中的UI尺寸可视化神器

????揭秘Blueprint:Jetpack Compose中的UI尺寸可视化神器 Blueprint???? Visualize the dimensions of your composables on a blueprint!项目地址:https://gitcode.com/gh_mirrors/blueprint3/Blueprint 在复杂界面设计和开发的迷雾中,找到清晰的路径是每位开发者梦寐以...

gitblog_00093的博客 457

Compose 修饰符 - 原理

/自定义测量和摆放//TODO...//去掉涟漪效果clickable(写法过于底层,基本没有太多场景我们需要使用。启动协程作用域): R等待用户输入事件。

HugMua的博客 2017

我用Ai学Android Jetpack Compose之Text

当然可以!Text是 Jetpack Compose 中最常用的 Composable 函数之一,用于显示文本内容。它提供了丰富的配置选项来定制文本的外观和行为。下面将详细介绍Text的基本用法、常见属性以及一些高级特性。Text是 Jetpack Compose 中不可或缺的一部分,掌握了它的基本用法和高级特性后,你可以轻松地构建出美观且功能丰富的文本UI。随着你对Compose框架理解的加深,你会发现更多有趣的应用场景和技术细节。希望这些信息对你有所帮助!

学无止境,止于至善 1383

Compose布局实战:掌握居中与权重分配的技巧

本文深入解析Jetpack Compose布局中实现居中与权重分配的核心技巧。通过对比容器对齐参数、Modifier.wrapContentSize及Box填充等三种居中方案,并结合权重(Weight)原理与混合布局实战,帮助开发者构建灵活、精准的UI界面,有效提升Compose布局开发效率。

s3t4u的博客 857

4-Compose开发-Modifier基础

Modifier(修饰符)是 Compose 中用于装饰或增强可组合项的核心接口。它本质上是一个有序的、链式调用的元素集合,每个元素都定义了某种行为或样式(如设置宽度、添加内边距、处理点击等)。Modifier 的设计遵循“组合优于继承”的理念——你不需要创建复杂的自定义 View,而是通过组合多个小粒度的修饰符来构建所需的 UI 效果。用于在组件的绘制阶段添加自定义效果,比如偏移、旋转、缩放等。修饰符作用偏移组件位置(x 水平,y 垂直)旋转组件(角度)缩放组件(x 水平缩放,y 垂直缩放)

weixin_36848576的博客 561

Jetpack Compose Modifier修饰符完全指南:从入门到精通

Modifier是 Compose 中用来装饰或增强UI元素的工具,本篇介绍Modifier常用修饰符。

ITMonkeyKing的博客 241

Jetpack Compose布局系统全解析:ConstraintLayout、FlexBox与响应式设计终极指南

Jetpack Compose作为Android现代UI开发框架,彻底改变了Android应用的界面构建方式。这个基于Kotlin的声明式UI工具包通过ConstraintLayout、FlexBox布局和响应式设计系统,为开发者提供了前所未有的布局灵活性和开发效率。本指南将深入解析Jetpack Compose布局系统的核心组件,帮助您快速掌握这一革命性的UI开发技术。 ## 🎯 Jetpa

gitblog_00923的博客 1031

Jetpack Compose Modifier实战指南:从基础到高级应用

本文深入探讨Jetpack Compose Modifier的核心功能与实战应用,从基础布局控制到高级交互设计。通过丰富的代码示例展示如何利用Modifier实现尺寸调整、样式美化、事件处理等关键功能,帮助开发者掌握这一构建Compose界面的核心工具,提升UI开发效率与质量。

red88的博客 651

Compose 基础 - 数据转UI的三阶段(组合、布局、绘制)

这是一个很简单的例子,事实上 Composable 可以包含逻辑和控制流(if else, when...),在不同的状态下产生不同的UI树。同样地,UI树会自顶向下地遍历,每个节点依次在屏幕上绘制自身。然后 Image 绘制自身,再之后到分支节点Column,Column的第一个Text,Column的第二个Text。多叉树中父节点会测量他们的子节点,然后在一个二维空间里进行摆放。2.测量完子节点后,开始决定自身的尺寸。1.如果存在子节点则测量子节点。3.根据子节点的尺寸摆放子节点。

HugMua的博客 1583
上一篇: Compose 修饰符 - 阴影
下一篇: Compose 组件 - 轮播图 Carousel
Jomurphys
博客等级 码龄9年 1768粉丝 261原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值