Android:定时更换图片

7
我正在使用ImageDownloader类从服务器获取图像,并使用ArrayList获取这些图像链接。下载图像后,我将图像设置为布局的background。一切正常,但是我想在特定的时间间隔后更改这些图像,并设置为不同的背景图像。我在这里阅读了许多帖子,但没有得到我想要的。由于我在ArrayList中拥有所有图像链接,因此如何设置计时器以更改来自该ArrayList的图像。即使我设置了计时器,它始终在索引零处显示第一个图像,但是相同的图像再次显示?如果有人有任何代码示例,请帮助我并查看我的代码应该更改什么?
final ImagesSerialized item;
final ImageView bgImage=(ImageView) findViewById(R.id.image);
 ArrayList<ImagesSerialized> list;
        control = (Controller) getApplicationContext();
        list = (ArrayList<ImagesSerialized>) control.Table_Images.GetData();

         for(int i=0; i<list.size(); i++)
         {
         item = list.get(i);
         }




         downloader = new ImageDownloader();
         downloader.download(item.imageurl(), bgImage);
5个回答

14

我不了解ImageLoader组件,但在Android中为视图安排计时器相当容易。(不需要任何额外的对象)

final ImageView bgImage=(ImageView) findViewById(R.id.image);

...

new Runnable() {
    int updateInterval = 1000; //=one second

    @Override
    public void run() {

        // Any code which goes here will be executed every 'updateInterval'
        // change your background here            

        bgImage.postDelayed(this, updateInterval);
    }
}.run();

您可以随意更改此模板,假设我想停止这个计时器,为此我需要向我的可运行对象添加一个停止方法(此停止方法同步执行且不会在计时器内部代码中引起不一致):

Runnable myRunnable = new Runnable() {
    int updateInterval = 1000; //=one second
    boolean stop = false;

    public void stop() {
        this.stop = true;
    }    

    @Override
    public void run() {

        // Any code which goes here will be executed every 'updateInterval'
        // change your background here            

        if(!stop) {
            bgImage.postDelayed(this, updateInterval);
        }
    }
}.run();

现在我可以通过myRunnable.stop();来停止它。

编辑:你应该遍历你的URL数组,并将其中一个传递给你的下载器。可以通过以下代码片段完成:

int arraySize = list.size();

new Runnable() {
    int currentIndex = 0;
    int updateInterval = 1000; //=one second

    @Override
    public void run() {

        currentIndex += 1;
        if(currentIndex == arraySize){
            currentIndex = 0;
        }

        item = list.get(currentIndex);       
        downloader.download(item.imageurl(), bgImage);            

        bgImage.postDelayed(this, updateInterval);
    }
}.run();

我正在使用ArrayList从服务器获取图像URL,然后使用对象访问这些URL。现在的问题是如何随时更改这些URL,并将它们传递到“downloader”方法中,该方法下载图像并将其设置为传递给它的视图的背景。请告诉我如何使用线程来实现这一点。 - Abid Khan
让我检查一下,然后会告诉你。 - Abid Khan
在这行代码中 downloader.download(item.imageurl(), bgImage);item.imageurl() 是一个字符串,我该如何逐个传递索引值? - Abid Khan
1
非常感谢您在我的问题上花费了这么多时间,您的帮助对我非常重要。 - Abid Khan

4

按照以下方式设置您的ImageView:

  <ImageView
        android:id="@+id/imgBackground"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:adjustViewBounds="true"
        android:contentDescription="@string/app_name"
        android:scaleType="fitXY" />

您可以使用TimerTask实现此功能。
// 声明和初始化:
List<String> mImageUrl = new ArrayList<String>();
private ImageLoader mImageLoader =  new ImageLoader(MainActivity.this);
Timer timer = new Timer(); // changed
int i = 0;

// 将此代码放入您的 onCreate 中:

timer.scheduleAtFixedRate(new TimerTask() {

            @Override
            public void run() {
                if (i < mImageUrl.size()) {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            // TODO Auto-generated method stub
                            mImageLoader.DisplayImage(mImageUrl.get(i), img);
                            i++;
                        }
                    });
                } else {
                    i = 0;
                }
            }
        }, 0, 2000);

计时器任务将在0秒后开始,并且每2秒更改一次背景。您可以根据自己的需要进行更改。 它正常工作。我已经测试过了。
您可以在此处阅读有关计时器任务的更多信息
您还可以使用timer.cancel() HIH来取消计时器。

