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) {
// 這個(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) {
}
// 覆寫該方法實(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)在之前添加到了一個(gè)父組件,則必須先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)用戶手動滑動時(shí)需要記錄新頁號,否則會使輪播的頁面出錯(cuò)。
* 例如當(dāng)前如果在第一頁,本來準(zhǔn)備播放的是第二頁,而這時(shí)候用戶滑動到了末頁,
* 則應(yīng)該播放的是第一頁,如果繼續(xù)按照原來的第二頁播放,則邏輯上有問題。
*/
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)回收,無需再處理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)前的頁號,避免播放的時(shí)候頁面顯示不正確。
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ì)時(shí))
- 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實(shí)現(xiàn)側(cè)滑菜單DrawerLayout
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)側(cè)滑菜單DrawerLayout,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-05-05
Android?Jetpack組件ViewModel基本用法詳解
這篇文章主要為大家介紹了Android?Jetpack組件ViewModel基本用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
使用Android實(shí)現(xiàn)一個(gè)懸浮在軟鍵盤上的輸入欄
app開發(fā)中經(jīng)常會遇到一些輸入框要懸浮到軟鍵盤上方的需求,下面這篇文章主要給大家介紹了關(guān)于如何使用Android實(shí)現(xiàn)一個(gè)懸浮在軟鍵盤上的輸入欄的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04
android 通知Notification詳解及實(shí)例代碼
這篇文章主要介紹了android 通知Notification詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-12-12
Android?廣播接收器BroadcastReceiver詳解
Android開發(fā)的四大組件分別是:活動(activity),用于表現(xiàn)功能;服務(wù)(service),后臺運(yùn)行服務(wù),不提供界面呈現(xiàn);廣播接受者(Broadcast Receive),勇于接收廣播;內(nèi)容提供者(Content Provider),支持多個(gè)應(yīng)用中存儲和讀取數(shù)據(jù),相當(dāng)于數(shù)據(jù)庫,本篇著重介紹廣播組件2022-07-07

