现在的位置: 首页 > 综合 > 正文

Android实现图片循环播放

2013年12月05日 ⁄ 综合 ⁄ 共 3093字 ⁄ 字号 评论关闭
很多时候,我们需要展示在客户端展示图片,而且是动态显示,即不停地自行切换图片。下面我们来看一下具体的实现方法。首先,我们需要在XML...

很多时候,我们需要展示在客户端展示图片,而且是动态显示,即不停地自行切换图片。下面我们来看一下具体的实现方法。

首先,我们需要在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。

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();//刷新屏幕  
               }  
            }  
         


抱歉!评论已关闭.