Jetpack Compose基础组件 - Image

news2024/12/26 15:08:53

Image的源码参数预览

@Composable
fun Image(
    painter: Painter,
    contentDescription: String?,
    modifier: Modifier = Modifier,
    alignment: Alignment = Alignment.Center,
    contentScale: ContentScale = ContentScale.Fit,
    alpha: Float = DefaultAlpha,
    colorFilter: ColorFilter? = null
)

目前在 Compose 中 Image 有三种,详情可先在官网中找到

Image 可以帮我们加载一张图片

@Composable
fun ImageScreen1() {
    Image(
        painter = painterResource(id = R.drawable.ic_launcher_background),
        contentDescription = null
    )
}

@Preview(showBackground = true)
@Composable
fun ImageScreenPreview1() {
    ImageScreen1()
}

图片大小

我们可以使用 Modifier.size() 来设置图片大小。

@Composable
fun ImageScreen1() {
    Image(
        painter = painterResource(id = R.drawable.ic_launcher_foreground),
        contentDescription = null,
        modifier = Modifier.size(350.dp)
    )
}

图片形状

我们可以使用 Surface 来帮助我们设置形状,或者在 Image 组件中使用 modifier.clip() 来裁剪形状。

@Composable
fun ImageScreen() {
    Surface(
        shape = CircleShape
    ) {
        Image(
            painter = painterResource(id = R.drawable.wallpaper),
            contentDescription = null,
            modifier = Modifier.size(350.dp)
        )
    }

}

是不是有一点小问题?似乎只有左右两边变成了圆形,而上下并没有。

这是因为 Image 中源码的 contentScale 参数默认是 ContentScale.Fit

也就是保持图片的宽高比,缩小到可以完整显示整张图片。

而 ContentScale.Crop 也是保持宽高比,但是尽量让宽度或者高度完整的占满。

所以我们将 contentScale 设置成 ContentScale.Crop

@Composable
fun ImageScreen() {
    Surface(
        shape = CircleShape
    ) {
        Image(
            painter = painterResource(id = R.drawable.wallpaper),
            contentDescription = null,
            modifier = Modifier.size(350.dp),
            contentScale = ContentScale.Crop
        )
    }

}

图像边框

你可以利用 Surface 中的 border 参数来设置边框。

@Composable
fun ImageScreen() {
    Surface(
        shape = CircleShape,
        border = BorderStroke(5.dp, Color.Gray)
    ) {
        Image(
            painter = painterResource(id = R.drawable.wallpaper),
            contentDescription = null,
            modifier = Modifier.size(350.dp),
            contentScale = ContentScale.Crop
        )
    }
}

使用 Coil 来动态加载图片

Compose 自带的 Image 只能加载资源管理器中的图片文件,如果想加载网络图片或者是其他本地路径下的文件,则需要考虑其他的库,比如 Coil

<uses-permission android:name="android.permission.INTERNET" />
implementation("io.coil-kt:coil-compose:2.4.0")
Image(
    painter = rememberAsyncImagePainter(data = "https://picsum.photos/300/300"),
    contentDescription = null
)

加载Gif图像

implementation("io.coil-kt:coil-gif:2.4.0") // KTS
val gif_url="https://s1.chu0.com/src/img/gif/db/dba873378578488a9de51f01c101cd6a.gif?e=1735488000&token=1srnZGLKZ0Aqlz6dk7yF4SkiYf4eP-YrEOdM1sob:ENutG45YK-AdEpn2dSKWQRZ_8qY="

val imageLoader = ImageLoader.Builder(context)
        .components {
            if (SDK_INT >= 28) {
                add(ImageDecoderDecoder.Factory())
            } else {
                add(coil.decode.GifDecoder.Factory())
            }
        }
        .build()

Image(
    painter = rememberAsyncImagePainter(
        gif_url,
        imageLoader = imageLoader
    ),
    contentDescription = null
)

加载 Svg 图像

Coil 可以加载 Svg 图像

添加依赖

implementation("io.coil-kt:coil-svg:2.4.0") // KTS
val imageLoader = ImageLoader.Builder(context)
        .components {
            add(SvgDecoder.Factory(true))
        }
        .build()

Image(
    painter = rememberAsyncImagePainter(
        data = "https://coil-kt.github.io/coil/images/coil_logo_black.svg",
        imageLoader = imageLoader
    ),
    contentDescription = null
)

放大缩小 Svg 图像文件

虽然 Coil 可以显示 Svg 图像,但是如果在我们的 app 中,需要动态的放大 Svg 图像,那么你大概率会得到强行拉升 Svg 像素后的图像,而不是无损放大

