【问题标题】:Display image from URL - sizing and screen orientation problems从 URL 显示图像 - 大小和屏幕方向问题
【发布时间】:2010-08-31 06:49:31
【问题描述】:

我正在尝试显示来自 URL 的图像,该图像可能大于屏幕尺寸。我有它的工作,但我希望它缩放以适应屏幕,当屏幕方向改变时我也遇到问题。图像很小,我希望它也能将其宽度缩放到屏幕上。 (在这两种情况下,我都希望图像用滚动条填充屏幕宽度(如果需要高度)。

这是我的 ImageView:

<ImageView android:id="@+id/ImageView01" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"
    android:scaleType="fitCenter"
    android:adjustViewBounds="true">
</ImageView>

这是加载图像的 java 代码:(为简单起见,删除了一些错误处理代码)

    Object content = null;
    try{
      URL url = new URL("http://farm1.static.flickr.com/150/399390737_7a3d508730_b.jpg");
      content = url.getContent();
    }
      catch(Exception ex)
    {
        ex.printStackTrace();
    }
    InputStream is = (InputStream)content;
    Drawable image = Drawable.createFromStream(is, "src");
    Image01.setImageDrawable(image);

我尝试了 android:scaleType 的不同设置。如果以前有人问过这个问题,我很抱歉。我已经阅读了许多关于该主题的教程,但它们似乎对我不起作用。不确定它是否与加载图像的方式有关。 (来自网络而不是本地资源)

另一个问题是有时图像甚至无法加载。没有运行时错误,我只是在 ImageView 中什么都没有。

如果您需要更多信息或说明,请告诉我。

【问题讨论】:

    标签: android imageview screen-orientation


    【解决方案1】:

    关于“有时图像甚至不加载”的问题与上下文有关,所以我使用这个函数来解决这个问题

    public Object fetch(String address) throws MalformedURLException,
        IOException {
            URL url = new URL(address);
            Object content = url.getContent();
            return content;
        }  
    
        private Drawable ImageOperations(Context ctx, String url) {
            try {
                InputStream is = (InputStream) this.fetch(url);
                Drawable d = Drawable.createFromStream(is, "src");
                return d;
            } catch (MalformedURLException e) {
                return null;
            } catch (IOException e) {
                return null;
            }
        }
    

    所以要用你的图像填充屏幕宽度,你必须有这样的代码

        try{
            String url = "http://farm1.static.flickr.com/150/399390737_7a3d508730_b.jpg";           
            Drawable image =ImageOperations(this,url);
            Image01.setImageDrawable(image);
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
        }
    
    
        Image01.setMinimumWidth(width);
        Image01.setMinimumHeight(height);
    
        Image01.setMaxWidth(width);
        Image01.setMaxHeight(height);
    

    更新:: 如果你加载一个大尺寸的图片,显然你将不得不等待更多的时间,UnknowHostException 可能会导致下载问题。

    是的,您是对的,您将图像保存在本地,本地访问比下载更快。

    为避免旋转更改出现问题,请在 Manifest.xml 中设置 configChanges="keyboardHidden|orientation" 属性

    <activity android:name=".myActivity"
    ...
             android:configChanges="keyboardHidden|orientation"   >
    ...
    />
    

    【讨论】:

    • 感谢您对最小和最大宽度的帮助。这样就成功了,尽管如果设置宽度导致图像超过可用高度,我需要将 ImageView 放在 ScrollView 中。
    • 现在,至于无法下载的图像,(我使用了 Joregsys 的代码)我遇到了各种各样的麻烦。似乎当图像未显示时,发生的事情是我在执行 .createFromStream 方法时收到错误“SkImageDecoder::Factory returned null”。有时它有效,有时我明白。我尝试关闭 InputStream 以刷新缓冲区,但不行。我尝试将这些代码行包​​装在一个 while (d==null) 循环中,但随后我得到了一个无限循环。
    • 我在旋转屏幕时也遇到了内存问题。如果图像是第一次加载,当方向改变时我会得到一个 OutOfMemoryError 。该图像为 1MB - 就数码照片而言很小,但对于 Android 来说可能太大了?我想我遇到了内存泄漏。我试过 Image01.getDrawable().setCallback(null);在活动的 onDestroy() 中,但这没有帮助。
    • 这些问题似乎与图像大小有关。我尝试过使用较小的图像(84k)并且完全没有问题。一张 680k 的图像被击中或错过。似乎文件越大,您遇到的麻烦就越多。我可以做些不同的事情来处理更大的图像吗?我应该在本地保存图像然后打开它而不是只显示流吗?
    • 迟到了,但刚刚找到你的解决方案,我遇到了同样的问题,你的代码修复了它,干杯!!!!
    猜你喜欢
    • 1970-01-01
    • 2018-05-08
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 2020-08-26
    相关资源
    最近更新 更多