效果图:
   
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent">    <android.support.v4.view.ViewPager        android:id="@+id/viewPager"        android:layout_width="match_parent"        android:layout_height="360dp">    android.support.v4.view.ViewPager>    <LinearLayout        android:layout_width="match_parent"        android:layout_height="35dp"        android:orientation="vertical"        android:layout_marginTop="15dp"        android:padding="5dp">        <LinearLayout            android:id="@+id/dot_layout"            android:layout_width="200dp"            android:layout_height="15dp"            android:layout_marginTop="5dp"            android:layout_gravity="center"            android:orientation="horizontal"            >            <GridView                android:layout_width="match_parent"                android:layout_height="match_parent"                android:id="@+id/gv_vampire"                android:gravity="center"                android:stretchMode="columnWidth"/>        LinearLayout>    LinearLayout>
   
   
   
/** * Created by chenyang on 16/9/21. * * 轮播图封装类 , 解析viewpager图片用的Glide * compile 'com.github.bumptech.glide:glide:3.5.2' * 在onstart 和 ondestroy 分别调用startCarouselView,destroyCarouselView * 得到PicUrls , 然后start */public class CarouselView extends LinearLayout {    private Context context;    private ViewPager viewPager;    private LinearLayout dotLayout;    private List dotList;   //指示点    // 点的集合 (需要传入的1)    private int[] points = {R.mipmap.lingxingshenhui,R.mipmap.lingxingqianhui};    // 轮播图 图片集合    private List picUrls ;    private GridView gridView;    private GridViewAdapter gridViewAdapter;    private int viewPagerSize;    public void setPicUrls(List picUrls){        this.picUrls = picUrls;    }    public void setContext(Context context) {        this.context = context;    }    Handler handler = new Handler(new Handler.Callback() {        @Override        public boolean handleMessage(Message msg) {            viewPager.setCurrentItem(viewPager.getCurrentItem() + 1);            List finalyList = new ArrayList<>();            for (int i = 0; i < picUrls.size(); i++) {                if (i == viewPager.getCurrentItem() % picUrls.size()) {                    finalyList.add(points[1]);                } else {                    finalyList.add(points[0]);                }            }            gridViewAdapter.setList(finalyList);            Message m = new Message();            m.what = 1;            handler.sendMessageDelayed(m, 4000);            return false;        }    });    public void startCarouselView() {        Message message = handler.obtainMessage();        message.what = 1;        handler.sendMessageDelayed(message, 4000);    }    public void destroyCarouselView() {        handler.removeMessages(1);    }    public CarouselView(Context context) {        this(context, null);    }    public CarouselView(Context context, AttributeSet attrs) {        super(context, attrs);        this.context = context;        init();    }    private void init() {        LayoutInflater.from(context).inflate(R.layout.carousel_layout, this, true);        initView();        initData();    }    private void initData() {        dotList = new ArrayList<>();    }    private void initView() {        viewPager = (ViewPager) findViewById(R.id.viewPager);        dotLayout = (LinearLayout) findViewById(R.id.dot_layout);        gridView = (GridView) findViewById(R.id.gv_vampire);        // 轮播图表示点视图        gridViewAdapter = new GridViewAdapter(context);    }    public void start(final List picUrls) {        this.picUrls = picUrls;        if (this.picUrls == null || this.picUrls.size() < 1) {            return;        }        View view = null;        final List integers = new ArrayList<>();        //根据轮播图要显示的数量来创建指示点的个数        for (int i = 0; i < this.picUrls.size(); i++) {            view = new View(context);            if (i == 0) {                integers.add(points[1]);            } else {                integers.add(points[0]);            }            dotList.add(view);  //加入到list集合中            dotLayout.addView(view);  //加入父布局        }        gridView.setNumColumns(this.picUrls.size());        gridView.setAdapter(gridViewAdapter);        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {            @Override            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {            }            @Override            public void onPageSelected(int position) {            }            @Override            public void onPageScrollStateChanged(int state) {                List finalyList = new ArrayList<>();                for (int i = 0; i < integers.size(); i++) {                    viewPagerSize = viewPager.getCurrentItem() % integers.size();                    if (i == viewPagerSize) {                        finalyList.add(points[1]);                    } else {                        finalyList.add(points[0]);                    }                }                gridViewAdapter.setList(finalyList);                switch (state) {                    case ViewPager.SCROLL_STATE_DRAGGING ://当手按上去的时候 , remove掉handler                        handler.removeCallbacksAndMessages(null);                        break;                    case ViewPager.SCROLL_STATE_IDLE://当手按上去的时候 , remove掉handler,在开始轮播                        handler.removeCallbacksAndMessages(null);                        startCarouselView();                        break;                    case ViewPager.SCROLL_STATE_SETTLING:                        break;                    default:                        break;                }            }        });        gridViewAdapter.setList(integers);//        viewPager.setPageMargin(100);//两个页面之间的间距        viewPager.setAdapter(new MyPagerAdapter());        viewPager.setCurrentItem(3000, false);        viewPager.setPageTransformer(true , new MyPageTransformer());    }    class MyPagerAdapter extends PagerAdapter {        @Override        public int getCount() {            return Integer.MAX_VALUE;        }        @Override        public boolean isViewFromObject(View view, Object object) {            return view == object;        }        @Override        public Object instantiateItem(ViewGroup container, final int position) {            final String pic = picUrls.get(position % picUrls.size());            ImageView imageView = new ImageView(context);            Glide.with(context)                    .load(pic)                    .into(imageView);            imageView.setScaleType(ImageView.ScaleType.FIT_XY);            container.addView(imageView);            imageView.setOnClickListener(new OnClickListener() {                @Override                public void onClick(View view) {//                    clickCallback.onClick(0, position);                }            });            return imageView;        }        @Override        public void destroyItem(ViewGroup container, int position, Object object) {            container.removeView((View) object);        }    }    ClickCallback clickCallback;
    interface ClickCallback {        void onClick(int id, int position);    }
    public void setClickCallback(ClickCallback clickCallback) {        this.clickCallback = clickCallback;    }
   
   
/** * Created by chenyang on 16/9/21. * GridView , 用来显示轮播图的点 */public class GridViewAdapter extends BaseAdapter {    private Context context;    private List list;    private MyViewHolder myViewHolder;    public GridViewAdapter(Context context) {        this.context = context;    }    @Override    public int getCount() {        int count =list != null ? list.size() : 0;        return count;    }    public void setList(List list) {        this.list = list;        notifyDataSetChanged();    }    @Override    public Object getItem(int position) {        if (myViewHolder !=null){            return myViewHolder.imageView;        }        return null;    }    @Override    public long getItemId(int position) {        return position;    }    @Override    public View getView(int position, View convertView, ViewGroup parent) {        if (convertView == null) {            convertView = LayoutInflater.from(context).inflate(R.layout.carousel_point,parent,false);            myViewHolder = new MyViewHolder(convertView);            convertView.setTag(myViewHolder);        } else {            myViewHolder = (MyViewHolder) convertView.getTag();        }        myViewHolder.imageView.setImageResource(list.get(position));        return convertView;    }    private class MyViewHolder {        private ImageView imageView;        public MyViewHolder(View view) {            imageView = (ImageView) view.findViewById(R.id.iv_vampire);        }    }}
   
   
/** * Created by chenyang on 16/9/23. * viewpager 立方体切换效果 */public class MyPageTransformer implements ViewPager.PageTransformer {    public void transformPage(View view, float position) {        //左边0~-90度,右边90~0度,        //左边x 0~-width,右边x width~0;        if (position < -1) {        } else if (position <= 1) // a页滑动至b页 ; a页从 0.0 ~ -1 ;b页从1 ~ 0.0        { // [-1,1]            if (position < 0)//滑动中左边页面            {                view.setPivotX(view.getMeasuredWidth());                view.setRotationY(position * 45);            } else//滑动中右边页面            {                view.setPivotX(0);                view.setRotationY(position * 45);            }        } else { // (1,+Infinity]        }    }}
   
/** * Created by chenyang on 16/9/23. * viewpager 放大缩小切换效果
 */public class ZoomOutPageTransformer implements ViewPager.PageTransformer {    private static final float MIN_SCALE = 0.85f;    private static final float MIN_ALPHA = 0.5f;    @SuppressLint("NewApi")    public void transformPage(View view, float position){        int pageWidth = view.getWidth();        int pageHeight = view.getHeight();        if (position < -1)        { // [-Infinity,-1)            // This page is way off-screen to the left.            view.setAlpha(0);        } else if (position <= 1) //a页滑动至b页 ; a页从 0.0 -1 ;b页从1 ~ 0.0        { // [-1,1]            // Modify the default slide transition to shrink the page as well            float scaleFactor = Math.max(MIN_SCALE, 1 - Math.abs(position));            float vertMargin = pageHeight * (1 - scaleFactor) / 2;            float horzMargin = pageWidth * (1 - scaleFactor) / 2;            if (position < 0)            {                view.setTranslationX(horzMargin - vertMargin / 2);            } else            {                view.setTranslationX(-horzMargin + vertMargin / 2);            }            // Scale the page down (between MIN_SCALE and 1)            view.setScaleX(scaleFactor);            view.setScaleY(scaleFactor);            // Fade the page relative to its size.            view.setAlpha(MIN_ALPHA + (scaleFactor - MIN_SCALE)                    / (1 - MIN_SCALE) * (1 - MIN_ALPHA));        } else        { // (1,+Infinity]            // This page is way off-screen to the right.            view.setAlpha(0);        }    }}

   
/** * Created by chenyang on 16/9/22. * viewpager 前后深浅不同切换动画 */public class DepthPageTransformer implements ViewPager.PageTransformer {    private static final float MIN_SCALE = 0.75f;    public void transformPage(View view, float position) {        int pageWidth = view.getWidth();        if (position < -1) { // [-Infinity,-1)            // This page is way off-screen to the left.            view.setAlpha(0);        } else if (position <= 0) { // [-1,0]            // Use the default slide transition when moving to the left page            view.setAlpha(1);            view.setTranslationX(0);            view.setScaleX(1);            view.setScaleY(1);        } else if (position <= 1) { // (0,1]            // Fade the page out.            view.setAlpha(1 - position);            // Counteract the default slide transition            view.setTranslationX(pageWidth * -position);            // Scale the page down (between MIN_SCALE and 1)            float scaleFactor = MIN_SCALE                    + (1 - MIN_SCALE) * (1 - Math.abs(position));            view.setScaleX(scaleFactor);            view.setScaleY(scaleFactor);        } else { // (1,+Infinity]            // This page is way off-screen to the right.            view.setAlpha(0);        }    }}
//在activity或fragment中
   
private CarouselView carouselView;
   
//轮播图开始@Overrideprotected void onStart() {    super.onStart();    carouselView.startCarouselView();}//轮播图结束@Overrideprotected void onDestroy() {    super.onDestroy();    carouselView.destroyCarouselView();}
   
carouselView = bindView(R.id.viewpager_fragment_designers_recommend_items);carouselView.setContext(getApplicationContext());
   
//在网络解析的位置 : 从相应的Bean中得到图片 开始viewPager轮播carouselView.setPicUrls(designersRecommendItemBean.getData().getIntroduce_images());carouselView.start(designersRecommendItemBean.getData().getIntroduce_images());





更多相关文章

  1. 安全新手入坑——HTML标签
  2. Nginx系列教程(四)| 一文带你读懂Nginx的动静分离
  3. Hello Android(安卓)- Bitmap转换为黑白的灰度图和加圆角效果
  4. 【Android(安卓)开发教程】Gallery和ImageView
  5. Android(安卓)Bitmap 缩放 旋转 水印 裁剪操作
  6. Android(安卓)批量上传sd卡图片
  7. android 根据图片路径获取图片缩略图
  8. Android(安卓)LruCache内存缓存图片
  9. Android的各种Toast .

随机推荐

  1. [置顶] 成功为Android系统配上了GNU开发
  2. Android高手进阶教程(二十三)之---Androi
  3. Android之替换APP字体——Typeface
  4. Android中Bitmap类getPixel方法获取的像
  5. mac 系统下android源码下载以及使用(总结)
  6. Android的View体系(三):View坐标以及方法说
  7. Android(安卓)P HIDL服务绑定模式与直通
  8. Android使用Thread的interrupt与sleep,重
  9. Android(安卓)Building System 总结
  10. 想抢先体验Android操作系统的魅力吗?那就