导致的原因可能是 Coil 中的 ImageLoader 会把 Svg 转换成位图,而不是安卓的矢量图 vector drawable, 而位图则不能无损放大

val context = LocalContext.current
val imageLoader = ImageLoader.Builder(context)
    .componentRegistry {
        add(SvgDecoder(context))
    }
    .build()

var flag by remember { mutableStateOf(false) }
val size by animateDpAsState(targetValue = if(flag) 450.dp else 50.dp)

Box(
    modifier = Modifier.fillMaxSize(),
    contentAlignment = Alignment.Center
) {
    Column {
        Image(
            painter = rememberAsyncImagePainter(
                data = "https://coil-kt.github.io/coil/images/coil_logo_black.svg",
                imageLoader = imageLoader
            ),
            contentDescription = null,
            modifier = Modifier
                .size(size)
                .clickable(
                    onClick = {
                        flag = !flag
                    },
                    indication = null,
                    interactionSource = MutableInteractionSource()
                )
        )
    }
}

那么要解决这个问题,就是尝试实现 svg 转换为 vector drawable, 需要添加三方依赖 

Landscapist

implementation "com.github.skydoves:landscapist-coil:1.3.2"
CoilImage(
    imageModel = "https://coil-kt.github.io/coil/images/coil_logo_black.svg",
    contentDescription = null,
    modifier = Modifier
        .size(size)
        .clickable(
            onClick = {
                flag = !flag
            },
            indication = null,
            interactionSource = MutableInteractionSource()
        ),
    imageLoader = imageLoader
)

Image 参数详情

Ucrop 一个图片裁剪库

Coil

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

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

相关文章

个人记录--跟着同门学c#

前提&#xff1a;已安装Visual Studio ArcEngine&DotSpatial C#二次开发&#xff08;一&#xff09;之DotSpatial使用心得记录_dotspatial 开发文档_只想敲代码的研究僧的博客-CSDN博客 ArcEngine是一种用于二次开发的软件开发工具包&#xff0c;可以用来创建基于ArcGIS…

深入分析ASEMI代理的瑞萨R5F5210BBDFB#10芯片

编辑-Z 随着科技发展的不断升级&#xff0c;电子技术正变得越来越复杂。不过&#xff0c;在这个繁复的电子世界中&#xff0c;有一样东西在不断地帮助着我们简化各种复杂的任务&#xff0c;那就是微型集成电路&#xff0c;也叫做“芯片”。今天我们将会对R5F5210BBDFB#10芯片这…

改变世界的物理学方程

1.牛顿万有引力定律 艾萨克牛顿爵士的万有引力定律&#xff0c;通常简称为牛顿万有引力定律&#xff0c;是物理学的基本原理。牛顿于 1687 年在其开创性著作《Philosophi Naturalis Principia Mathematica》&#xff08;自然哲学的数学原理&#xff09;中发表了这一定律。 该定…

6个免费视频素材网站,高清无水印,赶紧收藏起来~

6个免费视频素材网站&#xff0c;高清无水印&#xff0c;赶紧收藏起来~ 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYxMjky 菜鸟图库网素材非常丰富&#xff0c;网站主要还是以设计类素材为主&#xff0c;高清视频素材也很多&#xff0c;像风景、植物、动物、人物、…

使用 PyTorch 的计算机视觉简介 (1/6)

一、说明 Computer Vision&#xff08;CV&#xff09;是一个研究计算机如何从数字图像和/或视频中获得一定程度的理解的领域。理解这个定义具有相当广泛的含义 - 它可以从能够区分图片上的猫和狗&#xff0c;到更复杂的任务&#xff0c;例如用自然语言描述图像。 二、CV常见的问…

提升网站效率与SEO优化:ZBlog插件集成解决方案

在创建和管理网站的过程中&#xff0c;使用合适的工具和插件可以大幅提升效率&#xff0c;并改善搜索引擎优化&#xff08;SEO&#xff09;结果。ZBlog插件是为ZBlogCMS设计的一组工具&#xff0c;它们帮助网站管理员轻松地满足各种需求&#xff0c;从采集内容到发布、推送和SE…

基于dq0变换的三相并联有源电力滤波器模拟模型(Simulink)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

CSS——grid网格布局的基本使用

网格布局在实现页面自适应&#xff0c;大屏可视化中常常使用&#xff0c;在这篇博客里&#xff0c;记录一下网格布局的基本使用。 参考文档&#xff1a;网格布局_菜鸟教程 文章目录 1. 体会grid的自适应性2. grid-template-arr配置网格行列3. 网格单位fr与repeat()简写属性值4…

