Android實(shí)現(xiàn)圖片循環(huán)播放的實(shí)例方法
很多時(shí)候,我們需要展示在客戶端展示圖片,而且是動(dòng)態(tài)顯示,即不停地自行切換圖片。下面我們來(lái)看一下具體的實(shí)現(xiàn)方法。首先,我們需要在XML...
很多時(shí)候,我們需要展示在客戶端展示圖片,而且是動(dòng)態(tài)顯示,即不停地自行切換圖片。下面我們來(lái)看一下具體的實(shí)現(xiàn)方法。
首先,我們需要在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是用來(lái)播放圖片的View類-->
<com.sunianjinshi.bofang
android:layout_width="180dip"
android:layout_height = "250dip"
/>
</LinearLayout>
好了,到這里需要用來(lái)播放圖片的控件就配置好了,接下來(lái)我們就要來(lái)寫(xiě)實(shí)現(xiàn)類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;//是不是已經(jīng)初始化圖片
Bitmap[] bmp;//用來(lái)寄存圖片的數(shù)組
int currPicIndex = 0;//以后播放圖片的ID
int[] bitmapId;//圖片編號(hào)ID
boolean workFlag = true;//播放圖片的線程標(biāo)識(shí)位
public GGViewCX(Context father,AttributeSet as)//重寫(xiě)構(gòu)造函數(shù)
{
//首先,要播放圖片,就先要有圖片,那就先給各個(gè)圖片編號(hào)吧,這里的圖片資源寄存在了res下的drawable文件夾下了
int[] bitmapId ={R.drawable.adv1, R.drawable.adv2, R.drawable.adv3};
//好了,圖片的編號(hào)當(dāng)初已經(jīng)搞定了,接下來(lái)該干什么呢?對(duì),應(yīng)該將資源里的圖片塞進(jìn)Bitmap數(shù)組了,那么我們先來(lái)確定將要播放的圖片的數(shù)量,即Bitmap數(shù)組的長(zhǎng)度
bmp = new Bitmap[bitmapId.length];//這里不要直接將數(shù)值賦給bmp,因?yàn)槲覀兛赡軙?huì)不定期地改換圖片資源,這樣我們就要修改多處代碼,而我們這樣根據(jù)
//圖片的ID來(lái)確定圖片的數(shù)量,以減少不必要的費(fèi)事,下面開(kāi)始初始化圖片,我們將初始化圖片放在一個(gè)函數(shù)里
initBitmap();//圖片初始化終了
//圖片初始化終了了,接下來(lái)我們要做的就是播放圖片了,但是播放圖片之前,我們有一個(gè)問(wèn)題,就是怎樣讓圖片實(shí)現(xiàn)循環(huán)播放?這里我們另開(kāi)一個(gè)新的線程來(lái)準(zhǔn)時(shí)變動(dòng)
//要播放的圖片的ID,以實(shí)現(xiàn)圖片的循環(huán)播放,要實(shí)現(xiàn)循環(huán)播放圖片的功能,我們需要覆寫(xiě)onDraw函數(shù),首先,我們來(lái)新開(kāi)一個(gè)線程
new Thread()
{
//重寫(xiě)run方法
public void run()
{
// TODO Auto-generated method stub
while(workflag)//一直執(zhí)行這個(gè)循環(huán)(死循環(huán))
{
currIndex = (currIndex+1)%bitmapId.length;//變動(dòng)圖片的ID
bofang.this.postInvalidate();//刷新屏幕,導(dǎo)致屏幕重繪
try
{
Thread.sleep(3000);//到此處暫停3秒鐘,然后繼續(xù)執(zhí)行run函數(shù),即實(shí)現(xiàn)每隔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]);
}
}
//覆寫(xiě)onDraw方法
@Override
protected void onDraw(Canvas canvas)
{
// TODO Auto-generated method stub
super.onDraw(canvas);
if(!initflag)//檢查是偶已經(jīng)獲得控件的寬和高,如果沒(méi)有,那么就獲得控件的寬和高
{
COMPONENT_WIDTH = this.getWidth();
COMPONENT_HEIGHT = this.getHeight();
initflag = true;
}
canvas.drawBitmap(bma[currIndex], 0, 0,paint);//繪制圖片
}
}
PS:這里要說(shuō)明一下,下面的代碼中其實(shí)有些地方還有更好的實(shí)現(xiàn)方法。
比如:
我們?yōu)榱藢?shí)現(xiàn)準(zhǔn)時(shí)變動(dòng)要播放的圖片的ID,以實(shí)現(xiàn)循環(huán)播放,新開(kāi)了了一個(gè)線程,并且開(kāi)了一個(gè)死循環(huán),但實(shí)際這樣的寫(xiě)法可控性很低,JDK的java.util.concurrent中提供了大批的方法去控制一段代碼準(zhǔn)時(shí)執(zhí)行,標(biāo)準(zhǔn)的改寫(xiě)下面的代碼如下:
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleWithFixedDelay(new runner(), 0, 1, TimeUnit.SECONDS);
//或者用scheduler.scheduleAtFixedRate(new runner(),0,1, TimeUnit.SECONDS);
//接著我們要實(shí)現(xiàn)Runnable方法,也就是準(zhǔn)時(shí)變動(dòng)現(xiàn)在播放圖片的ID
public class runner implements Runnable
{
public void run()
{
// TODO Auto-generated method stub
currIndex = (currIndex+1)%bitmapId.length;
bofang.this.postInvalidate();//刷新屏幕
}
}
- Android實(shí)現(xiàn)可復(fù)用的篩選頁(yè)面
- Android中 TeaScreenPopupWindow多類型篩選彈框功能的實(shí)例代碼
- Android實(shí)現(xiàn)簡(jiǎn)單下拉篩選框
- Android可篩選的彈窗控件CustomFiltControl
- android仿京東商品屬性篩選功能
- 可支持快速搜索篩選的Android自定義選擇控件
- Android 仿京東側(cè)滑篩選實(shí)例代碼
- Android Handler之消息循環(huán)的深入解析
- Android開(kāi)發(fā)筆記之:消息循環(huán)與Looper的詳解
- RecyclerView+SnapHelper實(shí)現(xiàn)無(wú)限循環(huán)篩選控件
相關(guān)文章
一個(gè)簡(jiǎn)單的Android圓弧刷新動(dòng)畫(huà)
這篇文章主要為大家詳細(xì)介紹了一個(gè)簡(jiǎn)單的Android圓弧刷新動(dòng)畫(huà),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09Android Studio 中的Gradle構(gòu)建系統(tǒng)示例
這篇文章主要介紹了Android Studio 中的Gradle構(gòu)建系統(tǒng)示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11Android 將 android view 的位置設(shè)為右下角的解決方法
Android 將 android view 的位置設(shè)為右下角的解決方法,需要的朋友可以參考一下2013-05-05詳解Android中visibility屬性VISIBLE、INVISIBLE、GONE的區(qū)別
在Android開(kāi)發(fā)中,大部分控件都有visibility這個(gè)屬性,其屬性有3個(gè)分別為“visible ”、“invisible”、“gone”。主要用來(lái)設(shè)置控制控件的顯示和隱藏。本文就詳細(xì)的講解一下。2016-12-12Android仿騰訊QQ實(shí)現(xiàn)滑動(dòng)刪除 附源碼下載
仿騰訊QQ滑動(dòng)刪除操作,這篇文章主要為大家詳細(xì)介紹了ListView滑動(dòng)刪除的具體操作方法,感興趣的小伙伴們可以參考一下2016-07-07Android自定義Dialog實(shí)現(xiàn)通用圓角對(duì)話框
這篇文章主要為大家詳細(xì)介紹了Android自定義Dialog實(shí)現(xiàn)通用圓角對(duì)話框,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11Android獲取手機(jī)系統(tǒng)版本等信息的方法
這篇文章主要介紹了Android獲取手機(jī)系統(tǒng)版本等信息的方法,涉及Android獲取手機(jī)版本中各種常見(jiàn)信息的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2015-04-04Android中的應(yīng)用認(rèn)領(lǐng)總結(jié)
這篇文章主要介紹了Android中的應(yīng)用認(rèn)領(lǐng)總結(jié),本文講解了如何認(rèn)領(lǐng)、對(duì)未簽名包簽名、需要替換的簽名值、驗(yàn)證簽名等內(nèi)容,需要的朋友可以參考下2015-01-01Android按鈕單擊事件的四種常用寫(xiě)法總結(jié)
這篇文章主要介紹了Android按鈕單擊事件的四種常用寫(xiě)法總結(jié),比較了常見(jiàn)的四種寫(xiě)法的優(yōu)劣,有不錯(cuò)的參考借鑒價(jià)值,需要的朋友可以參考下2014-09-09Android studio 自動(dòng)換行和取消自動(dòng)換行操作
這篇文章主要介紹了Android studio 自動(dòng)換行和取消自動(dòng)換行操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04