Android UI - 实现广告Banner轮播效果

来源:互联网 发布:java jar 设置jdk 编辑:程序博客网 时间:2024/06/06 09:47

转载自http://blog.csdn.net/wwj_748/article/details/44243053


Android UI - 实现广告Banner轮播效果

前言

本篇博客要分享的一个效果是实现广告Banner轮播效果,这个效果也比较常见,一些视频类应用就经常有,就拿360影视大全来举例吧:


用红框框住的那个效果就是小巫今天要分享的,先来思考一下会用到什么控件?有什么用户体验?

控件我们可能一下子就可以想到的自然是ViewPager,没错!用到的就是ViewPager,那么它会有什么用户体验呢,它可能有以下几个体验:

1. 间隔不停的切换图片,指示器也跟着变

2. 点击图片可以跳转到指定的页面


如何实现?

布局开始着手

/BannerAutoScrollDemo/res/layout/banner.xml

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <FrameLayout  
  8.         android:layout_width="match_parent"  
  9.         android:layout_height="210dp" >  
  10.   
  11.         <android.support.v4.view.ViewPager  
  12.             android:id="@+id/vp"  
  13.             android:layout_width="match_parent"  
  14.             android:layout_height="210dp" />  
  15.   
  16.         <RelativeLayout  
  17.             android:layout_width="match_parent"  
  18.             android:layout_height="wrap_content"  
  19.             android:layout_gravity="bottom"  
  20.             android:background="@drawable/shadow_article" >  
  21.   
  22.             <TextView  
  23.                 android:id="@+id/tv_date"  
  24.                 android:layout_width="wrap_content"  
  25.                 android:layout_height="wrap_content"  
  26.                 android:layout_above="@+id/author_layout"  
  27.                 android:layout_marginBottom="10dp"  
  28.                 android:layout_marginLeft="10dp"  
  29.                 android:maxLines="2"  
  30.                 android:text="3月4日"  
  31.                 android:textColor="@color/white"  
  32.                 android:textSize="18sp" />  
  33.   
  34.             <TextView  
  35.                 android:id="@+id/tv_title"  
  36.                 android:layout_width="wrap_content"  
  37.                 android:layout_height="wrap_content"  
  38.                 android:layout_above="@+id/author_layout"  
  39.                 android:layout_marginBottom="10dp"  
  40.                 android:layout_marginLeft="10dp"  
  41.                 android:layout_marginRight="10dp"  
  42.                 android:layout_toRightOf="@+id/tv_date"  
  43.                 android:maxLines="2"  
  44.                 android:text="我和令计划只是同姓"  
  45.                 android:textColor="@color/white"  
  46.                 android:textSize="18sp" />  
  47.   
  48.             <RelativeLayout  
  49.                 android:id="@+id/author_layout"  
  50.                 android:layout_width="match_parent"  
  51.                 android:layout_height="wrap_content"  
  52.                 android:layout_alignParentBottom="true"  
  53.                 android:layout_marginLeft="10dp"  
  54.                 android:gravity="center_vertical"  
  55.                 android:paddingBottom="20dp" >  
  56.   
  57.                 <TextView  
  58.                     android:id="@+id/tv_pre"  
  59.                     android:layout_width="wrap_content"  
  60.                     android:layout_height="wrap_content"  
  61.                     android:text="文章选题来自"  
  62.                     android:textColor="@color/white"  
  63.                     android:textSize="12sp" />  
  64.   
  65.                 <TextView  
  66.                     android:id="@+id/tv_topic_from"  
  67.                     android:layout_width="wrap_content"  
  68.                     android:layout_height="wrap_content"  
  69.                     android:layout_toRightOf="@+id/tv_pre"  
  70.                     android:text="阿宅的"  
  71.                     android:textColor="@color/white"  
  72.                     android:textSize="12sp" />  
  73.   
  74.                 <TextView  
  75.                     android:id="@+id/tv_topic"  
  76.                     android:layout_width="wrap_content"  
  77.                     android:layout_height="wrap_content"  
  78.                     android:layout_marginLeft="10dp"  
  79.                     android:layout_toRightOf="@+id/tv_topic_from"  
  80.                     android:text="“我想知道令狐安和令计划有什么关系?”"  
  81.                     android:textColor="@color/white"  
  82.                     android:textSize="12sp" />  
  83.             </RelativeLayout>  
  84.         </RelativeLayout>  
  85.   
  86.         <LinearLayout  
  87.             android:layout_width="wrap_content"  
  88.             android:layout_height="wrap_content"  
  89.             android:layout_marginTop="10dip"  
  90.             android:layout_gravity="bottom|center_horizontal"  
  91.             android:layout_marginBottom="10dp"  
  92.             android:gravity="center" >  
  93.   
  94.             <View  
  95.                 android:id="@+id/v_dot0"  
  96.                 style="@style/dot_style"  
  97.                 android:background="@drawable/dot_focused"  
  98.                 android:visibility="invisible" />  
  99.   
  100.             <View  
  101.                 android:id="@+id/v_dot1"  
  102.                 style="@style/dot_style"   
  103.                 android:visibility="invisible"/>  
  104.   
  105.             <View  
  106.                 android:id="@+id/v_dot2"  
  107.                 style="@style/dot_style"   
  108.                 android:visibility="invisible"/>  
  109.   
  110.             <View  
  111.                 android:id="@+id/v_dot3"  
  112.                 style="@style/dot_style"   
  113.                 android:visibility="invisible"/>  
  114.   
  115.             <View  
  116.                 android:id="@+id/v_dot4"  
  117.                 style="@style/dot_style"  
  118.                 android:visibility="invisible" />  
  119.         </LinearLayout>  
  120.     </FrameLayout>  
  121.   
  122. </LinearLayout>  

