广

android开发

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

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

    2018-04-07 07:49:36 次阅读 稿源:互联网
    广告

    很多时候,我们需要展示在客户端展示图片,而且是动态显示,即不停地自行切换图片。下面我们来看一下具体的实现方法。首先,我们需要在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();//刷新屏幕 
                   } 
                }   

    一起学吧部分文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与一起学吧进行文章共享合作。

    广告
    广告
    广告