zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

Android实现图片循环播放的实例方法

Android实例循环方法 实现 图片 播放
2023-06-13 09:14:54 时间

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

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

复制代码代码如下:

<?xmlversion="1.0"encoding="utf-8"?>

<LinearLayoutxmlns: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。
复制代码代码如下:

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

publicclassbofangextendsView 



  intCOMPONENT_WIDTH;//控件的宽度 

  intCOMPONENT_HEIGHT;//控件的高度 

  booleaninitflag=false;//是不是已经初始化图片 

  Bitmap[]bmp;//用来寄存图片的数组 

  intcurrPicIndex=0;//以后播放图片的ID 

  int[]bitmapId;//图片编号ID 

  booleanworkFlag=true;//播放图片的线程标识位 

  publicGGViewCX(Contextfather,AttributeSetas)//重写构造函数 

  { 

    //首先,要播放图片,就先要有图片,那就先给各个图片编号吧,这里的图片资源寄存在了res下的drawable文件夹下了 

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

    //好了,图片的编号当初已经搞定了,接下来该干什么呢?对,应该将资源里的图片塞进Bitmap数组了,那么我们先来确定将要播放的图片的数量,即Bitmap数组的长度 

    bmp=newBitmap[bitmapId.length];//这里不要直接将数值赋给bmp,因为我们可能会不定期地改换图片资源,这样我们就要修改多处代码,而我们这样根据 

    //图片的ID来确定图片的数量,以减少不必要的费事,下面开始初始化图片,我们将初始化图片放在一个函数里 

    initBitmap();//图片初始化终了 

    //图片初始化终了了,接下来我们要做的就是播放图片了,但是播放图片之前,我们有一个问题,就是怎样让图片实现循环播放?这里我们另开一个新的线程来准时变动 

    //要播放的图片的ID,以实现图片的循环播放,要实现循环播放图片的功能,我们需要覆写onDraw函数,首先,我们来新开一个线程 

    newThread() 

    { 

      //重写run方法 

      publicvoidrun() 
             { 
                 //TODOAuto-generatedmethodstub 
                 while(workflag)//一直执行这个循环(死循环) 
                 { 
                     currIndex=(currIndex+1)%bitmapId.length;//变动图片的ID 
                     bofang.this.postInvalidate();//刷新屏幕,导致屏幕重绘 
                     try
                     { 
                         Thread.sleep(3000);//到此处暂停3秒钟,然后继续执行run函数,即实现每隔3秒钟刷新屏幕一次 
                     } 
                     catch(InterruptedExceptione)  
                     { 
                         //TODOAuto-generatedcatchblock 
                         e.printStackTrace(); 
                     } 
                 } 
             } 

    }.start(); 

  } 

  //初始化图片 

  publicvoidinitBitmap() 

  { 

    //获得资源图片 

    Resourcesres=this.getResources(); 

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

    { 

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

    } 

  } 

  

  //覆写onDraw方法 

  @Override
   protectedvoidonDraw(Canvascanvas)  
   { 
       //TODOAuto-generatedmethodstub 
       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中提供了大批的方法去控制一段代码准时执行,标准的改写下面的代码如下:

复制代码代码如下:
ScheduledExecutorServicescheduler=Executors.newScheduledThreadPool(1); 
       scheduler.scheduleWithFixedDelay(newrunner(),0,1,TimeUnit.SECONDS); 
       //或者用scheduler.scheduleAtFixedRate(newrunner(),0,1,TimeUnit.SECONDS); 

       //接着我们要实现Runnable方法,也就是准时变动现在播放图片的ID 

       publicclassrunnerimplementsRunnable 
           { 
               publicvoidrun() 

         { 

                   //TODOAuto-generatedmethodstub 
                   currIndex=(currIndex+1)%bitmapId.length; 
                   bofang.this.postInvalidate();//刷新屏幕 
              } 
           }