文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2022-06-06 10:46

关注

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

您可能感兴趣的文章:Android实现可复用的筛选页面Android中 TeaScreenPopupWindow多类型筛选弹框功能的实例代码Android实现简单下拉筛选框Android可筛选的弹窗控件CustomFiltControlandroid仿京东商品属性筛选功能可支持快速搜索筛选的Android自定义选择控件Android 仿京东侧滑筛选实例代码Android Handler之消息循环的深入解析Android开发笔记之:消息循环与Looper的详解RecyclerView+SnapHelper实现无限循环筛选控件


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-移动开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