我正在尝试在 ImageSwitcher 中显示来自 URL 的图像。我试过:
myImageSwitcher.setImageURI(Uri.parse(" http://miurl.com/images/foto01.jpg "));
但它告诉我这个“错误”:
I/System.out:resolveUri 在错误的位图 uri 上失败:http ://miurl.com/images/foto01.jpg
谢谢
我正在尝试在 ImageSwitcher 中显示来自 URL 的图像。我试过:
myImageSwitcher.setImageURI(Uri.parse(" http://miurl.com/images/foto01.jpg "));
但它告诉我这个“错误”:
I/System.out:resolveUri 在错误的位图 uri 上失败:http ://miurl.com/images/foto01.jpg
谢谢
我知道已经很晚了,但是因为我找到了更好的解决方案,所以很乐意与所有人分享:)
我必须查看默认的源代码ImageSwitcher
并知道它是如何工作的。每当我们使用时ImageSwitcher
,我们都会为它设置一个ViewFactory
。这ViewFactory
会创建View
s,然后在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。这是我的代码
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()
转换为 aNetworkImageView
并将 Url 设置为它。如果你想使用毕加索,那么只需将它转换成一个ImageView
,然后在需要使用时使用毕加索。
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;
}
});
如果您想使用毕加索,那么只需使用ImageView
.
<xyz.farhanfarooqui.loadingimages.MyImageSwitcher
android:id="@+id/imageSwitcher"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
不要忘记包含android.permission.INTERNET
在您的 AndroidManifest.xml 中
每当你想改变图像,这样做,
imageSwitcher.setImageUrl("http://miurl.com/images/foto01.jpg");
我已经使用 SliderLayot ( https://github.com/daimajia/AndroidImageSlider ) 解决了这个问题,但我也会尝试使用 ImageSwitcher。
当我降落在这里时,我正试图实现同样的目标。我知道这是个老问题,但由于我没有看到答案,我会告诉你对我有用的解决方案。
首先,我下载了我想在图像切换器中显示的图像,并使用以下代码将它们作为位图返回:
InputStream in = new java.net.URL(url).openStream();
Bitmap bitmap = BitmapFactory.decodeStream(in);
然后我使用imageSwitcher.setImageDrawable(new BitmapDrawable(getResources(), bitmap))
.
要使用java.net.URL(url).openStream()
,您需要添加<uses-permission android:name="android.permission.INTERNET">
到您的AndroidManifest.xml
文件中。
请记住,您可以更改下载代码以使其更好(例如检查超时),但这只是一个基本的解决方案。
关于您使用的另一件事,我认为您不能使用setImageURI()
在您的ImageSwitcher
. 根据这篇文章,此方法仅适用于特定于 Android 平台的内容 URI(请注意,他们在那篇文章中谈论的是 an ImageView
,但我认为这种情况也是如此)。