ImageSwitcher从网址加载图片

时间:2014-12-04 14:23:25

标签: android imageswitcher

我试图在ImageSwitcher中显示来自网址的图片。我试过了:

myImageSwitcher.setImageURI(Uri.parse(" http://miurl.com/images/foto01.jpg&#34));

但它告诉我这个"错误":

I / System.out:resolveUri在坏位图uri上失败:http://miurl.com/images/foto01.jpg

由于

3 个答案:

答案 0 :(得分:2)

我知道现在已经很晚了但是因为我找到了更好的解决方案,所以很乐意与大家分享:)

我必须查看默认ImageSwitcher的源代码并知道它是如何工作的。每当我们使用ImageSwitcher时,我们都会为其设置ViewFactory。此ViewFactory会创建View,然后在ImageSwitcher中使用。通常我们会在ImageView中创建ViewFactory。然后在ImageView类中使用此ImageSwitcher来绘制具有指定图像源的视图。以下是setImageResource()类的ImageSwitcher方法。

public void setImageResource(@DrawableRes int resid){
    ImageView image = (ImageView)this.getNextView();
    image.setImageResource(resid);
    showNext();
}

让我们关注方法的第一行和第二行。

ImageView image = (ImageView)this.getNextView();
image.setImageResource(resid);

this.getNextView()ViewFactory获取视图,并将视图转换为ImageView。然后,将Drawable资源设置为它。

解决方案

现在,有了这些信息,让我们来解决问题吧!我正在使用Volley的NetworkImageView,但你也可以使用Picasso或Glide!你只需稍微改变一下代码。

我们需要创建一个自定义ImageSwitcher。这是我的代码

MyImageSwitcher.java

public class MyImageSwitcher extends ImageSwitcher {

    public MyImageSwitcher(Context context) {
        super(context);
    }

    public MyImageSwitcher(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public void setImageUrl(String url) {
        NetworkImageView image = (NetworkImageView) this.getNextView();
        image.setImageUrl(url, AppController.getInstance().getImageLoader());
        showNext();
    }
}

注意setImageUrl()方法。我们将从getNextView()获取的视图转换为NetworkImageView并将Url设置为它。如果你想使用Picasso,那么只需将其投射到ImageView中,然后根据需要使用Picasso。

活动

MyImageSwitcher imageSwitcher = (MyImageSwitcher) findViewById(R.id.imageSwitcher);
imageSwitcher.setFactory(new ViewSwitcher.ViewFactory() {
        public View makeView() {
            NetworkImageView myView = new NetworkImageView(getApplicationContext());
            myView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            myView.setLayoutParams(new ImageSwitcher.LayoutParams(imageSwitcher.getLayoutParams()));
            return myView;
        }
});

如果您想使用Picasso,请使用ImageView

布局

<xyz.farhanfarooqui.loadingimages.MyImageSwitcher
        android:id="@+id/imageSwitcher"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

的AndroidManifest.xml

不要忘记将android.permission.INTERNET包含在AndroidManifest.xml

完成!

每当您想要更改图像时,请按照这种方式进行,

imageSwitcher.setImageUrl("http://miurl.com/images/foto01.jpg");

答案 1 :(得分:0)

我使用SliderLayot(https://github.com/daimajia/AndroidImageSlider)解决了这个问题,但我也尝试使用ImageSwitcher。

答案 2 :(得分:0)

当我降落在这里时,我试图达到同样的目的。我知道它和旧问题,但由于我没有看到答案,我会告诉你解决方案对我有用。

首先,我下载了想要在imageswitcher中显示的图像,并使用以下代码将它们作为位图返回:

InputStream in = new java.net.URL(url).openStream();
Bitmap bitmap = BitmapFactory.decodeStream(in);

然后我使用imageSwitcher.setImageDrawable(new BitmapDrawable(getResources(), bitmap))在imageswitcher中设置位图。

要使用java.net.URL(url).openStream(),您需要将<uses-permission android:name="android.permission.INTERNET">添加到AndroidManifest.xml文件中。

请记住,您可以更改下载代码以使其更好(例如检查超时),但这只是一个基本的解决方案。

关于您使用的内容的另一个问题,我认为您无法使用setImageURI()ImageSwitcher中设置互联网资源。根据{{​​3}},此方法仅适用于特定于Android平台的内容URI(注意,他们在该帖子中讨论ImageView,但我认为同样如此对于这种情况)。