Compose学习--Image

Compose 中 Image

Image 介绍

public fun Image(
    painter: Painter,
    contentDescription: String?,
    modifier: Modifier = COMPILED_CODE,
    alignment: Alignment = COMPILED_CODE,
    contentScale: ContentScale = COMPILED_CODE,
    alpha: Float = COMPILED_CODE,
    colorFilter: ColorFilter? = COMPILED_CODE
): Unit
  • painter 需要传入的图片,可以是矢量图,可以是位图 ,常用方法就是painterResource(id = R.mipmap.xxx)
  • contentDescription 图片的描述,如果不是重要的图片展示可以为null
  • modifier用于调整布局算法或绘制装饰内容(例如背景)的修饰符,下文会表述一些image的modifier使用
  • alignment 可选的对齐参数,用于将Painter放置在由宽度和高度定义的给定边界内。默认居中,这个属性比较基础,本文不会过多描述
  • contentScale 可选的缩放参数,用于确定当边界的大小与Painter的固有大小不同时要使用的纵横比缩放,默认均匀缩放图片,并保持宽高比。如果内容小于指定大小,系统会放大图片以适应边界。
  • alpha在屏幕上渲染时可选不透明度,默认情况下,图片将完全不透明
  • colorFilter在屏幕上渲染时应用于Painter的可选colorFilter,可用于更改图片中各个像素的输出。以达到滤镜的效果

ContentScale 属性介绍

  • 默认(ContentScale.Fit)
    均匀缩放图片,并保持宽高比。如果内容小于指定大小,系统会放大图片以适应边界。(图片会缩小,然后全部展示,但是宽高比不会不变,如果宽高比不对应,则显示有背景边框)
  • 将图片居中裁剪到可用空间(ContentScale.Crop)
    图片将整个背景填充满,无论横向还是纵向,看起来饱满,但是有裁剪。
  • 缩放图片,保持宽高不变,使边界与目标边界匹配(ContentScale.FillHeight\ContentScale.FillWidth)
    缩放图片,保持宽高不变,使边界与目标边界匹配,如果控件尺寸不匹配,图片有裁剪。
  • 以非均匀方式垂直和水平缩放内容,以填充目标边界。(ContentScale.FillBounds)
    不裁剪图片并将图片拉伸至填充满整个Image控件,这样既可以完全展示图片,有让其填充满控件,缺点是图片容易失真,比例拉伸,不美观。
  • 缩放来源图片,使宽高保持在目标边界内。(ContentScale.Inside)
    缩放来源图片,使宽高保持在目标边界内。如果来源图片在两个维度上都小于或等于目标,内容始终包含在边界内。感觉与Fit一样,但区别在于,如果内容小于边界,则不会应用缩放。
  • 不缩放。(ContentScale.None)
    原图片,不做任何调整,缩放、剪切。

Modifier 属性介绍

  • Modifier.clip()
    这个属性,主要将图片裁剪成圆形或者圆角,与背景裁剪成圆角和圆形的大概相似。
Modifier.background(
                colorResource(R.color.color_f5f5f5),
                shape = RoundedCornerShape(16.dp, 16.dp, 0.dp, 0.dp)
  )

在Image中:

Modifier
        .size(150.dp)
        //加了边框
        .border(BorderStroke(1.dp, Black))
        .background(Yellow)
        .clip( RoundedCornerShape(16.dp, 16.dp, 0.dp, 0.dp))

注: 在进行圆形裁剪时,要注意contentScale的属性,不然可能不生效。

  • Modifier.border()
    添加边框

  • Modifier.aspectRatio(4f/3f)
    图片转化自定义宽高比(4:3)

  • Modifier.blur()
    模糊效果

Modifier.blur(
            radiusX = 10.dp,
            radiusY = 10.dp,
            edgeTreatment = BlurredEdgeTreatment(RoundedCornerShape(8.dp))
        )

ColorFilter 属性介绍

基本用法

