android图片轮播-阿里云开发者社区

开发者社区> 开发与运维> 正文
登录阅读全文

android图片轮播

简介:

第一步,先写布局文件


  1. <com.main.util.SlideShowView   
  2.                 android:id="@+id/slideshowView"  
  3.                 android:layout_width="fill_parent"  
  4.                 android:layout_height="300dp"  
  5.                 android:layout_centerHorizontal="true"  
  6.                 />  


第二步,java代码


  1. package com.main.util;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5. import java.util.concurrent.Executors;  
  6. import java.util.concurrent.ScheduledExecutorService;  
  7. import java.util.concurrent.TimeUnit;  
  8.   
  9. import com.main.R;  
  10.   
  11. import android.content.Context;  
  12. import android.graphics.drawable.Drawable;  
  13. import android.os.Handler;  
  14. import android.os.Message;  
  15. import android.os.Parcelable;  
  16. import android.support.v4.view.PagerAdapter;  
  17. import android.support.v4.view.ViewPager;  
  18. import android.support.v4.view.ViewPager.OnPageChangeListener;  
  19. import android.util.AttributeSet;  
  20. import android.view.LayoutInflater;  
  21. import android.view.View;  
  22. import android.widget.FrameLayout;  
  23. import android.widget.ImageView;  
  24. import android.widget.ImageView.ScaleType;  
  25.   
  26.   
  27. public class SlideShowView extends FrameLayout {  
  28.     //轮播图图片数量  
  29.     private final static int IMAGE_COUNT = 5;  
  30.     //自动轮播的时间间隔  
  31.     private final static int TIME_INTERVAL = 5;  
  32.     //自动轮播启用开关  
  33.     private final static boolean isAutoPlay = true;   
  34.       
  35.     //自定义轮播图的资源ID  
  36.     private int[] imagesResIds;  
  37.     //放轮播图片的ImageView 的list  
  38.     private List<ImageView> imageViewsList;  
  39.     //放圆点的View的list  
  40.     private List<View> dotViewsList;  
  41.       
  42.     private ViewPager viewPager;  
  43.     //当前轮播页  
  44.     private int currentItem  = 0;  
  45.     //定时任务  
  46.     private ScheduledExecutorService scheduledExecutorService;  
  47.     //Handler  
  48.     private Handler handler = new Handler(){  
  49.   
  50.         @Override  
  51.         public void handleMessage(Message msg) {  
  52.             // TODO Auto-generated method stub  
  53.             super.handleMessage(msg);  
  54.             viewPager.setCurrentItem(currentItem);  
  55.         }  
  56.           
  57.     };  
  58.       
  59.     public SlideShowView(Context context) {  
  60.         this(context,null);  
  61.         // TODO Auto-generated constructor stub  
  62.     }  
  63.     public SlideShowView(Context context, AttributeSet attrs) {  
  64.         this(context, attrs, 0);  
  65.         // TODO Auto-generated constructor stub  
  66.     }  
  67.     public SlideShowView(Context context, AttributeSet attrs, int defStyle) {  
  68.         super(context, attrs, defStyle);  
  69.         // TODO Auto-generated constructor stub  
  70.         initData();  
  71.         initUI(context);  
  72.         if(isAutoPlay){  
  73.             startPlay();  
  74.         }  
  75.           
  76.     }  
  77.     /** 
  78.      * 开始轮播图切换 
  79.      */  
  80.     private void startPlay(){  
  81.         scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();  
  82.         scheduledExecutorService.scheduleAtFixedRate(new SlideShowTask(), 14, TimeUnit.SECONDS);  
  83.     }  
  84.     /** 
  85.      * 停止轮播图切换 
  86.      */  
  87.     private void stopPlay(){  
  88.         scheduledExecutorService.shutdown();  
  89.     }  
  90.     /** 
  91.      * 初始化相关Data 
  92.      */  
  93.     private void initData(){  
  94.         imagesResIds = new int[]{//图片数据  
  95.                 R.drawable.p1,    
  96.                 R.drawable.p2,  
  97.         };  
  98.         imageViewsList = new ArrayList<ImageView>();  
  99.         dotViewsList = new ArrayList<View>();  
  100.           
  101.     }  
  102.     /** 
  103.      * 初始化Views等UI 
  104.      */  
  105.     private void initUI(Context context){  
  106.         LayoutInflater.from(context).inflate(R.layout.imageviewpager, thistrue);  
  107.         for(int imageID : imagesResIds){  
  108.             ImageView view =  new ImageView(context);  
  109.             view.setImageResource(imageID);  
  110.             view.setScaleType(ScaleType.FIT_XY);  
  111.             imageViewsList.add(view);  
  112.         }  
  113.         dotViewsList.add(findViewById(R.id.v_dot1));  
  114.         dotViewsList.add(findViewById(R.id.v_dot2));  
  115.           
  116.         viewPager = (ViewPager) findViewById(R.id.viewPager);  
  117.         viewPager.setFocusable(true);  
  118.           
  119.         viewPager.setAdapter(new MyPagerAdapter());  
  120.         viewPager.setOnPageChangeListener(new MyPageChangeListener());  
  121.     }  
  122.       
  123.     /** 
  124.      * 填充ViewPager的页面适配器 
  125.      * @author caizhiming 
  126.      */  
  127.     private class MyPagerAdapter  extends PagerAdapter{  
  128.   
  129.         @Override  
  130.         public void destroyItem(View container, int position, Object object) {  
  131.             // TODO Auto-generated method stub  
  132.             //((ViewPag.er)container).removeView((View)object);  
  133.             ((ViewPager)container).removeView(imageViewsList.get(position));  
  134.         }  
  135.   
  136.         @Override  
  137.         public Object instantiateItem(View container, int position) {  
  138.             // TODO Auto-generated method stub  
  139.             ((ViewPager)container).addView(imageViewsList.get(position));  
  140.             return imageViewsList.get(position);  
  141.         }  
  142.   
  143.         @Override  
  144.         public int getCount() {  
  145.             // TODO Auto-generated method stub  
  146.             return imageViewsList.size();  
  147.         }  
  148.   
  149.         @Override  
  150.         public boolean isViewFromObject(View arg0, Object arg1) {  
  151.             // TODO Auto-generated method stub  
  152.             return arg0 == arg1;  
  153.         }  
  154.         @Override  
  155.         public void restoreState(Parcelable arg0, ClassLoader arg1) {  
  156.             // TODO Auto-generated method stub  
  157.   
  158.         }  
  159.   
  160.         @Override  
  161.         public Parcelable saveState() {  
  162.             // TODO Auto-generated method stub  
  163.             return null;  
  164.         }  
  165.   
  166.         @Override  
  167.         public void startUpdate(View arg0) {  
  168.             // TODO Auto-generated method stub  
  169.   
  170.         }  
  171.   
  172.         @Override  
  173.         public void finishUpdate(View arg0) {  
  174.             // TODO Auto-generated method stub  
  175.               
  176.         }  
  177.           
  178.     }  
  179.     /** 
  180.      * ViewPager的监听器 
  181.      * 当ViewPager中页面的状态发生改变时调用 
  182.      * @author caizhiming 
  183.      */  
  184.     private class MyPageChangeListener implements OnPageChangeListener{  
  185.   
  186.         boolean isAutoPlay = false;  
  187.   
  188.         @Override  
  189.         public void onPageScrollStateChanged(int arg0) {  
  190.             // TODO Auto-generated method stub  
  191.             switch (arg0) {  
  192.             case 1:// 手势滑动,空闲中  
  193.                 isAutoPlay = false;  
  194.                 break;  
  195.             case 2:// 界面切换中  
  196.                 isAutoPlay = true;  
  197.                 break;  
  198.             case 0:// 滑动结束,即切换完毕或者加载完毕  
  199.                 // 当前为最后一张,此时从右向左滑,则切换到第一张  
  200.                 if (viewPager.getCurrentItem() == viewPager.getAdapter().getCount() - 1 && !isAutoPlay) {  
  201.                     viewPager.setCurrentItem(0);  
  202.                 }  
  203.                 // 当前为第一张,此时从左向右滑,则切换到最后一张  
  204.                 else if (viewPager.getCurrentItem() == 0 && !isAutoPlay) {  
  205.                     viewPager.setCurrentItem(viewPager.getAdapter().getCount() - 1);  
  206.                 }  
  207.                 break;  
  208.         }  
  209.         }  
  210.   
  211.         @Override  
  212.         public void onPageScrolled(int arg0, float arg1, int arg2) {  
  213.             // TODO Auto-generated method stub  
  214.               
  215.         }  
  216.   
  217.         @Override  
  218.         public void onPageSelected(int pos) {  
  219.             // TODO Auto-generated method stub  
  220.               
  221.             currentItem = pos;  
  222.             for(int i=0;i < dotViewsList.size();i++){  
  223.                 if(i == pos){  
  224.                     ((View)dotViewsList.get(pos)).setBackgroundResource(R.drawable.dot_black);  
  225.                 }else {  
  226.                     ((View)dotViewsList.get(i)).setBackgroundResource(R.drawable.dot_white);  
  227.                 }  
  228.             }  
  229.         }  
  230.           
  231.     }  
  232.       
  233.     /** 
  234.      *执行轮播图切换任务 
  235.      *@author caizhiming 
  236.      */  
  237.     private class SlideShowTask implements Runnable{  
  238.   
  239.         @Override  
  240.         public void run() {  
  241.             // TODO Auto-generated method stub  
  242.             synchronized (viewPager) {  
  243.                 currentItem = (currentItem+1)%imageViewsList.size();  
  244.                 handler.obtainMessage().sendToTarget();  
  245.             }  
  246.         }  
  247.           
  248.     }  
  249.     /** 
  250.      * 销毁ImageView资源,回收内存 
  251.      * @author caizhiming 
  252.      */  
  253.     private void destoryBitmaps() {  
  254.   
  255.         for (int i = 0; i < IMAGE_COUNT; i++) {  
  256.             ImageView imageView = imageViewsList.get(i);  
  257.             Drawable drawable = imageView.getDrawable();  
  258.             if (drawable != null) {  
  259.                 //解除drawable对view的引用  
  260.                 drawable.setCallback(null);  
  261.             }  
  262.         }  
  263.     }  
  264.   
  265. }  

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章
最新文章
相关文章