• 播放实现Android实现图片循环播放


    本篇文章是一篇关于播放实现的帖子

        

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

        

    文章结束给大家分享下程序员的一些笑话语录: 一程序员告老还乡,想安度晚年,于是决定在书法上有所造诣。省略数字……,准备好文房4宝,挥起毛笔在白纸上郑重的写下:Hello World

  • 相关阅读:
    原生js大总结十一
    jQuery快速入门知识重点
    原生js大总结九
    原生js大总结十
    原生js大总结八
    原生js大总结六
    原生js大总结七
    原生js大总结四
    原生js大总结五
    移动端适配
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3080624.html
Copyright © 2020-2023  润新知