利用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);            }        }    }}
效果图 android简单实现轮播图效果_第1张图片

更多相关文章

  1. android 判断是否由adb调试进入页面 或直接跳转到开发者选项页面
  2. Android之设置页面(PreferenceActivity使用)
  3. Android 使用ViewStub 实现多状态页面切换基类
  4. h5页面点击按钮,触发手机自带的发短信
  5. Android页面跳转错误解决
  6. android kernel 初始化 2
  7. Android中利用Intent传递数据到另一个页面
  8. Android WebView 页面自适应
  9. Android 开发之webview页面返回到最顶关闭

随机推荐

  1. 设置 listview 滚动条样式
  2. android 开发实现静默安装
  3. android 自定义progressbar进度条颜色
  4. Andriod开发必备资料
  5. AndroidShortcuts
  6. Android中的Adapter
  7. Android之 系统启动流程
  8. Android(安卓)Material Design: Navigati
  9. [记录]Android虚拟机大屏幕设置
  10. 修改Android自带的JAVA应用程序