一个ViewPager,下面五个指示点,注意每个点都有同样的样式,我们在style.xml中定义样式:

/BannerAutoScrollDemo/res/values/styles.xml

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <style name="dot_style">  
  2.        <item name="android:layout_width">5dip</item>  
  3.        <item name="android:layout_height">5dip</item>  
  4.        <item name="android:background">@drawable/dot_normal</item>  
  5.        <item name="android:layout_marginLeft">1.5dip</item>  
  6.        <item name="android:layout_marginRight">1.5dip</item>  
  7.    </style>  


定义圆点图形资源

/BannerAutoScrollDemo/res/drawable/dot_normal.xml

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <shape xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:shape="oval" >  
  4.   
  5.     <solid android:color="#33000000" />  
  6.   
  7.     <corners android:radius="5dip" />  
  8.   
  9. </shape>  

/BannerAutoScrollDemo/res/drawable/dot_focused.xml

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <shape xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:shape="oval" >  
  4.   
  5.     <solid android:color="#aaFFFFFF" />  
  6.   
  7.     <corners android:radius="5dip" />  
  8.   
  9. </shape>  

定义广告实体

/BannerAutoScrollDemo/src/com/xiaowu/banner/demo/AdDomain.java

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.xiaowu.banner.demo;  
  2.   
  3. /** 
  4.  * 广告实体 
  5.  *  
  6.  * @author wwj_748 
  7.  *  
  8.  */  
  9. public class AdDomain {  
  10.     private String id; // 广告id  
  11.     private String date; // 日期  
  12.     private String title; // 标题  
  13.     private String topicFrom; //选题来自   
  14.     private String topic; // 选题  
  15.     private String imgUrl; // 图片url  
  16.     private boolean isAd; // 是否为广告  
  17.     private String startTime; // 广告开始时间  
  18.     private String endTime; // 广告结束时间  
  19.     private String targetUrl; // 目标url  
  20.     private int width; // 宽  
  21.     private int height; // 高  
  22.     private boolean available; // 是否可用  
  23.       
  24.   
  25.     public String getId() {  
  26.         return id;  
  27.     }  
  28.   
  29.     public void setId(String id) {  
  30.         this.id = id;  
  31.     }  
  32.   
  33.     public String getTitle() {  
  34.         return title;  
  35.     }  
  36.   
  37.     public void setTitle(String title) {  
  38.         this.title = title;  
  39.     }  
  40.   
  41.     public String getImgUrl() {  
  42.         return imgUrl;  
  43.     }  
  44.   
  45.     public void setImgUrl(String imgUrl) {  
  46.         this.imgUrl = imgUrl;  
  47.     }  
  48.   
  49.     public boolean isAd() {  
  50.         return isAd;  
  51.     }  
  52.   
  53.     public void setAd(boolean isAd) {  
  54.         this.isAd = isAd;  
  55.     }  
  56.   
  57.     public String getDate() {  
  58.         return date;  
  59.     }  
  60.   
  61.     public void setDate(String date) {  
  62.         this.date = date;  
  63.     }  
  64.   
  65.     public String getTopic() {  
  66.         return topic;  
  67.     }  
  68.   
  69.     public void setTopic(String topic) {  
  70.         this.topic = topic;  
  71.     }  
  72.   
  73.     public String getTopicFrom() {  
  74.         return topicFrom;  
  75.     }  
  76.   
  77.     public void setTopicFrom(String topicFrom) {  
  78.         this.topicFrom = topicFrom;  
  79.     }  
  80.   
  81.     public String getStartTime() {  
  82.         return startTime;  
  83.     }  
  84.   
  85.     public void setStartTime(String startTime) {  
  86.         this.startTime = startTime;  
  87.     }  
  88.   
  89.     public String getEndTime() {  
  90.         return endTime;  
  91.     }  
  92.   
  93.     public void setEndTime(String endTime) {  
  94.         this.endTime = endTime;  
  95.     }  
  96.   
  97.     public String getTargetUrl() {  
  98.         return targetUrl;  
  99.     }  
  100.   
  101.     public void setTargetUrl(String targetUrl) {  
  102.         this.targetUrl = targetUrl;  
  103.     }  
  104.   
  105.     public int getWidth() {  
  106.         return width;  
  107.     }  
  108.   
  109.     public void setWidth(int width) {  
  110.         this.width = width;  
  111.     }  
  112.   
  113.     public int getHeight() {  
  114.         return height;  
  115.     }  
  116.   
  117.     public void setHeight(int height) {  
  118.         this.height = height;  
  119.     }  
  120.   
  121.     public boolean isAvailable() {  
  122.         return available;  
  123.     }  
  124.   
  125.     public void setAvailable(boolean available) {  
  126.         this.available = available;  
  127.     }  
  128.       
  129.   
  130. }  


