android - 无法在 Android 上加载 svg 资源
问题描述
项目中使用implementation 'com.github.bumptech.glide:glide:4.8.0'
从服务器链接获取(.svg)
如何.svg
为给定的 url 下载该图标并在 ImageView 中通过滑行显示它?
现在我使用它是这样的:
Glide.with(bankLogoView.context)
.`as`(PictureDrawable::class.java)
.load(data.logoUrl)
.listener(SvgSoftwareLayerSetter())
.apply(options)
.into(bankLogoView)
哪里有:
private val options = RequestOptions().centerCrop()
.diskCacheStrategy(DiskCacheStrategy.ALL).placeholder(R.drawable.ic_logo_splash)
还添加了下一个类SvgDecoder
:
class SvgDecoder : ResourceDecoder<InputStream, SVG> {
override fun handles(source: InputStream, options: Options): Boolean {
// TODO: Can we tell?
return true
}
@Throws(IOException::class)
override fun decode(source: InputStream, width: Int, height: Int,
options: Options): Resource<SVG>? {
try {
val svg = SVG.getFromInputStream(source)
return SimpleResource(svg)
} catch (ex: SVGParseException) {
throw IOException("Cannot load SVG from stream", ex)
}
}
}
SvgDrawableTranscoder:
class SvgDrawableTranscoder : 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)
}
}
SVG模块:
@GlideModule
class SvgModule : AppGlideModule() {
override fun registerComponents(context: Context, glide: Glide,
registry: Registry) {
registry.register(SVG::class.java, PictureDrawable::class.java, SvgDrawableTranscoder())
.append(InputStream::class.java, SVG::class.java, SvgDecoder())
}
// Disable manifest parsing to avoid adding similar modules twice.
override fun isManifestParsingEnabled(): Boolean {
return false
}
}
SvgSoftwareLayerSetter:
class SvgSoftwareLayerSetter : RequestListener<PictureDrawable> {
override fun onLoadFailed(e: GlideException?, model: Any, target: Target<PictureDrawable>,
isFirstResource: Boolean): Boolean {
val view = (target as ImageViewTarget<*>).view
view.setLayerType(ImageView.LAYER_TYPE_NONE, null)
return false
}
override fun onResourceReady(resource: PictureDrawable, model: Any,
target: Target<PictureDrawable>, dataSource: DataSource, isFirstResource: Boolean): Boolean {
val view = (target as ImageViewTarget<*>).view
view.setLayerType(ImageView.LAYER_TYPE_SOFTWARE, null)
return false
}
}
但我也只显示选项。data.logoUrl
不为空但不显示
升级版:
W/Glide:为https://mandarine.com/logos/providers/xf/fake_demobank_xf.svg加载失败,大小为 [65x66] 类 com.bumptech.glide.load.engine.GlideException:加载资源失败
.load("url")
当我喜欢时,试图从谷歌硬编码一些网址:
https://upload.wikimedia.org/wikipedia/sco/7/71/Pringles.svg
但也没有显示图像。
我尝试做的第二种方式:实现这个库
implementation 'com.caverock:androidsvg-aar:1.3'
然后修改了我的布局:
<com.caverock.androidsvg.SVGImageView
android:id="@+id/bankLogoView"
style="@style/icon_account_view"
app:svg="@drawable/ic_buy_violet"/>
在我的持有人之后,像这样:
bankLogoView.setImageAsset("wallet.svg")
但我如何从服务器下载 .svg 文件?
解决方案
我的代码是用 Java 编写的,但希望你能收到备忘录。将以下依赖项添加到您的应用程序模块 build.gradle 文件中:
implementation 'com.caverock:androidsvg:1.2.1'
在你的GlideModule
:
public class GlideModule extends AppGlideModule {
...
@Override
public void registerComponents(@NonNull Context context, @NonNull Glide glide, @NonNull Registry registry) {
registry.register(SVG.class, PictureDrawable.class, new SvgDrawableTranscoder()).append(InputStream.class, SVG.class, new SvgDecoder());
}
}
SvgDecoder.java
public class SvgDecoder implements ResourceDecoder<InputStream, SVG> {
@Override
public boolean handles(InputStream source, Options options) throws IOException {
// TODO: Can we tell?
return true;
}
public Resource<SVG> decode(InputStream source, int width, int height, Options options)
throws IOException {
try {
SVG svg = SVG.getFromInputStream(source);
return new SimpleResource<SVG>(svg);
} catch (SVGParseException ex) {
throw new IOException("Cannot load SVG from stream", ex);
}
}
}
SvgDrawableTranscoder.java
public class SvgDrawableTranscoder implements ResourceTranscoder<SVG, PictureDrawable> {
@Override
public Resource<PictureDrawable> transcode(Resource<SVG> toTranscode, Options options) {
SVG svg = toTranscode.get();
Picture picture = svg.renderToPicture();
PictureDrawable drawable = new PictureDrawable(picture);
return new SimpleResource<PictureDrawable>(drawable);
}
}
SvgSoftwareLayerSetter.java
public class SvgSoftwareLayerSetter implements RequestListener<PictureDrawable> {
@Override
public boolean onLoadFailed(GlideException e, Object model, Target<PictureDrawable> target,
boolean isFirstResource) {
ImageView view = ((ImageViewTarget<?>) target).getView();
view.setLayerType(ImageView.LAYER_TYPE_NONE, null);
return false;
}
@Override
public boolean onResourceReady(PictureDrawable resource, Object model,
Target<PictureDrawable> target, DataSource dataSource, boolean isFirstResource) {
ImageView view = ((ImageViewTarget<?>) target).getView();
view.setLayerType(ImageView.LAYER_TYPE_SOFTWARE, null);
return false;
}
}
然后将它与 Glide 一起使用,例如:
Glide.with(this)
.as(PictureDrawable.class)
.load(svgUrl)
.listener(new SvgSoftwareLayerSetter())
.into(imageView);
推荐阅读
- c - 两个不同函数指针的typedef是否有效?
- java - Hibernate Criteria:不同的实体,Fetch join 和 MaxResults
- angular - Angular 单元测试表单验证 - 控制保持不变
- python - 如何找到 10000 以下的最长的合数序列?我如何只打印最长的系列?
- django - 将动态生成的列添加到 django 管理列表视图
- java - 正则表达式匹配包含单词的确切字符串
- python-3.x - 如何通过代码创建odoo 12网站子菜单?
- spring-boot - 如何在循环中的单个或多个页面中添加多个文本字段
- docfx - docFX - 删除 API 参考目录中的命名空间前缀
- php - WordPress webp 图片预览