android图片轮播

简介:

第一步,先写布局文件


[html]  view plain copy print ?
  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代码


[java]  view plain copy print ?
  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. }  
相关文章
|
6月前
|
Android开发
Android使用ViewPager实现图片轮播系列之三:手动滑动 + 左右箭头(1)
Android使用ViewPager实现图片轮播系列之三:手动滑动 + 左右箭头(1)
|
XML Java Android开发
Android开发案例 设置背景图片轮播
Android开发案例 设置背景图片轮播
194 0
Android开发案例 设置背景图片轮播
|
Android开发
Android--图片轮播(banner)
版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/chaoyu168/article/details/79017172 推荐第三方框架banner,地址:https://github.
1187 0
|
XML Android开发 数据格式
Android零基础入门第49节:AdapterViewFlipper图片轮播
原文:Android零基础入门第49节:AdapterViewFlipper图片轮播    上一期学习了ExpandableListView的使用,你已经掌握了吗?本期开始学习AdapterViewFilpper的使用。
1366 0
|
Android开发 开发者 容器
Android App图片轮播效果的组件化
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/voidreturn/article/details/75139689 简介 一个通用的图片轮播效果的通用组件,方便开发者快速集成。
1125 0
|
Android开发 容器
Android--自定义控件(图片轮播)
版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/chaoyu168/article/details/72329936 效果图: 方法一:原理就是利用定时任务器定时切换ViewPager的页面 import java.
1031 0
|
Android开发
Android 首页图片轮播
1、网络上的的一个框架,已经在github 上开源       github  :  https://github.com/gcgongchao/flashview      相关博客 : http://www.
923 0
|
2天前
|
编解码 Java Android开发
通义灵码:在安卓开发中提升工作效率的真实应用案例
本文介绍了通义灵码在安卓开发中的应用。作为一名97年的聋人开发者,我在2024年Google Gemma竞赛中获得了冠军,拿下了很多项目竞赛奖励,通义灵码成为我的得力助手。文章详细展示了如何安装通义灵码插件,并通过多个实例说明其在适配国际语言、多种分辨率、业务逻辑开发和编程语言转换等方面的应用,显著提高了开发效率和准确性。