Android实现图片循环播放的实例方法
很多时候,我们需要展示在客户端展示图片,而且是动态显示,即不停地自行切换图片。下面我们来看一下具体的实现方法。首先,我们需要在XML...
很多时候,我们需要展示在客户端展示图片,而且是动态显示,即不停地自行切换图片。下面我们来看一下具体的实现方法。
首先,我们需要在XML文件中配置一下将要播放图片的控件(main.xml):
<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayoutxmlns: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。
importandroid.content.Context;
importandroid.content.res.Resources;
importandroid.graphics.Bitmap;
importandroid.graphics.BitmapFactory;
importandroid.graphics.Canvas;
importandroid.graphics.Paint;
importandroid.util.AttributeSet;
importandroid.view.View;
publicclassbofangextendsView
{
intCOMPONENT_WIDTH;//控件的宽度
intCOMPONENT_HEIGHT;//控件的高度
booleaninitflag=false;//是不是已经初始化图片
Bitmap[]bmp;//用来寄存图片的数组
intcurrPicIndex=0;//以后播放图片的ID
int[]bitmapId;//图片编号ID
booleanworkFlag=true;//播放图片的线程标识位
publicGGViewCX(Contextfather,AttributeSetas)//重写构造函数
{
//首先,要播放图片,就先要有图片,那就先给各个图片编号吧,这里的图片资源寄存在了res下的drawable文件夹下了
int[]bitmapId={R.drawable.adv1,R.drawable.adv2,R.drawable.adv3};
//好了,图片的编号当初已经搞定了,接下来该干什么呢?对,应该将资源里的图片塞进Bitmap数组了,那么我们先来确定将要播放的图片的数量,即Bitmap数组的长度
bmp=newBitmap[bitmapId.length];//这里不要直接将数值赋给bmp,因为我们可能会不定期地改换图片资源,这样我们就要修改多处代码,而我们这样根据
//图片的ID来确定图片的数量,以减少不必要的费事,下面开始初始化图片,我们将初始化图片放在一个函数里
initBitmap();//图片初始化终了
//图片初始化终了了,接下来我们要做的就是播放图片了,但是播放图片之前,我们有一个问题,就是怎样让图片实现循环播放?这里我们另开一个新的线程来准时变动
//要播放的图片的ID,以实现图片的循环播放,要实现循环播放图片的功能,我们需要覆写onDraw函数,首先,我们来新开一个线程
newThread()
{
//重写run方法
publicvoidrun()
{
//TODOAuto-generatedmethodstub
while(workflag)//一直执行这个循环(死循环)
{
currIndex=(currIndex+1)%bitmapId.length;//变动图片的ID
bofang.this.postInvalidate();//刷新屏幕,导致屏幕重绘
try
{
Thread.sleep(3000);//到此处暂停3秒钟,然后继续执行run函数,即实现每隔3秒钟刷新屏幕一次
}
catch(InterruptedExceptione)
{
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
}
}
}.start();
}
//初始化图片
publicvoidinitBitmap()
{
//获得资源图片
Resourcesres=this.getResources();
for(inti=0;i<bitmapId.length;i++)
{
bmp[i]=BitmapFactory.decodeResource(res,bitmapId[i]);
}
}
//覆写onDraw方法
@Override
protectedvoidonDraw(Canvascanvas)
{
//TODOAuto-generatedmethodstub
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中提供了大批的方法去控制一段代码准时执行,标准的改写下面的代码如下:
ScheduledExecutorServicescheduler=Executors.newScheduledThreadPool(1);
scheduler.scheduleWithFixedDelay(newrunner(),0,1,TimeUnit.SECONDS);
//或者用scheduler.scheduleAtFixedRate(newrunner(),0,1,TimeUnit.SECONDS);
//接着我们要实现Runnable方法,也就是准时变动现在播放图片的ID
publicclassrunnerimplementsRunnable
{
publicvoidrun()
{
//TODOAuto-generatedmethodstub
currIndex=(currIndex+1)%bitmapId.length;
bofang.this.postInvalidate();//刷新屏幕
}
}
相关文章
- android 混淆不起作用,Android代码混淆的写法总结
- android 读取本地数据库db文件(Android sqlite)
- android declare-styleable 和style,Android 关于declare-styleable属性的写法….
- android telephony 原理解析与开发指南_Android逆向pdf
- android studio 导出的jar中没有主清单属性「建议收藏」
- 【Android 安全】DEX 加密 ( 代理 Application 开发 | 加载 dex 文件 | 使用反射获取方法创建本应用的 dexElements | 各版本创建 dex 数组源码对比 )
- 【Android 安全】DEX 加密 ( Application 替换 | 分析 Service 组件中调用 getApplication() 获取的 Application 是否替换成功 )
- 【Android Gradle 插件】Android Gradle 工程结构简介 ( Gradle 默认输出目录 | Gradle 配置目录 | gradlew 可执行文件 )
- Android开发中遇到的问题(二)——新建android工程的时候eclipse没有生成MainActivity和layout布局详解手机开发
- [android] listview入门详解手机开发
- Android拨号盘支持T9搜索和号码搜索等拨号盘案例
- Android列表实现(1)_数组列表实例介绍
- 分享Android开发中最有效率最快的循环代码
- Android在其他线程中更新UI线程的解决方法
- Android中发送Http请求(包括文件上传、servlet接收)的实例代码
- android开发之方形圆角listview代码分享
- Android进阶篇-自定义图片伸缩控件具体实例
- Android中判断手机是否联网实例
- Android中ExpandableListView的用法实例
- Android中使用IntentService创建后台服务实例
- Android触屏测试实例代码
- Android提高之蓝牙隐藏API探秘
- Android、iOS和WindowsPhone中的推送技术详解