Android 从SVG Url资源获取位图
我试图使用Glide从URL获取SVG资源,但我不知道如何获取位图对象,而不是将其加载到视图中。Android 从SVG Url资源获取位图,android,svg,bitmap,android-widget,android-glide,Android,Svg,Bitmap,Android Widget,Android Glide,我试图使用Glide从URL获取SVG资源,但我不知道如何获取位图对象,而不是将其加载到视图中。 原因是我需要在小部件上加载一些SVG文件 我用了这个例子: 更新1: 设置GenericRequestBuilder final RemoteViews fViews = views; final int fViewId = viewId; Runnable myRunnable = new Runnable() {
原因是我需要在小部件上加载一些SVG文件 我用了这个例子: 更新1: 设置GenericRequestBuilder
final RemoteViews fViews = views;
final int fViewId = viewId;
Runnable myRunnable = new Runnable() {
@Override
public void run() {
GenericRequestBuilder<Uri, InputStream, SVG, Bitmap> requestBuilder;
requestBuilder = Glide.with(mContext)
.using(Glide.buildStreamModelLoader(Uri.class, mContext), InputStream.class)
.from(Uri.class)
.as(SVG.class)
.transcode(new SvgBitmapTranscoder(), Bitmap.class)
.sourceEncoder(new StreamEncoder())
.cacheDecoder(new FileToStreamDecoder<SVG>(new SvgDecoder()))
.decoder(new SvgDecoder())
.placeholder(R.drawable.ic_launcher)
.error(R.drawable.no_icon)
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.load(Uri.parse(url));
requestBuilder.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
fViews.setImageViewBitmap(fViewId, resource);
}
});
}
};
mainHandler.post(myRunnable);
final RemoteViews fViews=views;
final int fViewId=视图ID;
Runnable myRunnable=新Runnable(){
@凌驾
公开募捐{
GenericRequestBuilder请求生成器;
requestBuilder=Glide.with(mContext)
.使用(Glide.buildStreamModelLoader(Uri.class,mContext),InputStream.class)
.from(Uri.class)
.as(SVG.class)
.transcode(新的SvgBitmapTranscoder(),Bitmap.class)
.sourceEncoder(新的StreamEncoder())
.cacheDecoder(新文件ToStreamDecoder(新SvgDecoder()))
.decoder(新的SvgDecoder())
.占位符(R.drawable.ic_启动器)
.错误(R.drawable.no_图标)
.diskCacheStrategy(diskCacheStrategy.SOURCE)
.load(Uri.parse(url));
requestBuilder.into(新SimpleTarget()){
@凌驾
public void onResourceReady(位图资源,动画尝试以下操作:
.transcode(new SvgBitmapTranscoder(), Bitmap.class)
.into(new SimpleTarget<Bitmap>(sizeW, sizeH) {
@Override public void onResourceReady(Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
// update RemoteViews with resource
}
})
.transcode(新的SvgBitmapTranscoder(),Bitmap.class)
.into(新的SimpleTarget(sizeW,sizeH){
@Override public void onResourceReady(位图资源,GlideAnimationIt’s not work,我根据您的建议用我使用的代码更新了原始问题。它可能涉及的对象:根据上面的注释,此解决方案总体上是可行的(“还验证了我使用的代码将位图正确保存到磁盘”),问题似乎是将生成的位图发送到应用程序小部件。请稍等,如果您已经关闭了main,为什么要使用Glide?获取网络流并自己解码SVG可能更容易。或者,如果您已经在main,为什么要发布到main?我也这样做了,运行了一个异步任务,获取了SVG文件,然后使用了SVG解析器但遇到了同样的问题,图像没有显示。我不知道这是否是因为我必须使用RemoveView作为最终版本。然后听起来你有一个完全不同的问题。关键是你必须有视图。setImageViewBitmap
比manager.updateAppWidget(ID,视图)执行得早
。当前,您似乎启动了Runnable,然后启动了异步滑动加载,然后立即调用updateAppWidget
,甚至没有机会完成Runnable或滑动请求。这意味着管理器
接收到视图而不设置位图,更新小部件(s)然后过了一段时间,真正的位图被设置为RemoteViews,但这只是垃圾收集。你可能是对的,但我有PNG图像,它们通过Glide和setImageViewBitmap正确加载,在这种情况下,我假设Glide在调用updateAppWidget后也会带着资源回来。也许,但这可能只是运气,或者是内存缓存命中,类似于立即加载。尝试将.skipMemoryCache(true).diskCacheStrategy(NONE)
放入该滑动加载,以证明它在所有情况下都能工作,最重要的是在安装后的第一次加载。作为SVG的另一项检查,您可以尝试将位图保存到磁盘(bmp.compress)(Bitmap.CompressFormat.PNG,100,newfileoutputstream(filename))
)查看它是否包含任何内容,以及您期望的内容。