Compose中的预览@Preview与@PreviewParameter的使用

article/2025/10/16 8:01:49

文章目录

  • 前言
  • 一、@Preview
  • 二、@PreviewParameter
    • 1.单个参数
    • 2.多个参数


前言

阅读本文需要一定compose基础,如果没有请移步Jetpack Compose入门详解(实时更新)

本文介绍@Preview与@PreviewParameter注解的使用


一、@Preview

如果你构建了一个Compose项目,那么你的MainActivity中一定有一个默认的预览函数类似如下

@Composable
fun Greeting(name: String) {Text(text = "Hello $name!")
}@Preview(showBackground = true)
@Composable
fun DefaultPreview() {PlayComposeTheme {Greeting("Android")}
}

此时就算没有运行程序我们也可以在studio中预览
![在这里插入图片描述](https://img-blog.csdnimg.cn/c0fea892fcd3460792a42f68d1573215.png
这是最简单的使用,我们点进@Preview的源码

参数:

  • name-此预览的显示名称,允许在面板中识别它。

  • group-此@Preview的组名称。这允许在UI中对它们进行分组,并仅显示其中一个或多个。

  • apiLevel—呈现带注释的@Composable时使用的API级别

  • widthDp—将在其中渲染带注释的@Composable的最大DP宽度。使用此选项可以限制渲染视口的大小。

  • heightDp-将在其中渲染注释的@Composable的最大高度(以DP为单位)。使用此选项可以限制渲染视口的大小。

  • locale-区域设置的当前用户首选项,对应于区域设置资源限定符。默认情况下,将使用默认文件夹。

  • fontScale-用户首选字体的缩放因子,相对于基本密度缩放。

  • showSystemUi-如果为true,将显示设备的状态栏和操作栏。@Composable将在完整活动的上下文中呈现。

  • showBackground-如果为true,@Composable将使用默认背景色。

  • backgroundColor-背景的32位ARGB颜色int,如果未设置,则为0

  • uiMode—根据android.content.res.Configuration.uiMode的ui模式位掩码

  • device—指示要在预览中使用的设备的设备字符串。请参阅设备中的可用设备。
    在这里插入图片描述

我们将DefaultPreview改一下(ps:locale为设置不同的用户语言区域的参数;参数 uiMode 可接受任意 Configuration.UI_* 常量,并允许您相应地更改预览的行为。例如,您可以将预览设置为夜间模式,看看主题如何响应。本例中未体现)

@Preview(name = "name",group = "group",widthDp = 100,heightDp = 100,fontScale = 2f,backgroundColor = 0xFF00FF00,showBackground = true,showSystemUi = true,device = Devices.NEXUS_5
)
@Composable
fun DefaultPreview() {PlayComposeTheme {Greeting("Android")}
}

预览效果如下

在这里插入图片描述
注意点
showBackground 必须为true,backgroundColor 属性才生效,并且backgroundColor 是 ARGB Long,而不是 Color 值
同一个函数可以使用多个@Preview注解

@Preview(name = "small font",group = "font scales",fontScale = 0.5f
)
@Preview(name = "large font",group = "font scales",fontScale = 1.5f
)
@Composable
fun DefaultPreview() {PlayComposeTheme {Greeting("Android")}
}

在这里插入图片描述

二、@PreviewParameter

接下来我们尝试预览一个稍微复杂一点的布局

@Preview
@Composable
fun  NationalDayNoticeItemPreview(noticeName: String,modifier: Modifier = Modifier
){Row(modifier = Modifier, verticalAlignment = Alignment.CenterVertically) {Text(modifier = Modifier.weight(1f).padding(start = 16.dp),text = noticeName)IconButton(onClick = {}) {Icon(Icons.Filled.Close, contentDescription = "Close")}}
}

这时,@Preview注解就会爆红并提示
在这里插入图片描述
翻译过来就是预览中不支持具有非默认参数的可组合函数,除非它们用**@PreviewParameter**注释。
但是如果我们把 noticeName去掉,函数是不报错的,说明Modifier是可以作为参数传递进来的,这里的非默认参数指代的是Modifier

1.单个参数

@PreviewParameter注解的规范使用如下

先实现一个数据源PreviewParameterProvider

//简单实现如,values是一个列表数据,传入多个就会生成多个预览视图
class StringProvider : PreviewParameterProvider<String> {override val values: Sequence<String>get() = listOf("你要上班啦","你要上学啦").asSequence()
}

然后将NationalDayNoticeItemPreview更改为如下

@Preview
@Composable
fun  NationalDayNoticeItemPreview1(@PreviewParameter(StringProvider::class,1)noticeName: String,// onClose: () -> Unit,modifier: Modifier = Modifier
){Row(modifier = Modifier, verticalAlignment = Alignment.CenterVertically) {Text(modifier = Modifier.weight(1f).padding(start = 16.dp),text = noticeName)IconButton(onClick = {}) {Icon(Icons.Filled.Close, contentDescription = "Close")}}
}

预览成功
在这里插入图片描述

通过上面的例子我们可以看到,注解 @PreviewParameter的第一个参数为数据源的封装,第二个参数限制数据源个数

2.多个参数

但是如果我们要将IconButton中的onClick 也作为一个参数传递给这个预览函数,这时string的数据源就行不通了,而@PreviewParameter注解在每一个函数中只能使用一次,所以如果有多个参数就我们要自己封装一个数据源包含两个乃至多个参数
代码如下(示例):

、、数据实体
data class NationalDayNoticeItemPreviewData(val noticeName :String,val onClose :() -> Unit
)//初始化
class Provider : PreviewParameterProvider<NationalDayNoticeItemPreviewData> {private val noticeName = "你要上班啦"private val onClose = {}private val nationalDayNoticeItemPreviewData=NationalDayNoticeItemPreviewData(noticeName,onClose)override val values: Sequence<NationalDayNoticeItemPreviewData>get() {return listOf(nationalDayNoticeItemPreviewData).asSequence()}}

然后将NationalDayNoticeItemPreview更改为如下

@Preview
@Composable
fun  NationalDayNoticeItemPreview2(@PreviewParameter(Provider::class,1)nationalDayNoticeItemPreviewData: NationalDayNoticeItemPreviewData,modifier: Modifier = Modifier
){Row(modifier = Modifier, verticalAlignment = Alignment.CenterVertically) {Text(modifier = Modifier.weight(1f).padding(start = 16.dp),text = nationalDayNoticeItemPreviewData.noticeName)IconButton(onClick = nationalDayNoticeItemPreviewData.onClose) {Icon(Icons.Filled.Close, contentDescription = "Close")}}
}

预览成功
在这里插入图片描述


查阅的资料
Compose @Preview 中 @PreviewParameter使用


http://chatgpt.dhexx.cn/article/K5VENmPo.shtml

相关文章

最新版Android Studio如何preview

之前看到有的博客里写到&#xff0c;Android Studio有个preview功能特别好用&#xff0c;可以边写代码边预览&#xff0c;类似下图这样的&#xff1a;&#xff08;图片来源&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/20855561&#xff09; 之前的And…

Preview使用技巧,强大的macOS原生应用:「预览」(Preview)

首先要介绍的macOS原生应用是预览&#xff08;preview&#xff09;app。很多人&#xff0c;包括我在最开始使用macOS的时候&#xff0c;像当初使用Windows一样&#xff0c;安装了系统&#xff0c;满大街找各种软件将自己的电脑武装起来。可是apple已经为我们武装好电脑了&#…

报错处理 ITK only supports orthonormal direction cosines. No orthonormal definition found

在使用SimpleITK处理MRI医学图像数据的时候遇到了以下问题&#xff1a; File "d:\PythonProgramme\GenerateDatasetTxt\xx.py", line 12, in <module>img sitk.ReadImage("0000264276/T2.nii.gz")File "D:\Program Files\Anaconda3\envs\simpl…

Python执行selenium报错This version of ChromeDriver only supports Chrome version并配置环境变量

1.This version of ChromeDriver only supports Chrome version 这个报错的意思是chrome驱动的版本不匹配&#xff0c;所以需要查看自己的chrome的版本&#xff0c;再根据版本下载对应的chromedriver.exe&#xff0c;具体操作步骤如下 第一步查看chrome的版本&#xff1a; 第…

Android Studio调式手机时提示 device supports but apk only supports armeabi-v7a

转载来自 https://blog.csdn.net/lbj_demo/article/details/81503078 1 核对你手机的 CPU 架构 目前的 Android 支持的架构 CPU架构描述armeabi第5代 ARM v5TE&#xff0c;使用软件浮点运算&#xff0c;兼容所有ARM设备&#xff0c;通用性强&#xff0c;速度慢armeabi-v7a第…

supports_CSS的@supports规则简介(功能查询)

supports The two general approaches to tackling browsers’ uneven support for the latest technologies are graceful degradation and progressive enhancement. 解决浏览器对最新技术的不均衡支持的两种通用方法是平稳降级和逐步增强 。 Graceful degradation leverage…

CSS3条件判断——@supports

CSS3条件判断——supports CSS3条件判断&#xff0c;听起来“不明觉厉”,如果你对CSS稍为熟悉一点的话&#xff0c;你会发现CSS中的“ media ”就是条件判断之一。是的&#xff0c;在 CSS3的条件判断规范文档 中包含了两个部分&#xff0c;其一是“media”规则&#xff0c;主要…

[DL] Default MaxPoolingOp only supports NHWC on device type CPU

在cpu运行代码时&#xff0c;发现&#xff0c;出现此类问题 参考 (16条消息) Default MaxPoolingOp only supports NHWC on device type CPU_被可爱咬了一口的博客-CSDN博客 默认值表示data_formatchannels_last&#xff0c;"NCHW"表示data将被存储为[batch,channe…

Cesium 实战 - 解决 The browser supports WebGL, but initialization failed 问题

Cesium 实战-解决 The browser supports WebGL, but initialization failed 问题 系统环境版本试错过程解决问题 在公司内网服务器部署 Cesium 项目的时候&#xff0c;发现提示浏览器不支持 WebGL 错误&#xff0c;经尝试&#xff0c;确认 Cesium 1.101.0 以及之前的版本是可以…

Pandas告警UserWarning: pandas only supports SQLAlchemy connectable

Pandas告警UserWarning: pandas only supports SQLAlchemy connectable 一、报错信息二、老的书写方式三、新的书写方式 一、报错信息 使用老的书写方式从数据库导入数据到pandas, 会打出一条warning信息&#xff1a; UserWarning: pandas only supports SQLAlchemy connecta…

The browser supports WebGL, but initialization failed

1. 问题背景 在windows server上的浏览器通过cesium预览地图展示&#xff0c;会报错&#xff0c;导致地图不能正常预览。 2. 验证浏览器是否支持WebGL 这里有两个网站地址进行验证。 https://get.webgl.org/ https://webglreport.com/?v2 3. 修改浏览器配置&#xff08…

@supports使用方法

原文地址&#xff1a;https://justforuse.github.io/blog/zh-cn/2018/08/supports-tutorial/ supports是CSS3新引入的规则之一&#xff0c;主要用于检测当前浏览器是否支持某个CSS属性并加载具体样式. 基本使用方式&#xff1a; supports (display: grid) {.container {color…

@supports的用法

supports我们经常在css中遇到&#xff0c;supports是用来检测浏览器是否支持css的某个属性。通常我们可以用它来处理浏览器的兼容性的问题。用supports来判断浏览器是否支持这个css属性&#xff0c;如果支持的话&#xff0c;我们写的css样式就会起作用&#xff0c;否则的话不会…

CSS中 特性查询(@supports)详解及使用

1. 简介 CSS中的 supports 用于检测浏览器是否支持 CSS 的某个属性。其实就是条件判断&#xff0c;如果支持某个属性可以写一套样式&#xff0c;如果不支持某个属性&#xff0c;可以提供另外一套样式作为替补。可以放在代码的顶层&#xff0c;也可以嵌套在任何其他条件组规则中…

记一次破解blob加密视频网站的过程

现在很多主流的视频网站几乎都是用到了blob的加密&#xff08;其实也不算是加密&#xff09;&#xff0c;效果是隐藏了视频源的地址&#xff0c;其背后的本质还是通过一段执行一段js拿到视频的切片文件&#xff0c;然后进行拼接播放。就像下面这样的 其实对于普通情况来说&…

视频加密技术的实与破解

知识付费盛行的当下&#xff0c;视频加密技术也算是有了又一个好的应用场景&#xff0c;本场 Chat 您将学到如下内容&#xff1a; 初步了解视频加密技术的前世今生视频大厂采用的视频技术云厂商采用的视频技术多维度的安全对比如今付费视频网站都采用哪些加密方式实打实的下载…

金盾金狮点盾云鹏保宝等加密视频录屏翻录提取教程

采用独家方法特殊方式打开录屏工具&#xff0c;理论上通杀所有的检测进程的加密视频播放器的检测&#xff0c;不被检测。 使用方法很简单&#xff1a; 点击 打开录屏工具&#xff0c;就可以以特殊方式加载录屏工具。 然后就可以开始录屏了。 下载&#xff1a;jsxc.neocities.…

加密视频的解密思路,金盾提取

互联网发展到今天&#xff0c;我们已经可以从网上获取各种各样的资料了。大大的方便了我们的学习和生活。特别是视频&#xff0c;各种培训课程&#xff0c;基本只有VIP才能享受&#xff0c;而且还不能分享给其他人&#xff0c;因为视频加密了。 那么视频可以解密出来吗&#xf…

2023VR视频加密解决方案

如今VR技术在各个领域中的使用&#xff0c;使得我们在日常生活中也可以看到它的身影&#xff0c;常见的就是应用到培训、影院和游戏当中&#xff0c;我们都知道VR视频比传统的平面视频能给用户带来更好的体验&#xff0c;而且现在在教育、娱乐等领域VR类视频也越来越多。相比于…