Compose - 修饰符 Modifier

news2025/1/19 2:56:18

一、概念

四大使用场景:

  • 修改外观(尺寸、样式、布局、行为)。
  • 添加额外信息(如无障碍标签)。
  • 添加交互功能(点击、滚动、拖拽、缩放)。
  • 处理用户输入。

1.1 为组合函数添加 Modifier 参数

  • 任何一个组合函数都应该有一个 Modifier 参数:出于灵活性考虑,例如 Image() 的作用是显示头像,它可以控制形状边框等,但不应该控制对齐,否则总是居左显示,该对齐方式应该让父控件调用时决定,此时为 Image() 增加 Modifier 参数,就可以在调用时指定对齐方式了。
  • 放在第一个非强制性参数位置:由于是可选参数,放在所有强制性参数后面,这样调用方就可以选择是否指定,否则就必须被强制性的先指定Modifier,使用起来不变。
@Composable
fun ParentLayout(modifier: Modifier = Modifier) {
    //调用时指定对齐方式
    Avatar(Modifier.align(Alignment.CenterHorizontally))
}

@Composable
fun Avatar(modifier: Modifier = Modifier) {
    Image(
        painter = painterResource(id = R.drawable.icon),
        contentDescription = "Icon Image",
        //使用时,用传入的modifier
        modifier = modifier
            .wrapContentSize()
            .background(Color.Gray)
            .padding(18.dp)
            .border(5.dp, Color.Magenta, CircleShape)
            .clip(CircleShape)
    )
}
@Composable
fun TestComposable(a: Int, b: String, modifier: Modifier = Modifier) {...}

二、修改外观

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

2.1 尺寸

2.1.1 指定具体值

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

.width(width: Dp)

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

.height(height: Dp)

.height(intrinsicSize: IntrinsicSize)

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

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

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

@Composable
fun Demo() {
    Box(
        Modifier
            .background(Color.Blue)
            .width(50.dp)
            .height(IntrinsicSize.Min)  //高度
    ){
        Column{//不管这里是Column还是Row,不管上面是MIn还是Max,蓝色高度上都是包裹效果
            Box(
                Modifier
                    .background(Color.Red)
                    .size(25.dp)
            )
            Box(
                Modifier
                    .background(Color.Green)
                    .size(10.dp)
            )
        }
    }
}

2.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)    //强制使用指定值
        )
    }
}

2.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)    //同时设置宽高

2.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
        )
    }
}

2.1.5 权重 weight

设置 weight 时,fill = true/false 的区别。

2.1.6 根据自身内容决定大小

例如可以让 Image 根据自身内容来决定控件的大小。

.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()
        )
    }
}

2.2 样式

2.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.2.3 背景 background

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

2.2.4 剪裁 clip

.clip(shape: Shape)        //CircleShape、RectangleShape

 

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

2.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.2.6 阴影 shadow

.shadow(
    elevation: Dp,
    shape: Shape = RectangleShape,
    clip: Boolean = elevation > 0.dp,
    ambientColor: Color = DefaultShadowColor,
    spotColor: Color = DefaultShadowColor,
)

2.3 布局

具体选项和效果详见 

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

2.3.1 子元素对齐 align

.align(alignment: Alignment)

2.4 行为

2.4.1 偏移

.offset(x: Dp = 0.dp, y: Dp = 0.dp)

  

@Composable
fun Demo() {
    Image(
        painter = painterResource(id = R.drawable.logo_wechat_square),
        contentDescription = null,
        modifier = Modifier.offset(x = 10.dp, y = 30.dp)
    )
}

2.4.2 旋转

.rotate(degrees: Float)

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

三、添加额外信息

        在Compose的内部,是用树型结构来存储一次重组过程中每个Composable函数节点的。一颗就是我们现在看到的重组树,另外一颗则是我们看不到的语义树。

        语义树完全不参与绘制和渲染工作,因此是完全不可见的,它只为 Accessibility 和 Test 服务。Accessibility需要根据语义树的节点内容进行发音,Test则需要根据语义树找到想要测试的节点来执行测试逻辑。

        绝大部分情况下不需要专门为语义树去做什么事情,标准的组合项已经在内部处理好了这些工作(Button嵌套一个Text,它俩是独立控件,Talkback会单独发声,但只要控件可点击,就会自动将所有子节点合并)。若使用了一些底层API自行绘制界面(日历选中8号,只会发音选中日历),这些工作就得自己来做了。

