Android開(kāi)發(fā)實(shí)現(xiàn)廣告無(wú)限循環(huán)功能示例
本文實(shí)例講述了Android開(kāi)發(fā)實(shí)現(xiàn)廣告無(wú)限循環(huán)功能。分享給大家供大家參考,具體如下:
一、效果圖:

二、代碼實(shí)現(xiàn):
/**
* 新聞首頁(yè)
*
* @Project App_Card
* @Package com.android.koomama.fragment.home
* @author chenlin
* @version 1.0
* @Date 2014年6月22日
* @Note TODO
*/
public class NewsHomeFragment extends BaseFragment implements OnTouchListener {
private ImageHandler mHandler = new ImageHandler(new WeakReference<NewsHomeFragment>(this));
private ViewPager mViewPager;
// 自定義輪播圖的資源
private int[] mImageResIds = { R.drawable.img1, R.drawable.img2, R.drawable.img3, R.drawable.img4, R.drawable.img5 };
// 放輪播圖片的ImageView 的list
private List<ImageView> mImageList = new ArrayList<ImageView>();
// 放圓點(diǎn)的View的list
private List<View> mDotList = new ArrayList<View>();
@Override
public View initConvertView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_news_main, container, false);
}
@Override
protected void onVisible(boolean isInit) {
if (isInit) {
initViews();
}
}
private void initViews() {
// 初始化iewPager的內(nèi)容
mViewPager = (ViewPager) mConvertView.findViewById(R.id.view_pager);
LinearLayout dotLayout = (LinearLayout) mConvertView.findViewById(R.id.dotLayout);
dotLayout.removeAllViews();
for (int i = 0; i < mImageResIds.length; i++) {
ImageView imageView = new ImageView(getActivity());
imageView.setScaleType(ScaleType.FIT_XY);
// view.setTag(mImageResId[i]);
imageView.setImageResource(mImageResIds[i]);
mImageList.add(imageView);
View dotView = new View(getActivity());
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(getResources().getDimensionPixelSize(R.dimen.dot_width),
getResources().getDimensionPixelSize(R.dimen.dot_width));
params.setMargins(4, 0, 4, 0);
dotView.setLayoutParams(params);
// if (i == 0) {
// dotView.setBackgroundResource(R.drawable.dot_red);
// } else {
// dotView.setBackgroundResource(R.drawable.dot_gray);
// }
dotLayout.addView(dotView);
mDotList.add(dotView);
}
mViewPager.setAdapter(new ImageAdapter(mImageList));
mViewPager.setOnPageChangeListener(new PageChangeListener());
mViewPager.setFocusable(true);
mViewPager.setCurrentItem(Integer.MAX_VALUE / 2);// 默認(rèn)在中間,使用戶(hù)看不到邊界
mViewPager.setOnTouchListener(this);
// 開(kāi)始輪播效果
mHandler.sendEmptyMessageDelayed(ImageHandler.MSG_UPDATE_IMAGE, ImageHandler.MSG_DELAY);
}
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mHandler.sendEmptyMessage(ImageHandler.MSG_KEEP_SILENT);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
mHandler.sendEmptyMessageDelayed(ImageHandler.MSG_UPDATE_IMAGE, ImageHandler.MSG_DELAY);
break;
}
return false;
}
private class PageChangeListener implements OnPageChangeListener {
// 配合Adapter的currentItem字段進(jìn)行設(shè)置。
@Override
public void onPageSelected(int position) {
// 這個(gè)是設(shè)置左滑切換底部view的邊界,必須要設(shè)置
App.getInstance().setBorderViewPosition(position);
mHandler.sendMessage(Message.obtain(mHandler, ImageHandler.MSG_PAGE_CHANGED, position, 0));
}
@Override
public void onPageScrolled(int position, float arg1, int arg2) {
}
// 覆寫(xiě)該方法實(shí)現(xiàn)輪播效果的暫停和恢復(fù)
@Override
public void onPageScrollStateChanged(int state) {
switch (state) {
case ViewPager.SCROLL_STATE_DRAGGING:
mHandler.sendEmptyMessage(ImageHandler.MSG_KEEP_SILENT);
break;
case ViewPager.SCROLL_STATE_IDLE:
mHandler.sendEmptyMessageDelayed(ImageHandler.MSG_UPDATE_IMAGE, ImageHandler.MSG_DELAY);
break;
default:
break;
}
}
}
private class ImageAdapter extends PagerAdapter {
private List<ImageView> viewlist;
public ImageAdapter(List<ImageView> viewlist) {
this.viewlist = viewlist;
}
@Override
public int getCount() {
// 設(shè)置成最大,使用戶(hù)看不到邊界
return Integer.MAX_VALUE;
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// Warning:不要在這里調(diào)用removeView
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
// 對(duì)ViewPager頁(yè)號(hào)求模取出View列表中要顯示的項(xiàng)
position %= viewlist.size();
if (position < 0) {
position = viewlist.size() + position;
}
ImageView view = viewlist.get(position);
// 如果View已經(jīng)在之前添加到了一個(gè)父組件,則必須先remove,否則會(huì)拋出IllegalStateException。
ViewParent vp = view.getParent();
if (vp != null) {
ViewGroup parent = (ViewGroup) vp;
parent.removeView(view);
}
container.addView(view);
// 此處可添加監(jiān)聽(tīng)事件
return view;
}
}
private static class ImageHandler extends Handler {
/**
* 請(qǐng)求更新顯示的View。
*/
protected static final int MSG_UPDATE_IMAGE = 1;
/**
* 請(qǐng)求暫停輪播。
*/
protected static final int MSG_KEEP_SILENT = 2;
/**
* 請(qǐng)求恢復(fù)輪播。
*/
protected static final int MSG_BREAK_SILENT = 3;
/**
* 記錄最新的頁(yè)號(hào),當(dāng)用戶(hù)手動(dòng)滑動(dòng)時(shí)需要記錄新頁(yè)號(hào),否則會(huì)使輪播的頁(yè)面出錯(cuò)。
* 例如當(dāng)前如果在第一頁(yè),本來(lái)準(zhǔn)備播放的是第二頁(yè),而這時(shí)候用戶(hù)滑動(dòng)到了末頁(yè),
* 則應(yīng)該播放的是第一頁(yè),如果繼續(xù)按照原來(lái)的第二頁(yè)播放,則邏輯上有問(wèn)題。
*/
protected static final int MSG_PAGE_CHANGED = 4;
// 輪播間隔時(shí)間
protected static final long MSG_DELAY = 3000;
// 使用弱引用避免Handler泄露.這里的泛型參數(shù)可以不是Activity,也可以是Fragment等
private WeakReference<NewsHomeFragment> weakReference;
private int currentItem = 0;
// private boolean isOnce = true;
protected ImageHandler(WeakReference<NewsHomeFragment> wk) {
weakReference = wk;
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
final NewsHomeFragment fragment = weakReference.get();
if (fragment == null) {
// Activity已經(jīng)回收,無(wú)需再處理UI了
return;
}
// 第一次不刪重復(fù)的消息
if (currentItem != 0) {
// 檢查消息隊(duì)列并移除未發(fā)送的消息,這主要是避免在復(fù)雜環(huán)境下消息出現(xiàn)重復(fù)等問(wèn)題。
if (fragment.mHandler.hasMessages(MSG_UPDATE_IMAGE)) {
fragment.mHandler.removeMessages(MSG_UPDATE_IMAGE);
}
}
switch (msg.what) {
case MSG_UPDATE_IMAGE:
currentItem++;
fragment.mViewPager.setCurrentItem(currentItem);
// 準(zhǔn)備下次播放
fragment.mHandler.sendEmptyMessageDelayed(MSG_UPDATE_IMAGE, MSG_DELAY);
break;
case MSG_KEEP_SILENT:
// 只要不發(fā)送消息就暫停了
break;
case MSG_BREAK_SILENT:
fragment.mHandler.sendEmptyMessageDelayed(MSG_UPDATE_IMAGE, MSG_DELAY);
break;
case MSG_PAGE_CHANGED:
// 記錄當(dāng)前的頁(yè)號(hào),避免播放的時(shí)候頁(yè)面顯示不正確。
int position = msg.arg1;
int lastIndex = 0;
int index = position % fragment.mImageList.size();
for (int i = 0; i < fragment.mDotList.size(); i++) {
fragment.mDotList.get(i).setBackgroundResource(R.drawable.dot_normal);
}
if (fragment.mDotList.get(index)!=null) {
fragment.mDotList.get(index).setBackgroundResource(R.drawable.dot_red);
}
lastIndex = index;
currentItem = position;
break;
default:
break;
}
}
}
}
三、布局
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="@dimen/news_pic_height" >
<android.support.v4.view.ViewPager
android:id="@+id/view_pager"
android:layout_width="match_parent"
android:layout_height="@dimen/news_pic_height" />
<LinearLayout
android:id="@+id/dotLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:gravity="right|bottom"
android:orientation="horizontal"
android:background="@color/transparent_white_half"
android:padding="8dp" >
<View
android:id="@+id/v_dot1"
android:layout_width="@dimen/dot_width"
android:layout_height="@dimen/dot_width"
android:background="@drawable/dot_normal" />
<View
android:id="@+id/v_dot2"
android:layout_width="@dimen/dot_width"
android:layout_height="@dimen/dot_width"
android:layout_marginLeft="5dp"
android:background="@drawable/dot_red" />
</LinearLayout>
</RelativeLayout>
</LinearLayout>
更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Android視圖View技巧總結(jié)》、《Android編程之a(chǎn)ctivity操作技巧總結(jié)》、《Android布局layout技巧總結(jié)》、《Android開(kāi)發(fā)入門(mén)與進(jìn)階教程》、《Android資源操作技巧匯總》及《Android控件用法總結(jié)》
希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。
- Android使用ViewPager實(shí)現(xiàn)滾動(dòng)廣告
- Android 知乎廣告效果實(shí)現(xiàn)代碼
- Android 實(shí)現(xiàn)廣告歡迎界面(倒計(jì)時(shí))
- Android滾動(dòng)條廣告實(shí)現(xiàn)代碼示例
- Android ViewPager實(shí)現(xiàn)無(wú)限循環(huán)輪播廣告位Banner效果
- Android 應(yīng)用啟動(dòng)歡迎界面廣告的實(shí)現(xiàn)實(shí)例
- Android仿淘寶頭條向上滾動(dòng)廣告條ViewFlipper
- Kotlin FrameLayout與ViewPager2控件實(shí)現(xiàn)滾動(dòng)廣告欄方法
相關(guān)文章
微信公眾平臺(tái)開(kāi)發(fā)入門(mén)教程(圖文詳解)
由于微信的大熱,為了更好的方便使用微信的用戶(hù)查詢(xún)一些信息,這篇文章是入門(mén)級(jí)的微信公眾平臺(tái)開(kāi)發(fā)教程,需要的朋友可以參考下2013-09-09
Android Service自啟動(dòng)注意事項(xiàng)分析
這篇文章主要介紹了Android Service自啟動(dòng)注意事項(xiàng),結(jié)合實(shí)例分析了Android Service自啟動(dòng)過(guò)程中屬性設(shè)置的相關(guān)技巧,需要的朋友可以參考下2016-03-03
Android中Glide加載庫(kù)的圖片緩存配置究極指南
這篇文章主要介紹了Android中Glide加載庫(kù)的圖片緩存配置究極指南,Glide是一款高人氣的安卓多媒體資源加載庫(kù),本文對(duì)其緩存設(shè)置和優(yōu)化作了詳細(xì)講解,需要的朋友可以參考下2016-04-04
android?studio后臺(tái)服務(wù)使用詳解
這篇文章主要為大家詳細(xì)介紹了android?studio后臺(tái)服務(wù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
Android控制閃光燈的方法(打開(kāi)與關(guān)閉)
這篇文章主要介紹了Android控制閃光燈的方法,可實(shí)現(xiàn)閃光燈打開(kāi)與關(guān)閉的效果,涉及Android操作Camera拍照閃光燈的相關(guān)技巧,需要的朋友可以參考下2016-01-01
Android實(shí)現(xiàn)個(gè)性化的進(jìn)度條
這篇文章主要介紹了Android實(shí)現(xiàn)個(gè)性化的進(jìn)度條 的相關(guān)資料,需要的朋友可以參考下2016-07-07
Android開(kāi)啟ADB網(wǎng)絡(luò)調(diào)試方法
今天小編就為大家分享一篇Android開(kāi)啟ADB網(wǎng)絡(luò)調(diào)試方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
Android TextView中文字通過(guò)SpannableString設(shè)置屬性用法示例
這篇文章主要介紹了Android TextView中文字通過(guò)SpannableString設(shè)置屬性用法,結(jié)合實(shí)例形式分析了TextView控件中SpannableString類(lèi)相關(guān)屬性的使用技巧,需要的朋友可以參考下2016-08-08