Image(
    painter = painterResource(id = R.drawable.apple),
    contentDescription = stringResource(id = R.string.apple_content_description),
    colorFilter = ColorFilter.tint(Color.Green, blendMode = BlendMode.Darken)
)

其中其实主要就是使用ColorFilter.tint() 方法。

@Stable
        fun tint(color: Color, blendMode: BlendMode = BlendMode.SrcIn): ColorFilter =
            actualTintColorFilter(color, blendMode)

可以看到需要我们传入一个Color颜色,然后传入一个BlendMode,默认是BlendMode.SrcIn,我们通过官方文档可以看到有如下表格那么多种模式:

混合模式参数 效果
BlendMode.Color 获取源图像的色调和饱和度,以及目标图像的亮度。
BlendMode.Color 获取源图像的色调和饱和度,以及目标图像的亮度。
BlendMode.ColorBurn 将目标的倒数除以源,然后求结果的倒数。
BlendMode.ColorDodge 将目标的倒数除以源。
BlendMode.Darken 通过从每个颜色通道中选择最低值来合成源图像和目标图像。
BlendMode.Difference 从每个通道的较大值中减去较小值。
BlendMode.Dst 删除源图像,仅绘制目标图像。
BlendMode.DstAtop 在源图像上合成目标图像,但仅在其与源图像重叠的位置。
BlendMode.DstIn 显示目标图像,但仅显示两个图像重叠的位置。
BlendMode.DstOut 显示目标图像,但仅在两个图像不重叠的地方显示。
BlendMode.DstOver 在目标图像下合成源图像
BlendMode.Exclusion 从两幅图像的总和中减去两幅图像乘积的两倍。
BlendMode.Hardlight 在调整源图像和目标图像的分量以利于源图像之后,将它们相乘。
BlendMode.Hue 获取源图像的色调,以及目标图像的饱和度和亮度。
BlendMode.Lighten 通过从每个颜色通道中选择最高值来合成源图像和目标图像。
BlendMode.Luminosity 获取源图像的亮度,以及目标图像的色调和饱和度。
BlendMode.Modulate 将源图像和目标图像的颜色分量相乘。
BlendMode.Multiply 将源图像和目标图像的分量相乘,包括alpha通道。
BlendMode.Overlay 在调整源图像和目标图像的分量以有利于目标之后,将它们相乘。
BlendMode.Plus 将源图像和目标图像的分量相加。
BlendMode.Saturation 获取源图像的饱和度以及目标图像的色调和亮度。
BlendMode.Screen 将源图像和目标图像的分量的倒数相乘,并求出结果的倒数。
BlendMode.Softlight 对于低于0.5的源值,使用ColorDodge;对于高于0.5的源,使用ColorBurn。
BlendMode.Src 删除目标图像,仅绘制源图像。
BlendMode.SrcAtop 在目标图像上合成源图像,但仅在其与目标重叠的位置。
BlendMode.SrcIn 显示源图像,但仅显示两个图像重叠的位置。
BlendMode.SrcOut 显示源图像,但仅在两个图像不重叠的地方显示。
BlendMode.SrcOver 在目标图像上合成源图像。
BlendMode.Xor 对源图像和目标图像应用逐位异或运算符。

加载网络图片

添加依赖

implementation "io.coil-kt:coil-compose:2.1.0"

使用

@Composable
fun NetworkImage(){
    val url = "https://xxxxx.png"
    Column(
        Modifier.padding(top = 50.dp)
    ){
        AsyncImage(
            model = url,
            contentDescription = null
        )

        val modelBuilder = ImageRequest.Builder(LocalContext.current)
            .data(url ?: "")
            .crossfade(false)
            .allowHardware(true)
            .build()

        Image(
            painter = rememberAsyncImagePainter(
                model = modelBuilder
            ),
            contentDescription = "头像",
        )
    }
}

两种通过url网络加载图片。
具体可参考【Coil 对 Compose 的支持】

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容