美文网首页实践
android 轮播图(自定义组合控件)

android 轮播图(自定义组合控件)

作者: truemi | 来源:发表于2018-01-20 11:16 被阅读0次

    SlideShowView

    github:turemi/SlideShow
    自动轮播图控件,自动添加小圆点指示器,标题栏展示,修改滚动速度以及添加动画插值器.

    使用:

    • 添加依赖
      1.项目gradle添加一下配置:

        allprojects {
            repositories {
            ...
            maven { url 'https://jitpack.io' }
            }
        }
      

      2.module中的gradle添加依赖:

        dependencies {
            implementation 'com.github.truemi:SlideShow:1.0'
        } 
      
    • xml中添加view:

        <com.truemi.slideshow.SlideShowView
            android:id="@+id/slide_show"
            android:layout_width="match_parent"
            android:layout_height="200dp"
            app:mDotRaduis="8px"//小圆点半径
            app:mDotNormalColor="#999999"//小圆点默认颜色
            app:mDotSelectColor="#FF0000"//小圆点选中的颜色
            app:mDotlocation="bottom_right"//小圆点显示的位置
            app:mAutoStandTime="5000"//每个界面停留的时间间隔
            app:mBottomTextView="true"//是否显示底部标题栏
            app:mDotNavigation="true"//是否显示小圆点
            app:mTextColor="#FFF"//标题栏文字颜色
            app:mTextSize="12sp"//标题栏文字大小
            app:mTextBgColor ="#44000000"//标题栏背景颜色
            app:mBottomTextViewHeight="40dp">//标题栏高度
        </com.truemi.slideshow.SlideShowView>
      
    • activity中设置数据:

        //图片集合
        ArrayList<String> urlLists = new ArrayList<>();
        urlLists.add("https://img03.sogoucdn.com/app/a/100520024/c25c07885f822d67c91256b3033749e7");
        urlLists.add("https://img04.sogoucdn.com/app/a/100520024/ee6b8a48e6322e18a85a62ddcb01f432");
        urlLists.add("https://img01.sogoucdn.com/app/a/100520024/ebb532d5da0e26e285ac2dc025bc99ec");
        urlLists.add("https://img01.sogoucdn.com/app/a/100520024/83922cd9e4aaf9b4c012f08629a5e160");
        //标题栏文字集合
        String titles[] ={" 足球 ","设计 时尚"," 风华绝代 一代巨星张国荣","发现时光的痕迹"};
        final SlideShowView slideShow = findViewById(R.id.slide_show);
        //设置adapter,构造方法还可以传入图片资源id数组
        slideShow.setAdapter(new SlideAdapter(this,urlLists,titles));
        //图片点击事件
        slideShow.setOnItemClickListener(new SlideShowView.OnViewPagerItemClickListener() {
            @Override
            public void onViewPagerItemClick(int position) {
                Toast.makeText(MainActivity.this,"点击了第"+position+"张图片", Toast.LENGTH_SHORT).show();
            }
        }); 
      

    自定义属性:

    属性 描述
    mDotNavigation true/false 是否显示小圆点(默认显示)
    mBottomTextView true/false 是否显示底部标题栏(默认显示)
    mDotRaduis 2dp 小圆点半径
    mDotNormalColor #999999 小圆点默认颜色
    mDotSelectColor #FF0000 小圆点选中的颜色(当前显示的)
    mDotlocation bottom_center 小圆点显示的位置(默认bottom_right)
    mDuration 500 页面切换时间
    mAutoStandTime 5000 页面停留时间
    mBottomTextViewHeight 40dp 标题栏高度
    mTextSize 12sp 标题栏文字大小
    mTextColor #FFFFFF 标题栏文字颜色
    mTextBgColor #44000000 标题栏背景颜色

    公开方法:

    • setAdapter(SlideAdapter adapter);//设置adapter
    • setDuration(int mDuration, Interpolator interpolator);//设置界面切换时间和动画插值器
    • setPageTransformer(boolean b, ViewPager.PageTransformer transformer);//设置切换动画
    • setOnItemClickListener;//设置点击事件
    • setBottomTextBg(int color);//设置标题栏背景颜色
    • setBottomTextColor(int color);//设置标题栏文字颜色
    • setBottomTextSize(int size);//设置标题栏文字大小

    注意:

    • 库中使用glide作为图片加载框架,如果你的项目中已经使用glide,直接删除你项目中的依赖即可
    • 使用前请在androidManifest.xml中添加网络权限
    android自定义组合控件(使用原生控件,组合成为一个整体,具有新的功能的控件)是android自定义控件的重要组成部分.适当的组合控件,可以提高开发的效率.
    需求:
    1. 轮播图自动滚动
      2.手势滑动与自动轮播不冲突,手指触摸时,不轮播(触摸事件的处理)
      3.提供对外的点击事件监听(点击动作的识别)
      4.根据轮播图得数量绘制"小红点",可以设置"小红点"的位置(代码布局),"小红点"的颜色随页面切换变化
      5.极简的使用方法
    思路:

    1.轮播图使用RelativeLayout中添加ViewPager的布局形式,(使用RelativeLayout作为容器,是为了添加指示器"小红点")
    2.指示器"小红点"使用自定义View,根据传入的图片/链接的数量绘制指示器.
    3.把指示器放入指定的位置

    步骤:看代码读注释(注释比较详细)
    1.指示器"小红点"的绘制:

    创建一个类,继承View,提供一个公开的方法获取小红点的数量

    public DotView setDotCount(int count) {
          dotCount = count;
          return this;
      }
    

    提供一个公开的方法刷新小红点的状态

     public DotView changePager(int pager) {
            this.selectedPager = pager;//当前界面展示的图片的角标(第几张图片)
            postInvalidate();//重新绘制
            return this;
        }
    

    onMeasure方法中计算宽高

     @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            for (int i = 0; i < dotCount; i++) {
                viewWidth = i * MARGING + RADUIS;
            }
           int viewHeight = RADUIS*2;//一个小红点的高度
            setMeasuredDimension(viewWidth+RADUIS, viewHeight);//从0开始遍历,加上缺少的半径为View的宽度
        }
    

    绘制小红点

    private void drawCricle(Canvas canvas) {
    
            for (int i = 0; i < dotCount; i++) {
                if (selectedPager == i) {//当前界面展示图片
                    paint.setColor(dotSelectColor);//设置界面指示的小红点的颜色
                } else {
                    paint.setColor(dotNormalColor);//设置其他小红点的颜色
                }
                //MARGING两个圆心之间的距离,RADUIS半径
                canvas.drawCircle((i) * MARGING + RADUIS, RADUIS, RADUIS, paint);//绘制
            }
        }
    

    "小红点"完整代码

    public class DotView extends View {
        private int RADUIS;
        private int MARGING;
        private int dotCount;
        private Paint paint;
        private int dotNormalColor;
        private int dotSelectColor;
        private int selectedPager;
        Context context;
        private int viewWidth;
    
        public DotView(Context context) {
            this(context, null);
        }
    
        public DotView(Context context, @Nullable AttributeSet attrs) {
            this(context, attrs, -1);
        }
    
        public DotView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            this.context = context;
            paint = new Paint();
            paint.setColor(dotNormalColor);
            paint.setStyle(Paint.Style.FILL);
            paint.setAntiAlias(true);
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            drawCricle(canvas);
        }
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            for (int i = 0; i < dotCount; i++) {
                viewWidth = i * MARGING + RADUIS;
            }
           int viewHeight = RADUIS*2;
            setMeasuredDimension(viewWidth+RADUIS, viewHeight);
        }
    
        private void drawCricle(Canvas canvas) {
    
            for (int i = 0; i < dotCount; i++) {
                if (selectedPager == i) {
                    paint.setColor(dotSelectColor);
                } else {
                    paint.setColor(dotNormalColor);
                }
                canvas.drawCircle((i) * MARGING + RADUIS, RADUIS, RADUIS, paint);
            }
        }
    
        public DotView setRaduis(int raduis) {
            RADUIS = raduis;
            return this;
        }
    
        public DotView setMaring(int maring) {
            MARGING = maring;
            return this;
        }
    
        public DotView setDotCount(int count) {
            dotCount = count;
            return this;
        }
    
        public DotView setdotNormalColor(int color) {
            this.dotNormalColor = color;
            return this;
        }
    
        public DotView setdotSelectColor(int color) {
            this.dotSelectColor = color;
            return this;
        }
    
        public DotView  changePager(int pager) {
            this.selectedPager = pager;
            postInvalidate();
            return this;
        }
    }
    
    2.组合控件:

    创建个类SlideShowView 继承 RelativeLayout ,(ViewPager的一些公开的方法如果有需求,自己提供公开的方法即可).实现构造方法,自定义属性:

    <declare-styleable name="SlideShowView">
            <attr name="mDotRaduis" format="dimension"/> <!--小红点的半径-->
            <attr name="mDotNormalColor" format="color"/><!--小红点指示的颜色-->
            <attr name="mDotSelectColor" format="color"/><!--小红点不指示的颜色-->
            <attr name="mDotlocation" format="enum"><!--小红点的位置,底部居中,底部靠左,底部靠右-->
                <enum name="bottom_center" value="0" />
                <enum name="bottom_left" value="-1" />
                <enum name="bottom_right" value="1" />
            </attr>
     <!--页面切换时间-->
            <attr name="mDuration" format="integer"/>
            <!--自动切换界面停留时间-->
            <attr name="mAutoStandTime" format="integer"/>
            <attr name="mBottomTextViewHeight" format="dimension"/>
            <!--是否显示底部标题栏-->
            <attr name="mBottomTextView" format="boolean"/>
            <attr name="mTextSize" format="dimension"/>
            <attr name="mTextColor" format="color"/>
            <attr name="mTextBgColor" format="color"/>
        </declare-styleable>
    

    代码中获取属性值

     if (attrs != null) {
                TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.MyViewPager);
                RADUIS = (int) typedArray.getDimension(R.styleable.MyViewPager_mDotRaduis, 0);
                MARGING = 4 * RADUIS;//获取半径设置间距
                dotNormalColor = typedArray.getColor(R.styleable.MyViewPager_mDotNormalColor, 0);
                dotSelectColor = typedArray.getColor(R.styleable.MyViewPager_mDotSelectColor, 0);
                dotLocation = typedArray.getInt(R.styleable.MyViewPager_mDotlocation, 0);//位置
                typedArray.recycle();
            }
    

    添加viewPager到RelativeLayout中

     viewPager = new ViewPager(context);
            LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
            viewPager.setLayoutParams(layoutParams);
            viewPager.setOnPageChangeListener(this);
            viewPager.setOnTouchListener(this);
            addView(viewPager);
    

    通过Handler控制界面切换

     private int     itemPosition = 0;
        private Handler mHandler     = new Handler(new Handler.Callback() {
            @Override
            public boolean handleMessage(Message message) {
                mHandler.removeMessages(0);//消息清零
                if (!isTouch) {//判断手指是否触摸,没有触摸自动滚动,否则不发送消息
                    if (itemPosition == count) {//已经是最后一个,则跳到第0个,否则跳到下一个
                        itemPosition = 0;
                        viewPager.setCurrentItem(itemPosition, false);
                    } else {
                        itemPosition++;
                        viewPager.setCurrentItem(itemPosition, true);
                    }
                    mHandler.sendEmptyMessageDelayed(0, 2000);//延迟两秒发送消息
                }
                return false;
            }
        });
    

    通过viePager的监听,判断位置,绘制小红点的状态

     /**
         * 绘制小圆点
         * @param position
         */
        private void drawCricle(int position) {
            if (dot != null)
                removeView(dot);
            dot = new PagerPointDotView2(context);//创建小红点实例
            dot.setDotCount(count)//设置小红点数量
                    .setdotNormalColor(dotNormalColor)//默认颜色
                    .setdotSelectColor(dotSelectColor)//选中颜色
                    .setMaring(MARGING).setRaduis(RADUIS);//设置间距和半径
    //设置小红点的位置
            RelativeLayout.LayoutParams layoutParamsDot2 = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, RADUIS * 2);//设置宽高
            layoutParamsDot2.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);//位于父布局底部
            if (dotLocation == 0) {
                layoutParamsDot2.addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE);//水平居中
                layoutParamsDot2.setMargins(0, 0, 0, 20);//下边距20
            } else if (dotLocation == -1) {
                layoutParamsDot2.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);//父布局左对齐
                layoutParamsDot2.setMargins(30, 0, 0, 20);//左边距30,下边距20
            } else if (dotLocation == 1) {
                layoutParamsDot2.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);//父布局右对齐
                layoutParamsDot2.setMargins(0, 0, 30, 20);//左边距右边距,下边距20
            }
            dot.changePager(position);//绘制小红点
            addView(dot, layoutParamsDot2);//添加小红点的RelativeLayout中
        }
    

    点击事件处理,ViewConfiguration.get(context).getScaledEdgeSlop();获取滑动标识(使用识别是否右滑动动作的数值)

     case MotionEvent.ACTION_UP:
                    long touchUpTime = System.currentTimeMillis();
                    long l = touchUpTime - touchDownTime;
                    //触摸移动距离小于滑动识别距离,触摸时间小于200ms确认为点击事件
                    if (scaledEdgeSlop > (mCurPosY - mPosY) && scaledEdgeSlop > (mCurPosX - mPosX) && l < 200) {
                        clickListener.onViewPagerItemClick(viewPager.getCurrentItem());
                    }
                    isTouch = false;
                    mHandler.sendEmptyMessageDelayed(0, 2000);
                    break;
    

    完整代码如下:

    public class SlideShowView extends RelativeLayout implements ViewPager.OnPageChangeListener, View.OnTouchListener {
    
        private Context   context;
        private Paint     paint;
        private ViewPager viewPager;
        private int       RADUIS;//小圆点半径
        private int MARGING = 50;
        private int height;
        private int dotNormalColor = 0xFFFFFF;
        private int dotSelectColor = 0x000000;
        private PageChangeListener listener;
        private DotView            dot;
        private boolean            isTouch;//是否手势触摸
        private int                count;//轮播图数量
        private long               touchDownTime;
        private int                scaledEdgeSlop;
        private int                mPosX;
        private int                mPosY;
        private int                mCurPosX;
        private int                mCurPosY;
        private int                dotLocation;//小圆点的位置(-1,0,1),分别表示左边,居中,右边
        private float   bottomTextSize    = 12;//标题文字大小,sp
        private int     mTextBgColor = 0x44000000;//标题背景颜色
        private int     bottomTextColor   = 0x00e9e9e9;//标题文字颜色
        private int     mDuration         = 500;//滚动时间
        private int     mAutoStandTime    = 5000;//自动滚动停留时间
        private boolean haveBottomText    = true;//是否显示标题栏,默认显示
        private boolean mDotNavigation    = true;//是否显示小圆点,默认显示
        private TextView textView;//标题
        private int bottomTextHeight = 20;//dp,标题栏高度
        private String[]           titleText;//标题String数组
        private FixedSpeedScroller mScroller;
    
        public SlideShowView(Context context) {
            this(context, null);
        }
    
        public SlideShowView(Context context, AttributeSet attrs) {
            this(context, attrs, -1);
        }
    
        public SlideShowView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            this.context = context;
            init(attrs);
            scaledEdgeSlop = ViewConfiguration.get(context).getScaledEdgeSlop();
        }
    
        private void init(AttributeSet attrs) {
            if (attrs != null) {
                TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.SlideShowView);
                RADUIS = (int) typedArray.getDimension(R.styleable.SlideShowView_mDotRaduis, 0);
                MARGING = 4 * RADUIS;
                dotNormalColor = typedArray.getColor(R.styleable.SlideShowView_mDotNormalColor, 0);
                dotSelectColor = typedArray.getColor(R.styleable.SlideShowView_mDotSelectColor, 0);
                dotLocation = typedArray.getInt(R.styleable.SlideShowView_mDotlocation, 1);
                mDuration = typedArray.getInt(R.styleable.SlideShowView_mDuration, 500);
                mAutoStandTime = typedArray.getInt(R.styleable.SlideShowView_mAutoStandTime, 5000);
                bottomTextHeight = typedArray.getDimensionPixelOffset(R.styleable.SlideShowView_mBottomTextViewHeight, 20);
                mDotNavigation = typedArray.getBoolean(R.styleable.SlideShowView_mDotNavigation, true);
                haveBottomText = typedArray.getBoolean(R.styleable.SlideShowView_mDuration, true);
                bottomTextSize = typedArray.getDimension(R.styleable.SlideShowView_mTextSize, 12);//sp
                bottomTextColor = typedArray.getColor(R.styleable.SlideShowView_mTextColor, 0x00e9e9e9);
                mTextBgColor = typedArray.getColor(R.styleable.SlideShowView_mTextBgColor, 0x1d000000);
                typedArray.recycle();
    
            }
    
            paint = new Paint();
            paint.setColor(dotNormalColor);
            paint.setStyle(Paint.Style.FILL);
            paint.setAntiAlias(true);
    
            viewPager = new ViewPager(context);
            LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
            viewPager.setLayoutParams(layoutParams);
            viewPager.setOnPageChangeListener(this);
            viewPager.setOnTouchListener(this);
            addView(viewPager);
    
            if (mDotNavigation) {
                drawCricle(0);
            }
            initBottomTextView();
            setDuration(mDuration,new DecelerateInterpolator());
        }
    
        /**
         * 初始化底部标题栏
         */
        private void initBottomTextView() {
            if (dotLocation == -1 || dotLocation == 1 && haveBottomText) {
                textView = new TextView(context);
                textView.setBackgroundColor(mTextBgColor);
                textView.setTextColor(bottomTextColor);
                textView.setTextSize(Uiutils.px2sp(context,bottomTextSize));
                if (dotLocation == -1) {
                    textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.RIGHT);
                    textView.setPadding(0, 0, 20, 0);
                } else {
                    textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
                    textView.setPadding(20, 0, 0, 0);
                }
                Log.e("height","--------"+bottomTextHeight);
                LayoutParams layoutParamsText = new LayoutParams(LayoutParams.MATCH_PARENT, bottomTextHeight);
                layoutParamsText.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
                addView(textView, layoutParamsText);
            }
        }
    
        public void setAdapter(SlideAdapter adapter) {
    //        ArrayList<String> urlList = adapter.getpagerItemUrl();
    //        int[] imgList = adapter.getpagerItemImg();
    //        int[] imgs = new int[imgList.length+2];
    //        if (urlList!=null&&urlList.size()>0){
    //            String s = urlList.get(urlList.size() - 1);
    //            urlList.add(0,s);
    //            urlList.add(urlList.get(1));
    //            adapter.setUrlList(urlList);
    //        }
    //        if (imgList!=null&&imgList.length>0){
    //            int length = imgList.length;
    //            LogUtil.e(length+" 长度----------------------");
    //            imgs[0] =imgList[length-1];
    //            for (int i = 0; i < imgList.length; i++) {
    //                imgs[i+1] =imgList[i];
    //            }
    //            imgs[imgs.length-1] = imgList[0];
    //            adapter.setImgsList(imgs);
    //        }
            count = adapter.getImgCount();
            titleText = adapter.getTitleText();
            viewPager.setAdapter(adapter);
            viewPager.setCurrentItem(Integer.MAX_VALUE / 2);
            mHandler.sendEmptyMessageDelayed(0, mAutoStandTime);
        }
    
    
        public void setBottomTextBg(int color) {
            if (textView == null) return;
            this.textView.setBackgroundColor(color);
        }
    
        public void setBottomTextColor(int color) {
            if (textView == null) return;
            this.textView.setTextColor(color);
        }
    
        public void setBottomTextSize(int size) {
            if (textView == null) return;
            this.textView.setTextSize(Uiutils.dp2px(context, size));
        }
    
        /**
         * 设置动画时间
         * @param mDuration
         */
        public void  setDuration(int mDuration, Interpolator interpolator){
            this.mDuration =mDuration;
            try {
                // 通过class文件获取mScroller属性
                Field mField = ViewPager.class.getDeclaredField("mScroller");
                mField.setAccessible(true);
                mScroller = new FixedSpeedScroller(viewPager.getContext(), interpolator);
                mField.set(viewPager, mScroller);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    
        /**
         * 设置transformer
         *
         * @param b
         * @param transformer
         */
        public void setPageTransformer(boolean b, ViewPager.PageTransformer transformer) {
            if (viewPager != null) {
                viewPager.setPageTransformer(b, transformer);
            }
        }
    
        @Override
        public boolean onTouch(View view, MotionEvent motionEvent) {
            switch (motionEvent.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    touchDownTime = System.currentTimeMillis();
                    mPosX = (int) motionEvent.getX();
                    mPosY = (int) motionEvent.getY();
                case MotionEvent.ACTION_MOVE:
                    isTouch = true;
                    mCurPosX = (int) motionEvent.getX();
                    mCurPosY = (int) motionEvent.getY();
                    break;
                case MotionEvent.ACTION_UP:
                    long touchUpTime = System.currentTimeMillis();
                    long l = touchUpTime - touchDownTime;
                    //触摸移动距离小于滑动识别距离,触摸时间小于200ms确认为点击事件
                    if (scaledEdgeSlop > (mCurPosY - mPosY) && scaledEdgeSlop > (mCurPosX - mPosX) && l < 200) {
                        if (clickListener != null)
                            clickListener.onViewPagerItemClick(viewPager.getCurrentItem()%count);
                    }
                    isTouch = false;
                    //延时1秒,如果没有触摸就自动开始滚动
                    new Timer().schedule(new TimerTask() {
                        @Override
                        public void run() {
                            if (!isTouch) {
                                mHandler.sendEmptyMessageDelayed(0, mAutoStandTime - 1000);
                            }
                        }
                    }, 1000);
    
                    break;
            }
    
            return false;
        }
    
    
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            height = MeasureSpec.getSize(heightMeasureSpec);
        }
    
    
        private int     itemPosition = 0;
        private Handler mHandler     = new Handler(new Handler.Callback() {
            @Override
            public boolean handleMessage(Message message) {
                mHandler.removeMessages(0);
                if (!isTouch) {
    //                if (itemPosition == count-1) {
    //                    itemPosition = 1;
    //                    viewPager.setCurrentItem(itemPosition, false);
    //                    mHandler.sendEmptyMessageDelayed(0, 0);
    //                }else if (itemPosition==0){
    //                    itemPosition = count-1;
    //                    viewPager.setCurrentItem(itemPosition, false);
    //                    mHandler.sendEmptyMessageDelayed(0, 0);
    //                }else {
                    itemPosition++;
                    viewPager.setCurrentItem(itemPosition, true);
                    mHandler.sendEmptyMessageDelayed(0, mAutoStandTime);
    //                }
    
                }
                return false;
            }
        });
    
    
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    
            if (listener != null) {
                listener.onPageScrolled(position% count, positionOffset, positionOffsetPixels);
            }
    
    //        if (position == 0 && positionOffset == 0) viewPager .setCurrentItem(count - 1, false);
    //        else if (position == count - 1 && positionOffset == 0) viewPager .setCurrentItem(1, false);
        }
    
        @Override
        public void onPageSelected(int position) {
            if (listener != null)
                listener.onPageSelected(position% count);
            itemPosition = position;
            viewPager.setCurrentItem(position);
            mScroller.setmDuration(mDuration);//设置页面切换时间
            if (textView != null && titleText != null && titleText.length > 0) {
                textView.setText(titleText[position % count]);
            }
            drawCricle(position % count);
        }
    
        @Override
        public void onPageScrollStateChanged(int state) {
            if (listener != null)
                listener.onPageScrollStateChanged(state);
        }
    
        /**
         * 绘制小圆点
         *
         * @param position
         */
        private void drawCricle(int position) {
            if (dot != null)
                removeView(dot);
            dot = new DotView(context);
    
            dot.setDotCount(count)
                    .setdotNormalColor(dotNormalColor)
                    .setdotSelectColor(dotSelectColor)
                    .setMaring(MARGING).setRaduis(RADUIS);
            LayoutParams layoutParamsDot2 = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, RADUIS * 2);
    
            layoutParamsDot2.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
            if (dotLocation == 0) {
                layoutParamsDot2.addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE);
                layoutParamsDot2.setMargins(0, 0, 0, bottomTextHeight / 3);
            } else if (dotLocation == -1) {
                layoutParamsDot2.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
                layoutParamsDot2.setMargins(30, 0, 0, bottomTextHeight / 3);
            } else if (dotLocation == 1) {
                layoutParamsDot2.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);
                layoutParamsDot2.setMargins(0, 0, 30, bottomTextHeight / 3);
            }
            dot.changePager(position);
            addView(dot, layoutParamsDot2);
    
        }
    
    
        /**
         * 页面切换监听
         */
        public interface PageChangeListener {
            void onPageScrolled(int position, float positionOffset, int positionOffsetPixels);
    
            void onPageSelected(int position);
    
            void onPageScrollStateChanged(int state);
        }
    
        public void setOnPageChangeListener(PageChangeListener listener) {
            this.listener = listener;
        }
    
    
        /**
         * 页面点击监听
         */
        public interface OnViewPagerItemClickListener {
            void onViewPagerItemClick(int position);
        }
    
        private OnViewPagerItemClickListener clickListener;
    
        public void setOnItemClickListener(OnViewPagerItemClickListener clickListener) {
            this.clickListener = clickListener;
        }
    }
    
    

    相关文章

      网友评论

        本文标题:android 轮播图(自定义组合控件)

        本文链接:https://www.haomeiwen.com/subject/oossoxtx.html