实现切换逻辑

1. 定时切换

2. 切换图片

3. 切换标题

4. 切换指示器


定时切换用到一个类:ScheduledExecutorService

作用是定时执行任务,我们这里要做的定时任务是,2秒执行一次图片切换

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. private void startAd() {  
  2.         scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();  
  3.         // 当Activity显示出来后,每两秒切换一次图片显示  
  4.         scheduledExecutorService.scheduleAtFixedRate(new ScrollTask(), 12,  
  5.                 TimeUnit.SECONDS);  
  6.     }  

定义子线程

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. private class ScrollTask implements Runnable {  
  2.   
  3.         @Override  
  4.         public void run() {  
  5.             synchronized (adViewPager) {  
  6.                 currentItem = (currentItem + 1) % imageViews.size();  
  7.                 handler.obtainMessage().sendToTarget();  
  8.             }  
  9.         }  
  10.     }  

通过handle来通知ViewPager进行视图切换

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. private Handler handler = new Handler() {  
  2.         public void handleMessage(android.os.Message msg) {  
  3.             adViewPager.setCurrentItem(currentItem);  
  4.         };  
  5.     };  

我们提供模拟数据来进行测试

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. /** 
  2.      * 轮播广播模拟数据 
  3.      *  
  4.      * @return 
  5.      */  
  6.     public static List<AdDomain> getBannerAd() {  
  7.         List<AdDomain> adList = new ArrayList<AdDomain>();  
  8.   
  9.         AdDomain adDomain = new AdDomain();  
  10.         adDomain.setId("108078");  
  11.         adDomain.setDate("3月4日");  
  12.         adDomain.setTitle("我和令计划只是同姓");  
  13.         adDomain.setTopicFrom("阿宅");  
  14.         adDomain.setTopic("我想知道令狐安和令计划有什么关系?");  
  15.         adDomain.setImgUrl("http://g.hiphotos.baidu.com/image/w%3D310/sign=bb99d6add2c8a786be2a4c0f5708c9c7/d50735fae6cd7b8900d74cd40c2442a7d9330e29.jpg");  
  16.         adDomain.setAd(false);  
  17.         adList.add(adDomain);  
  18.   
  19.         AdDomain adDomain2 = new AdDomain();  
  20.         adDomain2.setId("108078");  
  21.         adDomain2.setDate("3月5日");  
  22.         adDomain2.setTitle("我和令计划只是同姓");  
  23.         adDomain2.setTopicFrom("小巫");  
  24.         adDomain2.setTopic("“我想知道令狐安和令计划有什么关系?”");  
  25.         adDomain2  
  26.                 .setImgUrl("http://g.hiphotos.baidu.com/image/w%3D310/sign=7cbcd7da78f40ad115e4c1e2672e1151/eaf81a4c510fd9f9a1edb58b262dd42a2934a45e.jpg");  
  27.         adDomain2.setAd(false);  
  28.         adList.add(adDomain2);  
  29.   
  30.         AdDomain adDomain3 = new AdDomain();  
  31.         adDomain3.setId("108078");  
  32.         adDomain3.setDate("3月6日");  
  33.         adDomain3.setTitle("我和令计划只是同姓");  
  34.         adDomain3.setTopicFrom("旭东");  
  35.         adDomain3.setTopic("“我想知道令狐安和令计划有什么关系?”");  
  36.         adDomain3  
  37.                 .setImgUrl("http://e.hiphotos.baidu.com/image/w%3D310/sign=392ce7f779899e51788e3c1572a6d990/8718367adab44aed22a58aeeb11c8701a08bfbd4.jpg");  
  38.         adDomain3.setAd(false);  
  39.         adList.add(adDomain3);  
  40.   
  41.         AdDomain adDomain4 = new AdDomain();  
  42.         adDomain4.setId("108078");  
  43.         adDomain4.setDate("3月7日");  
  44.         adDomain4.setTitle("我和令计划只是同姓");  
  45.         adDomain4.setTopicFrom("小软");  
  46.         adDomain4.setTopic("“我想知道令狐安和令计划有什么关系?”");  
  47.         adDomain4  
  48.                 .setImgUrl("http://d.hiphotos.baidu.com/image/w%3D310/sign=54884c82b78f8c54e3d3c32e0a282dee/a686c9177f3e670932e4cf9338c79f3df9dc55f2.jpg");  
  49.         adDomain4.setAd(false);  
  50.         adList.add(adDomain4);  
  51.   
  52.         AdDomain adDomain5 = new AdDomain();  
  53.         adDomain5.setId("108078");  
  54.         adDomain5.setDate("3月8日");  
  55.         adDomain5.setTitle("我和令计划只是同姓");  
  56.         adDomain5.setTopicFrom("大熊");  
  57.         adDomain5.setTopic("“我想知道令狐安和令计划有什么关系?”");  
  58.         adDomain5  
  59.                 .setImgUrl("http://e.hiphotos.baidu.com/image/w%3D310/sign=66270b4fe8c4b7453494b117fffd1e78/0bd162d9f2d3572c7dad11ba8913632762d0c30d.jpg");  
  60.         adDomain5.setAd(true); // 代表是广告  
  61.         adList.add(adDomain5);  
  62.   
  63.         return adList;  
  64.     }  


