Android開發(fā)實(shí)現(xiàn)廣告無限循環(huán)功能示例
本文實(shí)例講述了Android開發(fā)實(shí)現(xiàn)廣告無限循環(huán)功能。分享給大家供大家參考,具體如下:
一、效果圖:
二、代碼實(shí)現(xiàn):
/** * 新聞首頁 * * @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)在中間,使用戶看不到邊界 mViewPager.setOnTouchListener(this); // 開始輪播效果 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) { // 這個是設(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) { } // 覆寫該方法實(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è)置成最大,使用戶看不到邊界 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) { // 對ViewPager頁號求模取出View列表中要顯示的項(xiàng) position %= viewlist.size(); if (position < 0) { position = viewlist.size() + position; } ImageView view = viewlist.get(position); // 如果View已經(jīng)在之前添加到了一個父組件,則必須先remove,否則會拋出IllegalStateException。 ViewParent vp = view.getParent(); if (vp != null) { ViewGroup parent = (ViewGroup) vp; parent.removeView(view); } container.addView(view); // 此處可添加監(jiān)聽事件 return view; } } private static class ImageHandler extends Handler { /** * 請求更新顯示的View。 */ protected static final int MSG_UPDATE_IMAGE = 1; /** * 請求暫停輪播。 */ protected static final int MSG_KEEP_SILENT = 2; /** * 請求恢復(fù)輪播。 */ protected static final int MSG_BREAK_SILENT = 3; /** * 記錄最新的頁號,當(dāng)用戶手動滑動時需要記錄新頁號,否則會使輪播的頁面出錯。 * 例如當(dāng)前如果在第一頁,本來準(zhǔn)備播放的是第二頁,而這時候用戶滑動到了末頁, * 則應(yīng)該播放的是第一頁,如果繼續(xù)按照原來的第二頁播放,則邏輯上有問題。 */ protected static final int MSG_PAGE_CHANGED = 4; // 輪播間隔時間 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)回收,無需再處理UI了 return; } // 第一次不刪重復(fù)的消息 if (currentItem != 0) { // 檢查消息隊(duì)列并移除未發(fā)送的消息,這主要是避免在復(fù)雜環(huán)境下消息出現(xiàn)重復(fù)等問題。 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)前的頁號,避免播放的時候頁面顯示不正確。 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)容感興趣的讀者可查看本站專題:《Android視圖View技巧總結(jié)》、《Android編程之a(chǎn)ctivity操作技巧總結(jié)》、《Android布局layout技巧總結(jié)》、《Android開發(fā)入門與進(jìn)階教程》、《Android資源操作技巧匯總》及《Android控件用法總結(jié)》
希望本文所述對大家Android程序設(shè)計(jì)有所幫助。
- Android使用ViewPager實(shí)現(xiàn)滾動廣告
- Android 知乎廣告效果實(shí)現(xiàn)代碼
- Android 實(shí)現(xiàn)廣告歡迎界面(倒計(jì)時)
- Android滾動條廣告實(shí)現(xiàn)代碼示例
- Android ViewPager實(shí)現(xiàn)無限循環(huán)輪播廣告位Banner效果
- Android 應(yīng)用啟動歡迎界面廣告的實(shí)現(xiàn)實(shí)例
- Android仿淘寶頭條向上滾動廣告條ViewFlipper
- Kotlin FrameLayout與ViewPager2控件實(shí)現(xiàn)滾動廣告欄方法
相關(guān)文章
Android Service自啟動注意事項(xiàng)分析
這篇文章主要介紹了Android Service自啟動注意事項(xiàng),結(jié)合實(shí)例分析了Android Service自啟動過程中屬性設(shè)置的相關(guān)技巧,需要的朋友可以參考下2016-03-03Android實(shí)現(xiàn)個性化的進(jìn)度條
這篇文章主要介紹了Android實(shí)現(xiàn)個性化的進(jìn)度條 的相關(guān)資料,需要的朋友可以參考下2016-07-07Android開啟ADB網(wǎng)絡(luò)調(diào)試方法
今天小編就為大家分享一篇Android開啟ADB網(wǎng)絡(luò)調(diào)試方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08Android TextView中文字通過SpannableString設(shè)置屬性用法示例
這篇文章主要介紹了Android TextView中文字通過SpannableString設(shè)置屬性用法,結(jié)合實(shí)例形式分析了TextView控件中SpannableString類相關(guān)屬性的使用技巧,需要的朋友可以參考下2016-08-08