API(十一) 获取openresty编译信息

一 ngx.config 说明&#xff1a; 不常用,了解即可 ngx.config.subsystem 说明&#xff1a; 用的四层还是七层代理 ngx.config.debug 说明&#xff1a; 返回的是boolean类型, openresty rpm安装一般没有 --with-debug编译选项对比&#xff1a; nginx rpm 安装一般携带 --wi…

【JDK 8-集合框架】5.2 map 和 filter 函数

一、map 函数 1. 上节例子 2. DO 转 DTO 对象 Stage 1&#xff1a;创建数据库映射对象&#xff08;DO&#xff09;> User.java Stage 2&#xff1a;前端数据传输对象&#xff08;DTO&#xff09;> UserDTO.java Stage 3&#xff1a;DO 转 DTO Stage 4&#xff1a;…

Flutter的启动和渲染流程

一、Flutter的启动流程 1、Flutter启动初始化 在安卓平台上启动App时&#xff0c;会先创建应用进程&#xff0c;然后创建FlutterApplication并执行其onCreate方法。在FlutterApplication的onCreate方法中&#xff0c;会执行Flutter相关的初始化&#xff0c;主要包括Flutter编…

VB过程的递归调用,求4的阶乘

VB过程的递归调用&#xff0c;求4的阶乘 过程的递归调用&#xff0c;求4的阶乘 Private Function fact(n As Integer) As IntegerIf n 1 Thenfact 1Elsefact n * fact(n - 1)End If End Function Private Sub Command1_Click()Dim n As Integern 4Print fact(n) End Sub

【活动回顾】Rust:构建新时代基础设施的首选语言 @Qcon

以「启航 • AIGC 软件工程变革」为主题的 QCon 全球软件开发大会北京站于 9 月 5 日在北京富力万丽酒店圆满落幕&#xff01;此次大会包含向量数据库、云原生、异构计算、面向 AI 的存储、微服务架构治理、FinOps 等近 30 个精彩专题。Databend Labs 作为深耕云原生数据库领域…

uniapp实现表格冻结

效果图如下&#xff1a; 思路&#xff1a; 1.由于APP项目需要&#xff0c;起初想去插件市场直接找现成的&#xff0c;结果找了很久没找到合适的&#xff08;有的不支持vue2有的不能都支持APP和小程序&#xff09; 2.后来&#xff0c;就只能去改uni-table源码了&#xff0c;因…

Vue3中watch用法

在 Vue3 中的组合式 API 中&#xff0c;watch 的作用和 Vue2 中的 watch 作用是一样的&#xff0c;他们都是用来监听响应式状态发生变化的&#xff0c;当响应式状态发生变化时&#xff0c;都会触发一个回调函数。 当需要在数据变化时执行异步或开销较大的操作时&#xff0c;com…

推三返一模式:电商运营的新趋势

商行业在近年来发展迅速&#xff0c;各种平台和产品层出不穷&#xff0c;竞争也越来越激烈。如何在这样的环境中脱颖而出&#xff0c;吸引和留住用户&#xff0c;提高销售和利润&#xff0c;是每一个电商企业家都面临的挑战。有没有一种运营模式&#xff0c;可以让用户主动购买…

解决报错:npm ERR! code 1

我是 npm install --legacy-peer-deps 成功了 解决方案&#xff1a; 升级swiper库&#xff1a;你可以尝试升级你的项目中的swiper库到5.2.0或更高版本&#xff0c;以满足vue-awesome-swiper的需求。你可以使用以下命令来进行升级&#xff1a; npm install swiperlatest 注意…

MPLS VPN跨域A

拓扑设计 拓扑介绍 如图&#xff0c;上海分公司与山东分公司之间为保证业务可以互通&#xff0c;需要使用MPLS VPN技术进行连接。中间R3与R4之间运行IGP&#xff0c;使用IGP传递路由&#xff0c;因为网络需要经过联通与移动两个AS域&#xff0c;所以使用MPLS VPN OptionA方案来…

SDXL prompt 笔记

模型 模型有两个&#xff0c;分别是 stable-diffusion-xl-base-1.0、stable-diffusion-xl-refiner-1.0。 base 模型是用来做文生图&#xff0c;refiner 模型是用来做图生图的。 SDXL 模型之 base、refiner 和 VAE_云水木石的博客-CSDN博客 分辨率 默认是1024*1024&#xf…