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 的支持】

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容