.semantics(
    mergeDescendants: Boolean = false,
    properties: (SemanticsPropertyReceiver.() -> Unit)
)

允许向当前Compose控件添加键值对形式的额外信息,但是不能覆写。

.clearAndSetSemantics(
    properties: (SemanticsPropertyReceiver.() -> Unit)
)

相对用得更多一些,它会把Compsoe控件之前携带的一些额外信息都清除掉。

四、添加交互功能

4.1 点击 clickable

允许应用检测对该元素的点击。

.clickable(
    enabled: Boolean = true,
    onClickLabel: String? = null,
    role: Role? = null,
    onClick: () -> Unit
)

 

@Composable
fun ClickableSample() {
    val count = remember { mutableStateOf(0) }
    Text(
        text = count.value.toString(),
        modifier = Modifier.clickable { count.value += 1 }
    )
}

4.2 滚动

4.2.1 verticalScroll、horizontalScroll

类似与 ScrollView,可以让内容边界大于最大尺寸约束时滚动里面的元素,借助 ScrollState 还可以更改滚动位置或获取当前状态。

 

@Composable
fun ScrollBoxes() {
    val scrollState = rememberScrollState()
    LaunchedEffect(Unit) { scrollState.animateScrollTo(100) }
    Column(
        modifier = Modifier
            .background(Color.LightGray)
            .size(100.dp)
//            .verticalScroll(rememberScrollState())  //使用默认参数
            .verticalScroll(scrollState)    //一显示就会自动滚动100px
    ) {
        repeat(10) {
            Text("Item $it", modifier = Modifier.padding(2.dp))
        }
    }
}

4.2.2  scrollable

只检测手势不偏移内容。构造时需要提供一个 consumeScrollDelta( ) 函数,该函数在每个滚动步骤都会调用,以像素为单位,返回所消耗的距离。

 

@Composable
fun ScrollableSample() {
    var offset by remember { mutableStateOf(0f) }
    Box(
        Modifier
            .size(150.dp)
            .scrollable(
                orientation = Orientation.Vertical,
                state = rememberScrollableState { delta ->
                    //拿到每次滑动的偏移量delta
                    offset += delta
                    delta
                }
            )
            .background(Color.LightGray),
        contentAlignment = Alignment.Center
    ) {
        Text(offset.toString())
    }
}

4.2.3 嵌套滚动

4.2.3.1 自动嵌套滚动

简单的嵌套滚动无需额外操作,当子元素无法进一步滚动时手势会由父元素处理,手势会自动从子元素传播到父元素。

 

//父Box嵌套10个子Box,子Box滚动到边界会滚动父Box
@Composable
fun ScrollableSample() {
    //设置渐变色方便观察子Box滚动(蓝→黄1000级)
    val gradient = Brush.verticalGradient(0f to Color.Blue, 1000f to Color.Yellow)
    Box(
        modifier = Modifier
            .background(Color.LightGray)
            .verticalScroll(rememberScrollState())
            .padding(32.dp)
    ) {
        Column {
            repeat(10) {
                Box(
                    modifier = Modifier
                        .height(128.dp)
                        .verticalScroll(rememberScrollState())
                ) {
                    Text(
                        text = "Scroll here",
                        color = Color.Red,
                        modifier = Modifier
                            .border(12.dp, Color.DarkGray)
                            .background(brush = gradient)
                            .padding(24.dp)
                            .height(150.dp)
                    )
                }
            }
        }
    }
}

4.2.3.2 nestedScroll

4.2.3.3 嵌套滚动互操作性(v1.2.0)

4.3 拖拽

只检测手势不偏移内容(需要保存状态并在屏幕上表示,例如通过 offset 修饰符移动元素),以像素为单位。

4.3.1 线性拖拽(一维) draggable

使元素在水平或垂直方向上拖拽,并可以监听拖拽距离。

.draggable(
    state: DraggableState,
    orientation: Orientation,        //拖动方向
    enabled: Boolean = true,        //是否启用
    interactionSource: MutableInteractionSource? = null,
    startDragImmediately: Boolean = false,
    onDragStarted: suspend CoroutineScope.(startedPosition: Offset) -> Unit = {},        //拖拽开始时的回调
    onDragStopped: suspend CoroutineScope.(velocity: Float) -> Unit = {},        //拖拽结束时的回调
    reverseDirection: Boolean = false        //反转方向
)
var offsetX by remember { mutableStateOf(0f) }
Text(
    modifier = Modifier
        .offset { IntOffset(offsetX.roundToInt(), 0) }
        .draggable(
            orientation = Orientation.Horizontal,
            state = rememberDraggableState { delta ->
                offsetX += delta
            }
        ),
    text = "Drag me!"
)

