利用android的ViewPage实现轮播图效果,ViewPager实现的轮播图广告自定义视图,既支持自动轮播页面也支持手势滑动切换页面。原理也不难,在代码有详细的解释。

一 样式布局文件

<?xml version="1.0" encoding="utf-8"?>                            




二 实现代码

package com.briup.domain;import java.util.ArrayList;import java.util.List;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit;import android.content.Context;import android.graphics.drawable.Drawable;import android.os.AsyncTask;import android.os.Handler;import android.os.Message;import android.os.Parcelable;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.support.v4.view.ViewPager.OnPageChangeListener;import android.util.AttributeSet;import android.view.LayoutInflater;import android.view.View;import android.widget.FrameLayout;import android.widget.ImageView;import android.widget.ImageView.ScaleType;import android.widget.LinearLayout;import com.briup.iqyuidemo.R;/*import com.nostra13.universalimageloader.cache.disc.naming.Md5FileNameGenerator;import com.nostra13.universalimageloader.core.ImageLoader;import com.nostra13.universalimageloader.core.ImageLoaderConfiguration;import com.nostra13.universalimageloader.core.assist.QueueProcessingType;*//** * ViewPager实现的轮播图广告自定义视图; * 既支持自动轮播页面也支持手势滑动切换页面 *  * */public class Sildepic extends FrameLayout {    //自动轮播的时间间隔    private final static int TIME = 5;    //自动轮播启用开关    private final static boolean isAutoPlay = true;     private int images[]={R.drawable.iv1,R.drawable.iv2,R.drawable.iv3,R.drawable.iv4,R.drawable.iv5};    //放轮播图片的ImageView 的list    private List imageViewsList;    //放圆点的View的list    private List dotViewsList;        private ViewPager viewPager;    //当前轮播页    private int currentItem  = 0;    //定时任务    private ScheduledExecutorService scheduledExecutorService;        private Context context;        //Handler    private Handler handler = new Handler(){        @Override        public void handleMessage(Message msg) {            // TODO Auto-generated method stub            super.handleMessage(msg);            viewPager.setCurrentItem(currentItem);        }            };        public SlideShowView(Context context) {        this(context,null);        // TODO Auto-generated constructor stub    }    public SlideShowView(Context context, AttributeSet attrs) {    //第一步        this(context, attrs, 0);        // TODO Auto-generated constructor stub    }    public SlideShowView(Context context, AttributeSet attrs, int defStyle) {        super(context, attrs, defStyle);//第二部        this.context = context;        initData();        if(isAutoPlay){            startPlay();        }            }    /**     * 开始轮播图切换     */    private void startPlay(){//第四部        scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();        scheduledExecutorService.scheduleAtFixedRate(new SlideShowTask(), 1, TIME, TimeUnit.SECONDS);    }    /**     * 停止轮播图切换     */    private void stopPlay(){        scheduledExecutorService.shutdown();    }    /**     * 初始化相关Data     */    private void initData(){//第三部        imageViewsList = new ArrayList();//存放图片        dotViewsList = new ArrayList();//存放点        initUI(context);//初始化轮播图    }    /**     * 初始化Views等UI     */    private void initUI(Context context){//第五步        LayoutInflater.from(context).inflate(R.layout.layout_slideshow, this, true);        LinearLayout dotLayout = (LinearLayout)findViewById(R.id.dotLayout);        dotLayout.removeAllViews();        // 热点个数与图片特殊相等        for (int i = 0; i < images.length; i++) {        //轮播图初始化        ImageView view =  new ImageView(context);        view.setBackgroundResource(images[i]);        view.setScaleType(ScaleType.FIT_XY);        imageViewsList.add(view);        //轮播图下边的点初始化        ImageView dotView =  new ImageView(context);        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);        params.leftMargin = 4;params.rightMargin = 4;dotLayout.addView(dotView, params);        dotViewsList.add(dotView);}                viewPager = (ViewPager) findViewById(R.id.viewPager);        viewPager.setFocusable(true);                viewPager.setAdapter(new MyPagerAdapter());        viewPager.setOnPageChangeListener(new MyPageChangeListener());    }        /**     * 填充ViewPager的页面适配器     *      */    private class MyPagerAdapter  extends PagerAdapter{        @Override        public void destroyItem(View container, int position, Object object) {            ((ViewPager)container).removeView(imageViewsList.get(position));        }        @Override        public Object instantiateItem(View container, int position) {        ImageView imageView = imageViewsList.get(position);            ((ViewPager)container).addView(imageViewsList.get(position));            return imageViewsList.get(position);        }        @Override        public int getCount() {            // TODO Auto-generated method stub            return imageViewsList.size();        }        @Override        public boolean isViewFromObject(View arg0, Object arg1) {            // TODO Auto-generated method stub            return arg0 == arg1;        }        @Override        public void restoreState(Parcelable arg0, ClassLoader arg1) {            // TODO Auto-generated method stub        }        @Override        public Parcelable saveState() {            // TODO Auto-generated method stub            return null;        }        @Override        public void startUpdate(View arg0) {            // TODO Auto-generated method stub        }        @Override        public void finishUpdate(View arg0) {            // TODO Auto-generated method stub                    }            }    /**     * ViewPager的监听器     * 当ViewPager中页面的状态发生改变时调用     *      */    private class MyPageChangeListener implements OnPageChangeListener{        boolean isAutoPlay = false;        @Override        public void onPageScrollStateChanged(int arg0) {            // TODO Auto-generated method stub            switch (arg0) {            case 1:// 手势滑动,空闲中                isAutoPlay = false;                break;            case 2:// 界面切换中                isAutoPlay = true;                break;            case 0:// 滑动结束,即切换完毕或者加载完毕                // 当前为最后一张,此时从右向左滑,则切换到第一张                if (viewPager.getCurrentItem() == viewPager.getAdapter().getCount() - 1 && !isAutoPlay) {                    viewPager.setCurrentItem(0);                }                // 当前为第一张,此时从左向右滑,则切换到最后一张                else if (viewPager.getCurrentItem() == 0 && !isAutoPlay) {                    viewPager.setCurrentItem(viewPager.getAdapter().getCount() - 1);                }                break;        }        }        @Override        public void onPageScrolled(int arg0, float arg1, int arg2) {            // TODO Auto-generated method stub                    }        @Override        public void onPageSelected(int pos) {            // TODO Auto-generated method stub                        currentItem = pos;            for(int i=0;i < dotViewsList.size();i++){                if(i == pos){                    ((View)dotViewsList.get(pos)).setBackgroundResource(R.drawable.dot_focus);                }else {                    ((View)dotViewsList.get(i)).setBackgroundResource(R.drawable.dot_blur);                }            }        }            }        /**     *执行轮播图切换任务     *     */    private class SlideShowTask implements Runnable{        @Override        public void run() {            // TODO Auto-generated method stub            synchronized (viewPager) {            //循环轮播                currentItem = (currentItem+1)%imageViewsList.size();                handler.obtainMessage().sendToTarget();            }        }            }        /**     * 销毁ImageView资源,回收内存     *      */    private void destoryBitmaps() {        for (int i = 0; i < images.length; i++) {            ImageView imageView = imageViewsList.get(i);            Drawable drawable = imageView.getDrawable();            if (drawable != null) {                //解除drawable对view的引用                drawable.setCallback(null);            }        }    }}
效果图

更多相关文章

  1. Android中实现整个视图切换的左右滑动效果
  2. Android:使用ViewPager实现左右滑动切换图片 (简单版)
  3. 再看Android(安卓)屏幕切换引起的生命周期变化
  4. Android(安卓)4.0 横竖屏切换注意事项
  5. 在Android中自动实现横竖屏切换的问题
  6. Android中如何取消或定制当点击GridView的时候出现的那个黄色背
  7. 对android的Activity切换时输入法不弹出来的解决办法
  8. 【阿里云镜像】切换阿里巴巴开源镜像站镜像——Fedora镜像
  9. 【阿里云镜像】切换阿里巴巴开源镜像站镜像——Debian镜像

随机推荐

  1. Oracle开启和关闭的四种模式
  2. MySQL并发更新数据时的处理方法
  3. 新手学习MySQL索引
  4. 由不同的索引更新解决MySQL死锁套路
  5. 通过唯一索引S锁与X锁来了解MySQL死锁套
  6. 初学者从源码理解MySQL死锁问题
  7. 细谈Mysql的存储过程和存储函数
  8. mysql 8.0.15 winx64解压版图文安装教程
  9. mysql 8.0.15 winx64压缩包安装配置方法
  10. 浅谈sql语句中GROUP BY 和 HAVING的使用