赞
踩
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'
}
负责解码SVG资源
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) } }
负责将SVG转为Android的Drawable或Bitmap
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) } }
注册Glide自定义插件
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,用它来取代默认的Glide加载资源即可
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) } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。