在这里插入图片描述

4.3.2 平面拖动(二维)pointerInput

改为使用更加底层的 pointerInput( ) 。

//父Box中拖动蓝色子Box
@Composable
fun ScrollableSample() {
    Box(modifier = Modifier.fillMaxSize()) {
        var offsetX by remember { mutableStateOf(0f) }
        var offsetY by remember { mutableStateOf(0f) }
        Box(
            Modifier
                .offset { IntOffset(offsetX.roundToInt(), offsetY.roundToInt()) }
                .background(Color.Blue)
                .size(50.dp)
                .pointerInput(Unit) {
                    //监听用户拖拽手势
                    detectDragGestures { change, dragAmount ->
                        change.consume()    //由于是底层API很多事情需要自己做,这里要消费掉
                        offsetX += dragAmount.x    //水平距离
                        offsetY += dragAmount.y    //垂直距离
                    }
                }
        )
    }
}

4.4 滑动 swipeable

只检测手势不偏移内容(需要保存状态并在屏幕上表示,例如通过 offset 修饰符移动元素)。具有惯性,释放后会朝着锚点呈现动画效果,常见用途是滑动关闭。

 

@OptIn(ExperimentalMaterialApi::class)
@Composable
fun SwipeableSample() {
    val squareSize = 48.dp    //子Box的大小
    val swipeableState = rememberSwipeableState(0)
    val sizePx = with(LocalDensity.current) { squareSize.toPx() }   //DP转PX
    //设置锚点(key是像素,value是索引)
    val anchors = mapOf(0f to 0, sizePx to 1)
    Box(
        modifier = Modifier
            .width(96.dp)
            .swipeable(
                state = swipeableState,
                anchors = anchors,
                //阈值(超过就会自己滑到底,达不到就会滑回来)
                thresholds = { _, _ -> FractionalThreshold(0.3f) },
                orientation = Orientation.Horizontal
            )
            .background(Color.LightGray)
    ) {
        Box(
            Modifier
                .offset { IntOffset(swipeableState.offset.value.roundToInt(), 0) }
                .size(squareSize)
                .background(Color.DarkGray)
        )
    }
}

4.5 多点触控 transformable

只检测手势不转换元素。平移、缩放、旋转。

 

@Composable
fun TransformableSample() {
    var scale by remember { mutableStateOf(1f) }    //缩放
    var rotation by remember { mutableStateOf(0f) }    //旋转
    var offset by remember { mutableStateOf(Offset.Zero) }    //平移
    val state = rememberTransformableState { zoomChange, offsetChange, rotationChange ->
        scale *= zoomChange
        rotation += rotationChange
        offset += offsetChange
    }
    Box(
        Modifier
            .graphicsLayer(
                scaleX = scale,    //等比缩放
                scaleY = scale,    //等比缩放
                rotationZ = rotation,
                translationX = offset.x,
                translationY = offset.y
            )
            .transformable(state = state)
            .background(Color.Blue)
            .fillMaxSize()
    )
}

五、处理用户输入 pointerInput

这里的输入不是文本,而是用户手指在屏幕上滑动点击(手势)。当上层API无法满足时(第四部分系统提供的交互功能),就需要自己调用底层API定制了。

.pointerInput(
    key1: Any?,        //至少要传一个key(其它重载传更多key),变化时函数会重新执行(不需要就传Unit)。
    block: suspend PointerInputScope.() -> Unit
)

5.1 点击、拖拽

两个函数都是阻塞的,不能同时写在同一个 pointerInput( ) 中。

监听点击事件

detectTapGestures(
    onDoubleTap: ((Offset) -> Unit)? = null,        //双击
    onLongPress: ((Offset) -> Unit)? = null,        //长按
    onPress: suspend PressGestureScope.(Offset) -> Unit = NoPressGesture, //短按(其它三个都会触发有一次)
    onTap: ((Offset) -> Unit)? = null        //单击
)

监听拖拽事件

detectDragGestures(
    onDragStart: (Offset) -> Unit = { },
    onDragEnd: () -> Unit = { },
    onDragCancel: () -> Unit = { },
    onDrag: (change: PointerInputChange, dragAmount: Offset) -> Unit        //通过 dragAmount.x 和 dragAmount.y 拿到各方向上的拖动距离。
)

