Android实现图片循环播放的实例方法
Android实现图片循环播放的实例方法
发布时间:2016-12-28 来源:查字典编辑
摘要:很多时候,我们需要展示在客户端展示图片,而且是动态显示,即不停地自行切换图片。下面我们来看一下具体的实现方法。首先,我们需要在XML...很...

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

<>

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

}

}

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新安卓软件开发学习
热门安卓软件开发学习
编程开发子分类