欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Jetpack Compose - Image

程序员文章站 2022-03-04 22:53:58
...

注意:当前是alpha07版本的Compose,Image控件是在foundation包中的。material包中没有。

1、属性一览

首先直接看下官网给的方法,链接在这里

@Composable inline fun Image(
    asset: ImageAsset, 
    modifier: Modifier = Modifier, 
    alignment: Alignment = Alignment.Center, 
    contentScale: ContentScale = ContentScale.Fit, 
    alpha: Float = DefaultAlpha, 
    colorFilter: ColorFilter? = null
): Unit
@Composable inline fun Image(
    asset: VectorAsset, 
    modifier: Modifier = Modifier, 
    alignment: Alignment = Alignment.Center, 
    contentScale: ContentScale = ContentScale.Fit, 
    alpha: Float = DefaultAlpha, 
    colorFilter: ColorFilter? = null
): Unit
@Composable fun Image(
    painter: Painter, 
    modifier: Modifier = Modifier, 
    alignment: Alignment = Alignment.Center, 
    contentScale: ContentScale = ContentScale.Fit, 
    alpha: Float = DefaultAlpha, 
    colorFilter: ColorFilter? = null
): Unit

这三种方法区别在第一个参数:

  • asset: ImageAsset
    使用的是图片资源,我们可以使用 ImageResources.kt中的imageResource(@DrawableRes id: Int): ImageAsset 方法来加载,但是该方法可能会被废弃,因为Google可能更提倡异步加载的方案,见同类中的loadImageResource方法;

  • asset: VectorAsset,
    使用的是矢量资源,我们可以使用VectorResources.kt中的vectorResource(@DrawableRes id: Int): VectorAsset方法来加载,但是该方法可能会被废弃,因为Google可能更提倡异步加载的方案,见同类中的loadVectorResource方法;

  • painter: Painter
    这个可能就涉及到了画笔画布的类似操作,目前还不清楚如何使用;

  • modifier: Modifier = Modifier
    这个时候Modifier的作用就出来了,我们可以给图片设置裁剪形状,设置边框等操作

  • alignment: Alignment = Alignment.Center
    对齐方式

  • contentScale: ContentScale = ContentScale.Fit
    如果设置的边界大小和图片资源的大小不同,那么就使用该参数来确定要使用的缩放比例,类同于ImageView中的ScaleType属性了。

  • alpha: Float = DefaultAlpha
    不透明度

  • colorFilter: ColorFilter? = null
    将某种颜色应用到图片上

2、使用示例

我们将400*200的一张图片放到drawable目录下,然后下文代码中使用它:

@Composable
fun ImageDemo() {
    Image(
            asset = imageResource(id = R.drawable.demo),
    )
}

最简单的代码如上所示,此时图片会全部展示在页面上:
Jetpack Compose - Image
然后我们设置下修饰符相关的属性,设置其宽高为100,然后居中裁剪,代码如下所示:

@Composable
fun ImageDemo() {
    Image(
            asset = imageResource(id = R.drawable.demo),
            contentScale = ContentScale.Crop,
            modifier = Modifier
                    .width(100.dp)
                    .height(100.dp)
    )
}

结果如下所示:
Jetpack Compose - Image
像一些圆角或者圆形图片的设置,就可以在修饰符中进行配置了,直接看代码:

@Composable
fun ImageDemo() {
    Image(
            asset = imageResource(id = R.drawable.demo),
            contentScale = ContentScale.Crop,
            modifier = Modifier
                    .width(100.dp)
                    .height(100.dp)
                    .clip(shape = RoundedCornerShape(50))
                    .border(
                            width = 2.dp,
                            color = Color.White,
                            shape = RoundedCornerShape(50)
                    )
    )
}

首先clip属性中我们给该图片指定了圆角的形状,圆角百分比50,也就是圆形了。
然后在border属性中我们给这个图片指定了一个宽度2dp,颜色为白色的,也是圆形的边框。
所以效果图如下所示:
Jetpack Compose - Image

3、未解决问题

上面的代码基本可以解决大部分图片使用的问题了,但是有一个很重要的问题就是如何加载网络图片,并且处理好缓存等相关问题。
在上面中提到的一些API中,有注释写着Google推荐使用异步加载的方式,那么有没有可能直接提供出图片加载的框架呢,或许其他第三方的图片框架已经跃跃欲试开始适配Compose了呢?