(Android)實現圖片循環播放


很多時候,我們需要展示在客戶端展示圖片,而且是動態顯示,即不停地自行切換圖片。下面我們來看一下具體的實現方法。

首先,我們需要在XML文件中配置一下將要播放圖片的控件(main.xml):

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

  android:layout_width = "fill_parent"

  android:layout_height= "fill_parent"

  android:orientation="vertical">

  <!--這里是要播放圖片的控件,bofang是用來播放圖片的View類-->

  <com.sunianjinshi.bofang

    android:layout_width="180dip"

    android:layout_height = "250dip"

  />

</LinearLayout>

好了,到這里需要用來播放圖片的控件就配置好了,接下來我們就要來寫實現類bofang.java。

code of bofang.java:

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

 

public class bofang extends View

{

  int COMPONENT_WIDTH;//控件的寬度

  int COMPONENT_HEIGHT;//控件的高度

  boolean initflag = false;//是否已經初始化圖片

  Bitmap[] bmp;//用來存放圖片的數組

  int currPicIndex = 0;//當前播放圖片的ID

  int[] bitmapId;//圖片編號ID

  boolean workFlag = true;//播放圖片的線程標識位

  public GGViewCX(Context father,AttributeSet as)//重寫構造函數

  {

    //首先,要播放圖片,就先要有圖片,那就先給各個圖片編號吧,這里的圖片資源存放在了res下的drawable文件夾下了

    int[] bitmapId ={R.drawable.adv1, R.drawable.adv2, R.drawable.adv3};

    //好了,圖片的編號現在已經搞定了,接下來該干什么呢?對,應該將資源里的圖片塞進Bitmap數組了,那么我們先來確定將要播放的圖片的數量,即Bitmap數組的長度

    bmp = new Bitmap[bitmapId.length];//這里不要直接將數值賦給bmp,因為我們可能會不定期地更換圖片資源,這樣我們就要修改多處代碼,而我們這樣根據

    //圖片的ID來確定圖片的數量,以減少不必要的麻煩,下面開始初始化圖片,我們將初始化圖片放在一個函數里

    initBitmap();//圖片初始化完畢

    //圖片初始化完畢了,接下來我們要做的就是播放圖片了,但是播放圖片之前,我們有一個問題,就是怎樣讓圖片實現循環播放?這里我們另開一個新的線程來定時更改

    //要播放的圖片的ID,以實現圖片的循環播放,要實現循環播放圖片的功能,我們需要覆寫onDraw函數,首先,我們來新開一個線程

    new Thread()

    {

      //重寫run方法

      public void run()
              {
                  // TODO Auto-generated method stub
                  while(workflag)//一直執行這個循環(死循環)
                  {
                      currIndex = (currIndex+1)%bitmapId.length;//更改圖片的ID
                      bofang.this.postInvalidate();//刷新屏幕,導致屏幕重繪
                      try
                      {
                          Thread.sleep(3000);//到此處暫停3秒鍾,然后繼續執行run函數,即實現每隔3秒鍾刷新屏幕一次
                      }
                      catch (InterruptedException e)
                      {
                          // TODO Auto-generated catch block
                          e.printStackTrace();
                      }
                  }
              }

    }.start();

  }

  //初始化圖片

  public void initBitmap()

  {

    //獲取資源圖片

    Resources res = this.getResources();

    for(int i=0;i<bitmapId.length;i++)

    {

      bmp[i] = BitmapFactory.decodeResource(res, bitmapId[i]);

    }

  }

 

  //覆寫onDraw方法

  @Override
    protected void onDraw(Canvas canvas)
    {
        // TODO Auto-generated method stub
        super.onDraw(canvas);
        if(!initflag)//檢查是偶已經獲取控件的寬和高,如果沒有,那么就獲取控件的寬和高
        {
            COMPONENT_WIDTH = this.getWidth();
            COMPONENT_HEIGHT = this.getHeight();
            initflag = true;
        }
        canvas.drawBitmap(bma[currIndex], 0, 0,paint);//繪制圖片
    }

}

好了,到這里就全部完成了!

實現效果如下:

圖片一

圖片二

__________________________________________________________________________________________________________________

PS:這里要說明一下,上面的代碼中其實有些地方還有更好的實現方法。

比如:

我們為了實現定時更改要播放的圖片的ID,以實現循環播放,新開了了一個線程,並且開了一個死循環,但實際這樣的寫法可控性很低,JDK的java.util.concurrent中提供了大量的方法去控制一段代碼定時執行,標准的改寫上面的代碼如下:

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleWithFixedDelay(new runner(), 0, 1, TimeUnit.SECONDS);
//或者用scheduler.scheduleAtFixedRate(new runner(),0,1, TimeUnit.SECONDS);

//接着我們要實現Runnable方法,也就是定時更改目前播放圖片的ID

public class runner implements Runnable
    {
        public void run()

  {

            // TODO Auto-generated method stub
            currIndex = (currIndex+1)%bitmapId.length;
            bofang.this.postInvalidate();//刷新屏幕
       }
    }

如果這里的幾行代碼大家有什么不明白的地方,可以去查閱相關資料,或者去參考我的另一篇文章《JAVA多線程的控制》


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM