Android:按时间间隔更改图像

时间:2014-04-04 10:42:41

标签: android

我正在使用ImageDownloader类从服务器获取图像并使用ArrayList获取这些图像链接。下载图像后,我将图像设置为布局的background。一切正常,但我想在特定的time interval之后更改这些图像并将其设置为背景不同的图像。我在这里经历了很多帖子,但没有得到我想要的东西。由于我在ArrayList中有所有的图像链接,所以如何设置一个计时器来改变来自ArrayList的图像。它始终显示index zero的第一个图像,即使我已经设置了一个计时器但是相同的图像再次显示?如果有人有任何代码示例,请帮助我,看看我的代码在那里改变什么?

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 个答案:

答案 0 :(得分:12)

我不知道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添加一个停止方法(此stop方法同步并且不会导致计时器内部代码不一致):

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();

答案 1 :(得分: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秒更改一次背景。您可以根据需要更改此设置。 它的工作正常。我已经测试了。

您可以详细了解时间任务here

您也可以在timer.cancel() HIH。

的帮助下取消计时器

答案 2 :(得分:2)

    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)

                        }
                    });
             }

答案 3 :(得分:0)

试试这种方式希望这可以帮助您更好地改进代码...

  1. 你需要&#34; Aquery(AndroidQuery)&#34;这个参考的jar: https://code.google.com/p/android-query/downloads/detail?name=android-query-full.0.24.3.jar
  2. 2.现在在项目lib文件夹中添加此jar并添加到构建路径或库中。

    3.现在是时候使用&#34; Aquery(AndroidQuery)&#34;从服务器下载图像(这是我可以根据您的要求修改的演示代码)。

    <强>&#34; activity_main.xml中&#34;                  

           <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>
    

    <强>&#34; MyActivity.java&#34;         公共类MyActivity扩展了Activity {

        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.
    

答案 4 :(得分: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) {
    }}};

}