本文实例讲述了AndroID开发实现广告无限循环功能。分享给大家供大家参考,具体如下:
一、效果图:
二、代码实现:
/** * 新闻首页 * * @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>(); // 放圆点的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的内容 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,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);// 默认在中间,使用户看不到边界 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字段进行设置。 @OverrIDe public voID onPageSelected(int position) { // 这个是设置左滑切换底部vIEw的边界,必须要设置 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) { } // 覆写该方法实现轮播效果的暂停和恢复 @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() { // 设置成最大,使用户看不到边界 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:不要在这里调用removeVIEw } @OverrIDe public Object instantiateItem(VIEwGroup container,int position) { // 对VIEwPager页号求模取出VIEw列表中要显示的项 position %= vIEwList.size(); if (position < 0) { position = vIEwList.size() + position; } ImageVIEw vIEw = vIEwList.get(position); // 如果VIEw已经在之前添加到了一个父组件,则必须先remove,否则会抛出IllegalStateException。 VIEwParent vp = vIEw.getParent(); if (vp != null) { VIEwGroup parent = (VIEwGroup) vp; parent.removeVIEw(vIEw); } container.addVIEw(vIEw); // 此处可添加监听事件 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; /** * 请求恢复轮播。 */ protected static final int MSG_BREAK_SILENT = 3; /** * 记录最新的页号,当用户手动滑动时需要记录新页号,否则会使轮播的页面出错。 * 例如当前如果在第一页,本来准备播放的是第二页,而这时候用户滑动到了末页, * 则应该播放的是第一页,如果继续按照原来的第二页播放,则逻辑上有问题。 */ protected static final int MSG_PAGE_CHANGED = 4; // 轮播间隔时间 protected static final long MSG_DELAY = 3000; // 使用弱引用避免Handler泄露.这里的泛型参数可以不是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已经回收,无需再处理UI了 return; } // 第一次不删重复的消息 if (currentItem != 0) { // 检查消息队列并移除未发送的消息,这主要是避免在复杂环境下消息出现重复等问题。 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); // 准备下次播放 fragment.mHandler.sendEmptyMessageDelayed(MSG_UPDATE_IMAGE,MSG_DELAY); break; case MSG_KEEP_SILENT: // 只要不发送消息就暂停了 break; case MSG_BREAK_SILENT: fragment.mHandler.sendEmptyMessageDelayed(MSG_UPDATE_IMAGE,MSG_DELAY); break; case MSG_PAGE_CHANGED: // 记录当前的页号,避免播放的时候页面显示不正确。 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>
更多关于AndroID相关内容感兴趣的读者可查看本站专题:《Android视图View技巧总结》、《Android编程之activity *** 作技巧总结》、《Android布局layout技巧总结》、《Android开发入门与进阶教程》、《Android资源 *** 作技巧汇总》及《Android控件用法总结》
希望本文所述对大家AndroID程序设计有所帮助。
总结以上是内存溢出为你收集整理的Android开发实现广告无限循环功能示例全部内容,希望文章能够帮你解决Android开发实现广告无限循环功能示例所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)