public class picBar extends View{
int COMPONENT_WIDTH;//控件的宽度
int COMPONENT_HEIGHT;//控件的高度
boolean initflag = false;//是否已经初始化图片
Bitmap[] bmp;//用来存放图片的数组
int currIndex = 0;//当前播放图片的ID
int[] bitmapId;//图片编号ID
boolean workFlag = true;//播放图片的线程标识位
public picBar(Context context) {
super(context);
//首先,要播放图片,就先要有图片,那就先给各个图片编号吧,这里的图片资源存放在了res下的drawable文件夹下了
bitmapId =new int[]{R.drawable.loading1_03, R.drawable.loading2_03, R.drawable.loading3_03};
//好了,图片的编号现在已经搞定了,接下来该干什么呢?对,应该将资源里的图片塞进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
picBar.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
bmp = BitmapFactory.decodeResource(res, bitmapId);
}
}
//覆写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;
}
Paint p = new Paint();
canvas.drawBitmap(bmp[currIndex], 0, 0, p);//绘制图片
}
}
|