Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从SVG Url资源获取位图_Android_Svg_Bitmap_Android Widget_Android Glide - Fatal编程技术网

Android 从SVG Url资源获取位图

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() {

我试图使用Glide从URL获取SVG资源,但我不知道如何获取位图对象,而不是将其加载到视图中。
原因是我需要在小部件上加载一些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))
)查看它是否包含任何内容,以及您期望的内容。