Android开发实现广告无限循环功能示例
程序员文章站
2023-12-04 17:49:35
本文实例讲述了android开发实现广告无限循环功能。分享给大家供大家参考,具体如下:
一、效果图:
二、代码实现:
/**
* 新闻首页
*...
本文实例讲述了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, 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);// 默认在中间,使用户看不到边界 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程序设计有所帮助。