Dependency
groovy
plugins {
id 'kotlin-kapt'
}
dependencies {
api 'com.github.bumptech.glide:glide:4.12.0'
kapt 'com.github.bumptech.glide:compiler:4.12.0'
api 'com.caverock:androidsvg:1.4'
}
SvgDecoder
负责解码SVG资源
kotlin
import com.bumptech.glide.load.Options
import com.bumptech.glide.load.ResourceDecoder
import com.bumptech.glide.load.engine.Resource
import com.bumptech.glide.load.resource.SimpleResource
import com.bumptech.glide.request.target.Target
import com.caverock.androidsvg.SVG
import java.io.InputStream
class SvgDecoder : ResourceDecoder<InputStream, SVG> {
override fun handles(source: InputStream, options: Options): Boolean {
return true
}
override fun decode(
source: InputStream, width: Int, height: Int, options: Options
): Resource<SVG> {
val svg = SVG.getFromInputStream(source)
if (width != Target.SIZE_ORIGINAL)
svg.documentWidth = width.toFloat()
if (height != Target.SIZE_ORIGINAL)
svg.documentHeight = height.toFloat()
return SimpleResource(svg)
}
}
SvgTranscoder
负责将SVG转为Android的Drawable或Bitmap
kotlin
import android.graphics.drawable.PictureDrawable
import com.bumptech.glide.load.Options
import com.bumptech.glide.load.engine.Resource
import com.bumptech.glide.load.resource.SimpleResource
import com.bumptech.glide.load.resource.transcode.ResourceTranscoder
import com.caverock.androidsvg.SVG
class SvgTranscoder : ResourceTranscoder<SVG, PictureDrawable> {
override fun transcode(
toTranscode: Resource<SVG>, options: Options
): Resource<PictureDrawable> {
val svg = toTranscode.get()
val picture = svg.renderToPicture()
val drawable = PictureDrawable(picture)
return SimpleResource(drawable)
}
}
SvgModule
注册Glide自定义插件
kotlin
import android.content.Context
import android.graphics.drawable.PictureDrawable
import com.bumptech.glide.Glide
import com.bumptech.glide.Registry
import com.bumptech.glide.annotation.GlideModule
import com.bumptech.glide.module.AppGlideModule
import com.caverock.androidsvg.SVG
import java.io.InputStream
@GlideModule
class SvgModule : AppGlideModule() {
override fun registerComponents(context: Context, glide: Glide, registry: Registry) {
registry.register(SVG::class.java, PictureDrawable::class.java, SvgTranscoder())
registry.append(InputStream::class.java, SVG::class.java, SvgDecoder())
}
override fun isManifestParsingEnabled(): Boolean {
return false
}
}
GlideApp
编译会生成一个GlideApp,用它来取代默认的Glide加载资源即可
kotlin
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.drawable.Drawable
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import com.bumptech.glide.load.DataSource
import com.bumptech.glide.load.engine.GlideException
import com.bumptech.glide.request.RequestListener
import com.bumptech.glide.request.target.Target
import com.onyx.android.test.databinding.ActivityHomeBinding
import java.io.FileOutputStream
class HomeActivity : AppCompatActivity() {
lateinit var binding: ActivityHomeBinding
private val svg = "http://xxxxxxxxxxxxx.svg"
private val png = "https://xxxxxxxxxxxxx.png"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityHomeBinding.inflate(layoutInflater)
setContentView(binding.root)
}
override fun onResume() {
super.onResume()
test()
}
private fun test() {
val image = binding.image
val listener = object : RequestListener<Drawable> {
override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Drawable>?, isFirstResource: Boolean): Boolean {
return false
}
// write to png file
override fun onResourceReady(drawable: Drawable, model: Any?, target: Target<Drawable>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
val bitmap = Bitmap.createBitmap(
drawable.intrinsicWidth,
drawable.intrinsicHeight, Bitmap.Config.ARGB_8888
)
val canvas = Canvas(bitmap)
drawable.setBounds(0, 0, canvas.width, canvas.height)
drawable.draw(canvas)
val file = "sdcard/0.png"
FileOutputStream(file).use {
bitmap.compress(Bitmap.CompressFormat.PNG, 100, it)
}
return false
}
}
GlideApp.with(this)
.asDrawable()
.load(svg)
.addListener(listener)
.into(image)
}
}