Android:在网络ImageView中显示加载符号

4

我正在使用Volley库中的NetworkImageView来加载图片。

但是当图片从URL加载需要一些时间时,我希望在图片容器中显示一个旋转/移动的加载符号。

我试图使用setDefaultImageResId()函数设置一个loader.gif图像。但我认为gif格式在Android中不是原生支持的。

请给予建议。谢谢。

3个回答

9
您只需要将 NetworkImageViewProgressBar 放在一个 FrameLayoutRelativeLayout 中,就像这样:
<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    >

     <ProgressBar
            style="?android:attr/progressBarStyle"
            android:layout_width="..."
            android:layout_height="..." />

    <com.android.volley.toolbox.NetworkImageView
        android:layout_width="..."
        android:layout_height="..."
         />

</FrameLayout>

请注意顺序很重要,确保你将NetworkImageView放在ProgressBar后面,这样在加载图像后NetworkImageView会停留在ProgressBar的上方。

希望能帮到你!


但是当我填充这个FrameLayout时,进度条不可见。请告诉我完整的代码。 - Abhishek Mittal
你所说的“不可见”是什么意思?请检查是否正确定义了“width”和“height”,如果在“ProgressBar”和“NetworkImageView”中都使用了“wrap_content”,那可能就是原因。 - manuelvsc
问题在于getView方法中我只返回了convertview中的NetworkImageView。现在问题已经解决了。谢谢 :) - Abhishek Mittal

3
你说得没错。动态gif在安卓设备上不太受支持。但是好消息是你可以使用内置的进度条/圆形轮播来代替。在这里可以阅读更多关于它的信息:here
你需要使用普通的ImageView替换你一直在使用的NetworkImageView,并使用ImageLoader加载你的图片,以便能够实现监听器来切换出进度轮。这意味着你需要创建一个RequestQueue和一个ImageLoader。我建议你创建一个单例类并与你代码中需要的人分享。
图片加载应该类似于:
// ** code in init the progress wheel **

imageLoader.get(url, new ImageListener() {
    @Override
    public void onResponse(ImageContainer response, boolean isImmediate) {
        if (response != null) {
            Bitmap bitmap = response.getBitmap();
            if (bitmap != null) {
                // ** code to turn off the progress wheel **
                // ** code to use the bitmap in your imageview **
            }

    @Override
    public void onErrorResponse(VolleyError error) {
        // ** code to handle errors **
    }
});

非常感谢。我很感激你的回答和帮助。但是 Volley 可以更有效地管理图像加载。我也看到过使用 Volley 自身的加载符号,但无法回忆起具体位置。如果可以做到这一点,那就太好了,否则我将不得不重新编写整个代码。希望你能理解。我们不能在 NetworkImageView 中使用旋转轮吗? - Dragon
看一下源代码。NetworkImageView是一个简单的ImageView,它使用你提供的ImageLoader从你给定的URL加载图像。这是我建议的一种语法糖,但你无法控制侦听器。你可以按照我建议的方式或通过编辑源代码并将你的逻辑添加到那里的侦听器来实现。无论哪种方式,你都需要一个钩子进入ImageListener,别无选择。 - Itai Hanski
所以,我尝试在layout.xml中使用进度条,并将其放置在图像渲染之上的相同位置,这样一旦图像被渲染,它就会隐藏进度条。它运行良好。谢谢。 - Dragon
如何关闭特定视图的Spinner? - portfoliobuilder

1

我使用动画可绘制对象完成了这个操作。以下是步骤:

对可绘制对象ic_sync_drawable.xml进行动画处理:

<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/selected"
    android:oneshot="false">
    <item
        android:drawable="@drawable/ic_popup_sync_1"
        android:duration="50" />
    <item
        android:drawable="@drawable/ic_popup_sync_2"
        android:duration="50" />
    <item
        android:drawable="@drawable/ic_popup_sync_3"
        android:duration="50" />
    <item
        android:drawable="@drawable/ic_popup_sync_4"
        android:duration="50" />
    <item
        android:drawable="@drawable/ic_popup_sync_5"
        android:duration="50" />
    <item
        android:drawable="@drawable/ic_popup_sync_6"
        android:duration="50" />
</animation-list>

现在在Java代码中我正在使用ImageView:

Drawable drawable = getContext().getResources().getDrawable(R.drawable.ic_sync_drawable);
ImageView imageView = new ImageView(getContext());
imageView.setImageDrawable(drawable);
imageLoader.get(imageurl, ImageLoader.getImageListener(imageView, 0, 0));
ViewFlipper.addView(imageView);
//start animation
 AnimationDrawable frameAnimation = (AnimationDrawable) drawable;
frameAnimation.start();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接