Android實現圖片迴圈播放

來源:互聯網
上載者:User

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

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

[html] 
<SPAN style="COLOR: #993300"><?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> </SPAN> 

<?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。[java] view plaincopyprint?
<SPAN style="COLOR: #993300">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);//繪製圖片    
    }   
  
} </SPAN> 

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中提供了大量的方法去控制一段代碼定時執行,標準的改寫上面的代碼如下:

[java]
<SPAN style="COLOR: #993300"> 
        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();//重新整理螢幕    
               }   
            }   
          
 
</SPAN> 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.