Box(modifier = Modifier
        .size(200.dp)
        .background(Color.Blue)
        .pointerInput(Unit) {
            detectTapGestures { offset ->
                Log.d("PointerInputEvent", "Tap")
            }
            //注意:检测函数是阻塞的,此处代码不可达
        }.pointerInput(Unit) {
            detectDragGestures { change, dragAmount ->
                Log.d("PointerInputEvent", "Dragging")
            }
            //注意:检测函数是阻塞的,此处代码不可达
        }
)

在这里插入图片描述

5.2 更底层处理(自定义)

写法过于底层,基本没有太多场景我们需要使用。

启动协程作用域

suspend fun <R> awaitPointerEventScope(

        block: suspend AwaitPointerEventScope.() -> R

): R

等待用户输入事件

suspend fun awaitPointerEvent(
        pass: PointerEventPass = PointerEventPass.Main

): PointerEvent

在这里插入图片描述

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

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

相关文章

Linux网络编程:网络基础

文章目录&#xff1a; 1.协议 2.锁 3.网络层次模型 4.以太网帧和ARP协议 5.IP协议 6.UDP协议 7.TCP协议 8.BS模式和CS模式 9.网络套接字(socket) 10.网络字节序 11.IP地址转换函数 12.sockaddr地址结构 学习Linux的网络编程原则上基于&#xff1a;Linux的系统编程…

中大许少辉博士《乡村振兴战略下传统村落文化旅游设计》中国建筑工业出版社八一付梓。

中大许少辉博士《乡村振兴战略下传统村落文化旅游设计》中国建筑工业出版社八一付梓。

gdb调试的经验基本流程处理

一、启动调试 1、gdb启动 gdb启动非常简单&#xff0c;只要直接执行下面的命令&#xff1a; gdb exename(调试文件的名称)2、设置参数 如果需要调试的程序需要输入参数怎么办呢&#xff1f;有三种方法可以实现&#xff1a; a、在启动调试程序时使用命令参数设置 gdb --args …

Linux中启动docker 出现 ‘ Failed to start docker.service: Unit not found. ’ 错误

启动docker 出现 ‘ Failed to start docker.service: Unit not found. ’ 错误 这是因为缺少 rhel-push-plugin.socket 单元&#xff0c;该单元是rhel-push-plugin软件包的一部分。所以我们执行以下指令就可以成功解决&#xff1a; curl -sSL https://get.docker.com/ | sh 执…

搭建redis集群

前言 redis 集群分为一下几种&#xff1a; 【主从模式】&#xff1a;一般情况大多都是读多写少的情况&#xff0c;主从模式可以将读写分离&#xff0c;主库写&#xff0c;从库只负责读取的情况&#xff0c;这从如果任何一个从库宕机的情况&#xff0c;整个集群仍然可以提供工作…

使用GUI Guider工具开发嵌入式GUI应用(6)-切换多screen换场景

使用GUI Guider工具开发嵌入式GUI应用&#xff08;6&#xff09;-切换多screen换场景 本节将展示使用GUI Guider实现切换显示页面功能。 这里设计的用例是&#xff1a; 创建3张页面&#xff0c;screen_0,screen_1和screen_2。分别在每个页面上中放置一个Label&#xff08;最…

仿牛客论坛项目day7|Kafka

一、阻塞队列 创建了一个生产者线程和一个消费者线程。生产者线程向队列中放入元素&#xff0c;消费者线程从队列中取出元素。我们可以看到&#xff0c;当队列为空时&#xff0c;消费者线程会被阻塞&#xff0c;直到生产者线程向队列中放入新的元素。 二、Kafka入门 发布、订阅…

亿图脑图MindMaster思维导图及亿图图示会员-超值途径

亿图脑图MindMaster思维导图及亿图图示会员 先简单看一下这两软件&#xff1a; MindMaster 亿图图示 丰富的社区&#xff0c;便捷易操作的界面&#xff0c;还有耐看的UI设计&#xff1b;要是再有点特权&#xff0c;真的是锦上添花~ 如果需要MindMaster思维导图或者亿图图示VIP…

Android Retrofit原理浅析

官方地址:Retrofit 原理:Retrofit 本质上是代理了OKhttp,使用代理模式,Type-Safe 类型安全 编译器把类型检查出 避免类型错误, enqueue 异步 切换线程 execute 同步 不切换线程 enqueue:Call接口定义的抽象方法 Retrofit.Create() 方法首先验证接口validateServiceInterf…

