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