ViewPager逻辑处理

1. 填充数据(自定义Adapter)

2. 设置页面切换监听事件

3. 在自定义adapter中的instantiateItem方法设置ViewPager点击事件


这里我们的图片是从网上下载的,用到了universal-image-loader-1.8.6-with-sources.jar这个类库,可以实现异步加载图片,具体使用查看代码。



最后给出完整代码:

/BannerAutoScrollDemo/src/com/xiaowu/banner/demo/MainActivity.Java

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.xiaowu.banner.demo;  
  2.   
  3. import java.io.File;  
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6. import java.util.concurrent.Executors;  
  7. import java.util.concurrent.ScheduledExecutorService;  
  8. import java.util.concurrent.TimeUnit;  
  9.   
  10. import android.app.Activity;  
  11. import android.graphics.Bitmap;  
  12. import android.os.Bundle;  
  13. import android.os.Handler;  
  14. import android.os.Parcelable;  
  15. import android.support.v4.view.PagerAdapter;  
  16. import android.support.v4.view.ViewPager;  
  17. import android.support.v4.view.ViewPager.OnPageChangeListener;  
  18. import android.view.View;  
  19. import android.view.View.OnClickListener;  
  20. import android.view.ViewGroup;  
  21. import android.widget.ImageView;  
  22. import android.widget.ImageView.ScaleType;  
  23. import android.widget.TextView;  
  24.   
  25. import com.nostra13.universalimageloader.cache.disc.impl.UnlimitedDiscCache;  
  26. import com.nostra13.universalimageloader.cache.memory.impl.LruMemoryCache;  
  27. import com.nostra13.universalimageloader.core.DisplayImageOptions;  
  28. import com.nostra13.universalimageloader.core.ImageLoader;  
  29. import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;  
  30. import com.nostra13.universalimageloader.core.assist.ImageScaleType;  
  31. import com.nostra13.universalimageloader.core.assist.QueueProcessingType;  
  32.   
  33. public class MainActivity extends Activity {  
  34.       
  35.     public static String IMAGE_CACHE_PATH = "imageloader/Cache"// 图片缓存路径  
  36.   
  37.     private ViewPager adViewPager;  
  38.     private List<ImageView> imageViews;// 滑动的图片集合  
  39.   
  40.     private List<View> dots; // 图片标题正文的那些点  
  41.     private List<View> dotList;  
  42.   
  43.     private TextView tv_date;  
  44.     private TextView tv_title;  
  45.     private TextView tv_topic_from;  
  46.     private TextView tv_topic;  
  47.     private int currentItem = 0// 当前图片的索引号  
  48.     // 定义的五个指示点  
  49.     private View dot0;  
  50.     private View dot1;  
  51.     private View dot2;  
  52.     private View dot3;  
  53.     private View dot4;  
  54.   
  55.     // 定时任务  
  56.     private ScheduledExecutorService scheduledExecutorService;  
  57.   
  58.     // 异步加载图片  
  59.     private ImageLoader mImageLoader;  
  60.     private DisplayImageOptions options;  
  61.   
  62.     // 轮播banner的数据  
  63.     private List<AdDomain> adList;  
  64.   
  65.     private Handler handler = new Handler() {  
  66.         public void handleMessage(android.os.Message msg) {  
  67.             adViewPager.setCurrentItem(currentItem);  
  68.         };  
  69.     };  
  70.   
  71.     @Override  
  72.     protected void onCreate(Bundle savedInstanceState) {  
  73.         super.onCreate(savedInstanceState);  
  74.         setContentView(R.layout.activity_main);  
  75.         // 使用ImageLoader之前初始化  
  76.         initImageLoader();  
  77.   
  78.         // 获取图片加载实例  
  79.         mImageLoader = ImageLoader.getInstance();  
  80.         options = new DisplayImageOptions.Builder()  
  81.                 .showStubImage(R.drawable.top_banner_android)  
  82.                 .showImageForEmptyUri(R.drawable.top_banner_android)  
  83.                 .showImageOnFail(R.drawable.top_banner_android)  
  84.                 .cacheInMemory(true).cacheOnDisc(true)  
  85.                 .bitmapConfig(Bitmap.Config.RGB_565)  
  86.                 .imageScaleType(ImageScaleType.EXACTLY).build();  
  87.   
  88.         initAdData();  
  89.   
  90.         startAd();  
  91.     }  
  92.       
  93.     /** 
  94.      * 初始化ImageLoader 
  95.      */  
  96.     private void initImageLoader() {  
  97.         File cacheDir = com.nostra13.universalimageloader.utils.StorageUtils  
  98.                 .getOwnCacheDirectory(getApplicationContext(),  
  99.                         IMAGE_CACHE_PATH);  
  100.   
  101.         DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()  
  102.                 .cacheInMemory(true).cacheOnDisc(true).build();  
  103.   
  104.         ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(  
  105.                 this).defaultDisplayImageOptions(defaultOptions)  
  106.                 .memoryCache(new LruMemoryCache(12 * 1024 * 1024))  
  107.                 .memoryCacheSize(12 * 1024 * 1024)  
  108.                 .discCacheSize(32 * 1024 * 1024).discCacheFileCount(100)  
  109.                 .discCache(new UnlimitedDiscCache(cacheDir))  
  110.                 .threadPriority(Thread.NORM_PRIORITY - 2)  
  111.                 .tasksProcessingOrder(QueueProcessingType.LIFO).build();  
  112.   
  113.         ImageLoader.getInstance().init(config);  
  114.     }  
  115.   
  116.     /** 
  117.      * 初始化广告数据 
  118.      */  
  119.     private void initAdData() {  
  120.         // 广告数据  
  121.         adList = getBannerAd();  
  122.   
  123.         imageViews = new ArrayList<ImageView>();  
  124.   
  125.         // 点  
  126.         dots = new ArrayList<View>();  
  127.         dotList = new ArrayList<View>();  
  128.         dot0 = findViewById(R.id.v_dot0);  
  129.         dot1 = findViewById(R.id.v_dot1);  
  130.         dot2 = findViewById(R.id.v_dot2);  
  131.         dot3 = findViewById(R.id.v_dot3);  
  132.         dot4 = findViewById(R.id.v_dot4);  
  133.         dots.add(dot0);  
  134.         dots.add(dot1);  
  135.         dots.add(dot2);  
  136.         dots.add(dot3);  
  137.         dots.add(dot4);  
  138.           
  139.         tv_date = (TextView) findViewById(R.id.tv_date);  
  140.         tv_title = (TextView) findViewById(R.id.tv_title);  
  141.         tv_topic_from = (TextView) findViewById(R.id.tv_topic_from);  
  142.         tv_topic = (TextView) findViewById(R.id.tv_topic);  
  143.   
  144.         adViewPager = (ViewPager) findViewById(R.id.vp);  
  145.         adViewPager.setAdapter(new MyAdapter());// 设置填充ViewPager页面的适配器  
  146.         // 设置一个监听器,当ViewPager中的页面改变时调用  
  147.         adViewPager.setOnPageChangeListener(new MyPageChangeListener());  
  148.         addDynamicView();  
  149.     }  
  150.   
  151.     private void addDynamicView() {  
  152.         // 动态添加图片和下面指示的圆点  
  153.         // 初始化图片资源  
  154.         for (int i = 0; i < adList.size(); i++) {  
  155.             ImageView imageView = new ImageView(this);  
  156.             // 异步加载图片  
  157.             mImageLoader.displayImage(adList.get(i).getImgUrl(), imageView,  
  158.                     options);  
  159.             imageView.setScaleType(ScaleType.CENTER_CROP);  
  160.             imageViews.add(imageView);  
  161.             dots.get(i).setVisibility(View.VISIBLE);  
  162.             dotList.add(dots.get(i));  
  163.         }  
  164.     }  
  165.   
  166.     @Override  
  167.     protected void onResume() {  
  168.         super.onResume();  
  169.     }  
  170.   
  171.     private void startAd() {  
  172.         scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();  
  173.         // 当Activity显示出来后,每两秒切换一次图片显示  
  174.         scheduledExecutorService.scheduleAtFixedRate(new ScrollTask(), 12,  
  175.                 TimeUnit.SECONDS);  
  176.     }  
  177.   
  178.     private class ScrollTask implements Runnable {  
  179.   
  180.         @Override  
  181.         public void run() {  
  182.             synchronized (adViewPager) {  
  183.                 currentItem = (currentItem + 1) % imageViews.size();  
  184.                 handler.obtainMessage().sendToTarget();  
  185.             }  
  186.         }  
  187.     }  
  188.   
  189.     @Override  
  190.     protected void onStop() {  
  191.         super.onStop();  
  192.         // 当Activity不可见的时候停止切换  
  193.         scheduledExecutorService.shutdown();  
  194.     }  
  195.   
  196.     private class MyPageChangeListener implements OnPageChangeListener {  
  197.   
  198.         private int oldPosition = 0;  
  199.   
  200.         @Override  
  201.         public void onPageScrollStateChanged(int arg0) {  
  202.               
  203.         }  
  204.   
  205.         @Override  
  206.         public void onPageScrolled(int arg0, float arg1, int arg2) {  
  207.               
  208.         }  
  209.   
  210.         @Override  
  211.         public void onPageSelected(int position) {  
  212.             currentItem = position;  
  213.             AdDomain adDomain = adList.get(position);  
  214.             tv_title.setText(adDomain.getTitle()); // 设置标题  
  215.             tv_date.setText(adDomain.getDate());  
  216.             tv_topic_from.setText(adDomain.getTopicFrom());  
  217.             tv_topic.setText(adDomain.getTopic());  
  218.             dots.get(oldPosition).setBackgroundResource(R.drawable.dot_normal);  
  219.             dots.get(position).setBackgroundResource(R.drawable.dot_focused);  
  220.             oldPosition = position;  
  221.         }  
  222.     }  
  223.   
  224.     private class MyAdapter extends PagerAdapter {  
  225.   
  226.         @Override  
  227.         public int getCount() {  
  228.             return adList.size();  
  229.         }  
  230.   
  231.         @Override  
  232.         public Object instantiateItem(ViewGroup container, int position) {  
  233.             ImageView iv = imageViews.get(position);  
  234.             ((ViewPager) container).addView(iv);  
  235.             final AdDomain adDomain = adList.get(position);  
  236.             // 在这个方法里面设置图片的点击事件  
  237.             iv.setOnClickListener(new OnClickListener() {  
  238.   
  239.                 @Override  
  240.                 public void onClick(View v) {  
  241.                     // 处理跳转逻辑  
  242.                 }  
  243.             });  
  244.             return iv;  
  245.         }  
  246.   
  247.         @Override  
  248.         public void destroyItem(View arg0, int arg1, Object arg2) {  
  249.             ((ViewPager) arg0).removeView((View) arg2);  
  250.         }  
  251.   
  252.         @Override  
  253.         public boolean isViewFromObject(View arg0, Object arg1) {  
  254.             return arg0 == arg1;  
  255.         }  
  256.   
  257.         @Override  
  258.         public void restoreState(Parcelable arg0, ClassLoader arg1) {  
  259.   
  260.         }  
  261.   
  262.         @Override  
  263.         public Parcelable saveState() {  
  264.             return null;  
  265.         }  
  266.   
  267.         @Override  
  268.         public void startUpdate(View arg0) {  
  269.   
  270.         }  
  271.   
  272.         @Override  
  273.         public void finishUpdate(View arg0) {  
  274.   
  275.         }  
  276.   
  277.     }  
  278.   
  279.     /** 
  280.      * 轮播广播模拟数据 
  281.      *  
  282.      * @return 
  283.      */  
  284.     public static List<AdDomain> getBannerAd() {  
  285.         List<AdDomain> adList = new ArrayList<AdDomain>();  
  286.   
  287.         AdDomain adDomain = new AdDomain();  
  288.         adDomain.setId("108078");  
  289.         adDomain.setDate("3月4日");  
  290.         adDomain.setTitle("我和令计划只是同姓");  
  291.         adDomain.setTopicFrom("阿宅");  
  292.         adDomain.setTopic("我想知道令狐安和令计划有什么关系?");  
  293.         adDomain.setImgUrl("http://g.hiphotos.baidu.com/image/w%3D310/sign=bb99d6add2c8a786be2a4c0f5708c9c7/d50735fae6cd7b8900d74cd40c2442a7d9330e29.jpg");  
  294.         adDomain.setAd(false);  
  295.         adList.add(adDomain);  
  296.   
  297.         AdDomain adDomain2 = new AdDomain();  
  298.         adDomain2.setId("108078");  
  299.         adDomain2.setDate("3月5日");  
  300.         adDomain2.setTitle("我和令计划只是同姓");  
  301.         adDomain2.setTopicFrom("小巫");  
  302.         adDomain2.setTopic("“我想知道令狐安和令计划有什么关系?”");  
  303.         adDomain2  
  304.                 .setImgUrl("http://g.hiphotos.baidu.com/image/w%3D310/sign=7cbcd7da78f40ad115e4c1e2672e1151/eaf81a4c510fd9f9a1edb58b262dd42a2934a45e.jpg");  
  305.         adDomain2.setAd(false);  
  306.         adList.add(adDomain2);  
  307.   
  308.         AdDomain adDomain3 = new AdDomain();  
  309.         adDomain3.setId("108078");  
  310.         adDomain3.setDate("3月6日");  
  311.         adDomain3.setTitle("我和令计划只是同姓");  
  312.         adDomain3.setTopicFrom("旭东");  
  313.         adDomain3.setTopic("“我想知道令狐安和令计划有什么关系?”");  
  314.         adDomain3  
  315.                 .setImgUrl("http://e.hiphotos.baidu.com/image/w%3D310/sign=392ce7f779899e51788e3c1572a6d990/8718367adab44aed22a58aeeb11c8701a08bfbd4.jpg");  
  316.         adDomain3.setAd(false);  
  317.         adList.add(adDomain3);  
  318.   
  319.         AdDomain adDomain4 = new AdDomain();  
  320.         adDomain4.setId("108078");  
  321.         adDomain4.setDate("3月7日");  
  322.         adDomain4.setTitle("我和令计划只是同姓");  
  323.         adDomain4.setTopicFrom("小软");  
  324.         adDomain4.setTopic("“我想知道令狐安和令计划有什么关系?”");  
  325.         adDomain4  
  326.                 .setImgUrl("http://d.hiphotos.baidu.com/image/w%3D310/sign=54884c82b78f8c54e3d3c32e0a282dee/a686c9177f3e670932e4cf9338c79f3df9dc55f2.jpg");  
  327.         adDomain4.setAd(false);  
  328.         adList.add(adDomain4);  
  329.   
  330.         AdDomain adDomain5 = new AdDomain();  
  331.         adDomain5.setId("108078");  
  332.         adDomain5.setDate("3月8日");  
  333.         adDomain5.setTitle("我和令计划只是同姓");  
  334.         adDomain5.setTopicFrom("大熊");  
  335.         adDomain5.setTopic("“我想知道令狐安和令计划有什么关系?”");  
  336.         adDomain5  
  337.                 .setImgUrl("http://e.hiphotos.baidu.com/image/w%3D310/sign=66270b4fe8c4b7453494b117fffd1e78/0bd162d9f2d3572c7dad11ba8913632762d0c30d.jpg");  
  338.         adDomain5.setAd(true); // 代表是广告  
  339.         adList.add(adDomain5);  
  340.   
  341.         return adList;  
  342.     }  
  343.   
  344. }  
源码下载:http://download.csdn.net/detail/wwj_748/8498749
0 0