1
    final ImagesSerialized item;
    final ImageView bgImage=(ImageView) findViewById(R.id.image);
     ArrayList<ImagesSerialized> list;
            control = (Controller) getApplicationContext();
            list = (ArrayList<ImagesSerialized>) control.Table_Images.GetData();

             for(int i=0; i<list.size(); i++)
             {
 runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                                       item = list.get(i);

             downloader = new ImageDownloader();
             downloader.download(item.imageurl(), bgImage)

                        }
                    });
             }

0

尝试这段代码。图像被保存在drawable中,请在XML代码中插入一个ImageView。请注意,以下代码的时间间隔为1秒。

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity {
public ImageView iv;
public static Integer[] mThumbIds = {
    R.drawable.pic1,R.drawable.pic2,R.drawable.pic3,R.drawable.pic4};
int i;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv = (ImageView) findViewById(R.id.imageView);
i=0;
t.start();
}
Thread t = new Thread() {
@Override
public void run() {
    try {
        while (!isInterrupted()) {
            Thread.sleep(1000);
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    iv.setImageResource(mThumbIds[i]);
                    i++;
                    if(i >= mThumbIds.length){
                        i = 0;
                    }}});}} 
    catch (InterruptedException e) {
    }}};

}

0

尝试这种方法,希望能帮助您改进代码...

  1. 您需要从此引用中获取“Aquery(AndroidQuery)”jar包: https://code.google.com/p/android-query/downloads/detail?name=android-query-full.0.24.3.jar

2.现在将此jar包添加到您的项目lib文件夹中,并将其添加到构建路径或作为库。

3.现在是使用“Aquery(AndroidQuery)”从服务器下载图像的代码时间(这是我的演示代码,您可以根据自己的要求进行修改)。

"activity_main.xml"

       <FrameLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
           <ImageView
            android:id="@+id/imgFromServer"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:adjustViewBounds="true"/>
           <ProgressBar
            android:id="@+id/pbrImageLoader"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"/>
         </FrameLayout>
    </LinearLayout>

"MyActivity.java" public class MyActivity extends Activity{

"我的活动.java" public class 我的活动 extends 活动{

    private ImageView imgFromServer;
    private ProgressBar pbrImageLoader;
    private AQuery aQuery;
    private int currentIndex;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imgFromServer = (ImageView) findViewById(R.id.imgFromServer);
        pbrImageLoader = (ProgressBar) findViewById(R.id.pbrImageLoader);
        aQuery = new AQuery(this);
        currentIndex=0;
        final ArrayList<String> imageUrlListFromServer = new ArrayList<String>();
        imageUrlListFromServer.add("http://www.mayoff.com/5-01cablecarDCP01934.jpg");
        imageUrlListFromServer.add("http://www.allindiaflorist.com/imgs/arrangemen4.jpg");
        imageUrlListFromServer.add("http://www.hdwallshub.com/files/submissions/cookie_monster_hd_wallpaper_1405239014.jpg");
        imageUrlListFromServer.add("http://images4.fanpop.com/image/photos/17200000/Tangled-offical-wallpapers-tangled-17286338-1680-1050.jpg");
        imageUrlListFromServer.add("http://wakpaper.com/large/Moons_wallpapers_4.jpg");

        final Timer timer = new Timer();
        downloadImagesFromServer(imageUrlListFromServer, 0, new ImageDownloadedListener() {
            @Override
            public void onDownloadFinish() {
                timer.scheduleAtFixedRate(new TimerTask() {
                    @Override
                    public void run() {
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                imgFromServer.setImageBitmap(aQuery.getCachedImage(imageUrlListFromServer.get(currentIndex)));
                               if(currentIndex == imageUrlListFromServer.size()-1){
                                   currentIndex=0;
                               }else{
                                   currentIndex++;
                               }
                            }
                        });
                    }
                },0,2000);
            }
        });



    }

    private void downloadImagesFromServer(final ArrayList<String> imageUrlList,final int index,final ImageDownloadedListener listener){

        aQuery.progress(pbrImageLoader).ajax(imageUrlList.get(index), Bitmap.class, 0, new AjaxCallback<Bitmap>() {
            @Override
            public void callback(String url, Bitmap object, AjaxStatus status) {
                super.callback(url, object, status);
                if ((imageUrlList.size() - 1) == index) {
                    listener.onDownloadFinish();
                } else {
                    downloadImagesFromServer(imageUrlList, index + 1, listener);
                }
            }
        });

    }

    interface ImageDownloadedListener{
        public void onDownloadFinish();
    }


}

Note : "Aquery(AndroidQuery)" also cache images on local so it not get same images from  server if it already downloaded.

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