内容纲要
Android Compose 使用 SVG 作为图标
依赖
val coilVersion = "2.5.0"
dependencies {
// ...
implementation("io.coil-kt:coil-compose:$coilVersion")
implementation("io.coil-kt:coil-svg:$coilVersion")
}
工具类
package com.example.util
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.FilterQuality
import androidx.compose.ui.graphics.drawscope.DrawScope
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalContext
import coil.ImageLoader
import coil.compose.AsyncImagePainter
import coil.compose.rememberAsyncImagePainter
import coil.decode.SvgDecoder
@Composable
fun rememberSvgPainter(
model: Any?,
imageLoader: ImageLoader = ImageLoader.Builder(LocalContext.current)
.components {
add(SvgDecoder.Factory())
}
.build(),
transform: (AsyncImagePainter.State) -> AsyncImagePainter.State = AsyncImagePainter.DefaultTransform,
onState: ((AsyncImagePainter.State) -> Unit)? = null,
contentScale: ContentScale = ContentScale.Fit,
filterQuality: FilterQuality = DrawScope.DefaultFilterQuality,
): AsyncImagePainter {
return rememberAsyncImagePainter(
model = model,
imageLoader = imageLoader,
transform = transform,
onState = onState,
contentScale = contentScale,
filterQuality = filterQuality
)
}
@Composable
fun rememberAssetsPainter(
path: String,
imageLoader: ImageLoader = ImageLoader.Builder(LocalContext.current)
.components {
add(SvgDecoder.Factory())
}
.build(),
transform: (AsyncImagePainter.State) -> AsyncImagePainter.State = AsyncImagePainter.DefaultTransform,
onState: ((AsyncImagePainter.State) -> Unit)? = null,
contentScale: ContentScale = ContentScale.Fit,
filterQuality: FilterQuality = DrawScope.DefaultFilterQuality,
): AsyncImagePainter {
return rememberAsyncImagePainter(
model = "file:///android_asset/${path}",
imageLoader = imageLoader,
transform = transform,
onState = onState,
contentScale = contentScale,
filterQuality = filterQuality
)
}
图标放在 assets (app\src\main\assets) 目录的 drawable 文件夹
// assets
├─assets
│ └─drawable
│ undo_black_24dp.svg
然后就可以这样调用
Icon(
rememberAssetsPainter(path = "drawable/undo_black_24dp.svg"),
contentDescription = "撤销"
)