ps吸管工具用不了怎么办?

我们的办公神器ps软件&#xff0c;大家一定是耳熟能详的吧。Adobe photoshop是电影、视频和多媒体领域的专业人士&#xff0c;使用3D和动画的图形和Web设计人员&#xff0c;以及工程和科学领域的专业人士的理想选择。Photoshop支持宽屏显示器的新式版面、集20多个窗口于一身的d…

小数据 vs 大数据:为AI另辟蹊径的可操作数据

在人工智能背景下&#xff0c;您可能已听说过“大数据”这一流行语&#xff0c;那“小数据”这一词呢&#xff0c;您有听说过吗&#xff1f;无论您听过与否&#xff0c;小数据都无处不在&#xff1a;线上购物体验、航空公司推荐、天气预报等均依托小数据。小数据即一种采用可访…

webpack 和 ts 简单配置及使用

如何使用webpack 与 ts结合使用 新建项目 &#xff0c;执行项目初始化 npm init -y会生成 {"name": "tsdemo01","version": "1.0.0","description": "","main": "index.js","scripts&…

java_免费文本翻译API_小牛翻译

目录 前言 开始集成API 纯文本翻译接口 双语对照翻译接口 指定术语翻译接口 总结 前言 网络上对百度&#xff0c;有道等的文本翻译API集成的文章比较多&#xff0c;所以集成的第一篇选择了小牛翻译的文本翻译API。 小牛翻译文本翻译API&#xff0c;支持388个语种&#xff0…

CrossOver2023快速在Mac和Linux系统上运行Windows软件

让您可以在 Mac 和 Linux 系统上运行 Windows 应用&#xff0c;不必购买 Windows 授权&#xff0c;不必重启系统&#xff0c;不必使用虚拟机。通过 CrossOver&#xff0c; 您可以从 dock 直接启动 Windows 应用&#xff0c;与您的 Mac 和 Linux 系统功能无缝集成。 无需重启 Cr…

强训第35天

选择 A 经过一个1->2 经过两个2->4 开始慢增长 4->5 5->6....9->10 到达4KB时变成慢增长&#xff0c;最多增长到10 D 网络号是180.80.76 但题目让向主机所在子网发广播 180 .80 .(01001101 | 111111 11)79 .255 标红的两位属于主机号所以答案为D A C 分片的组…

排名算法简介:对搜索结果进行排序的主要排名算法

一、介绍 学习排名 &#xff08;LTR&#xff09; 是一类监督式机器学习算法&#xff0c;旨在根据项目与查询的相关性对项目列表进行排序。在分类和回归等问题中的经典机器学习中&#xff0c;目标是根据特征向量预测单个值。LTR 算法对一组特征向量进行操作&#xff0c;并预测项…

【FAQ】视频集中存储EasyCVR安防监控平台接入AI分析时的通道显示问题排查

安防视频监控平台视频集中存储EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。 安防监控视频云存储平台EasyCVR既具…

为什么贴片电阻的阻值不规律?为了在某精度下做到阻值的全覆盖(对,但不全对),E系列电阻的算法(E12系列值不对的猜想)

1、先放上E系列的电阻表格 E12精度10%&#xff0c;E24精度5%&#xff0c;E96精度1%&#xff1b; 2、以精度作为条件的演算 通常我们选择电阻&#xff0c;要确定电阻的精度&#xff0c;如果以精度作为条件。 以10%精度来说&#xff1a;&#xff08;数值少&#xff0c;好算&am…

STM32 CubeMX (第二步Freertos任务通信:队列、信号量、互斥量,事件组,任务通知)

STM32 CubeMX STM32 CubeMX ____Freertos任务通信&#xff1a;队列、信号量、互斥量&#xff0c;事件组&#xff0c;任务通知 STM32 CubeMX一、STM32 CubeMX设置时钟配置HAL时基选择TIM1&#xff08;不要选择滴答定时器&#xff1b;滴答定时器留给OS系统做时基&#xff09;使用…

超分辨率地震速度模型

文献分享 1. Multitask Learning for Super-Resolution 原题目&#xff1a;Multitask Learning for Super-Resolution of Seismic Velocity Model 全波形反演&#xff08;FWI&#xff09;是估算地下速度模型的强大工具。与传统反演策略相比&#xff0c;FWI充分利用了地震波的…