欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android开发实现广告无限循环功能示例

程序员文章站 2023-12-04 17:49:35
本文实例讲述了android开发实现广告无限循环功能。分享给大家供大家参考,具体如下: 一、效果图: 二、代码实现: /** * 新闻首页 *...

本文实例讲述了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程序设计有所帮助。