为了账号安全,请及时绑定邮箱和手机立即绑定

默认不选中第一个

   private Paint mPaint;
   private Path mPath;
   private int mTriangleWidth;//三角形宽度
   private int mTriangleHeight;//三角形高度
   private static final float RADIO_TRIANG_WIDTH = 1 / 6F; //三角形与按钮的比例
   private int mInitTriangleX;//移动
   private int mTranslationX;//偏移位置
   private int mTabVisibleCount;
   private static final int COUNT_DEFAULT_TAB = 4;
   private static int COLOR_TEXT_SELECT = 0xFFFFFFFF;
   private static int COLOR_TEXT_NORMAL = 0x77FFFFFF;

   public List<String> mTitles;

   public interface PageChangeListener {

       void onPageScrolled(int position, float positionOffset, int positionOffsetPixels);

       void onPageSelected(int position);

       void onPageScrollStateChanged(int state);
   }


   public PageChangeListener mListener;

   public void setOnPageChangeListener(PageChangeListener listener) {
       mListener = listener;
   }

   /**
    * 设置可见tab的数量
    *
    * @param count
    */
   public void setVisibleTabCount(int count) {
       mTabVisibleCount = count;
   }

   public ViewPagerIndicator(Context context) {
       this(context, null);
   }

   public ViewPagerIndicator(Context context, @Nullable AttributeSet attrs) {
       super(context, attrs);

       TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.ViewPagerIndicator);
       mTabVisibleCount = array.getInt(R.styleable.ViewPagerIndicator_visible_tab_count, COUNT_DEFAULT_TAB);
       if (mTabVisibleCount < 0) {
           mTabVisibleCount = COUNT_DEFAULT_TAB;
       }
       array.recycle();

       mPaint = new Paint();
       mPaint.setAntiAlias(true);
       mPaint.setColor(Color.WHITE);
       mPaint.setStyle(Paint.Style.FILL);
       mPaint.setPathEffect(new CornerPathEffect(3));
   }


   @Override
   protected void dispatchDraw(Canvas canvas) {
       canvas.save();
       canvas.translate(mTranslationX + mInitTriangleX, getHeight() + 2);
       canvas.drawPath(mPath, mPaint);
       canvas.restore();
       super.dispatchDraw(canvas);
   }

   @Override
   protected void onSizeChanged(int w, int h, int oldw, int oldh) {
       super.onSizeChanged(w, h, oldw, oldh);
       mTriangleWidth = (int) (w / mTabVisibleCount * RADIO_TRIANG_WIDTH);
       mTranslationX = w / mTabVisibleCount / 2 - mTriangleWidth / 2;
       initTriangle();
   }

   /**
    * 画三角形
    */
   private void initTriangle() {
       mTriangleHeight = mTriangleWidth / 2;
       mPath = new Path();
       mPath.moveTo(0, 0);
       mPath.lineTo(mTriangleWidth, 0);
       mPath.lineTo(mTriangleWidth / 2, -mTriangleHeight);
       mPath.close();//闭合
   }

   /**
    * 指示器跟随手指移动
    *
    * @param position
    * @param positionOffset
    */
   public void scroll(int position, float positionOffset) {
       int width = getWidth() / mTabVisibleCount;
       mInitTriangleX = (int) (width * (position + positionOffset));

       //在tab移动到最后的时候
       if (position >= mTabVisibleCount - 2
               && positionOffset > 0
               && getChildCount() > mTabVisibleCount
               && position != (mTitles.size() - 2)) {
           if (mTabVisibleCount != 1) {
               this.scrollTo((int) ((position - (mTabVisibleCount - 2)) * width + width * positionOffset), 0);
           } else {
               this.scrollTo((int) (position * width + width * positionOffset), 0);
           }

       }

       invalidate();
   }

   @Override
   protected void onFinishInflate() {
       super.onFinishInflate();
       int cCount = getChildCount();
       if (cCount == 0)
           return;
       for (int i = 0; i < cCount; i++) {
           View view = getChildAt(i);
           LinearLayout.LayoutParams params = (LayoutParams) view.getLayoutParams();
           params.weight = 0;
           params.width = getScreeWidth() / mTabVisibleCount;
           view.setLayoutParams(params);
       }
   }

   /**
    * 获得屏幕的宽度
    *
    * @return
    */
   public int getScreeWidth() {
       WindowManager wm = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
       DisplayMetrics dp = new DisplayMetrics();
       wm.getDefaultDisplay().getMetrics(dp);
       return dp.widthPixels;
   }

   public void setTabItemTitles(List<String> titles) {
       if (titles != null && titles.size() > 0) {
           removeAllViews();
           mTitles = titles;
           for (String title : mTitles) {
               addView(generateTextView(title));
           }
       }
   }

   private View generateTextView(String title) {
       TextView tv = new TextView(getContext());
       LinearLayout.LayoutParams lp = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
       lp.width = getScreeWidth() / mTabVisibleCount;
       tv.setText(title);
       tv.setGravity(Gravity.CENTER);
       tv.setTextColor(COLOR_TEXT_NORMAL);
       tv.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);
       tv.setLayoutParams(lp);
       return tv;
   }

   private ViewPager mViewPager;

//    public void setViewViewPager(ViewPager viewViewPager, int pos) {
//        mViewPager = viewViewPager;
//
//        mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
//            @Override
//            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
//                scroll(position, positionOffset);
//                if (mListener != null) {
//                    mListener.onPageScrolled(position, positionOffset, positionOffsetPixels);
//                }
//            }
//
//            @Override
//            public void onPageSelected(int position) {
//                if (mListener != null) {
//                    mListener.onPageSelected(position);
//                }
//                highLightTextView(position);
//            }
//
//            @Override
//            public void onPageScrollStateChanged(int state) {
//                if (mListener != null) {
//                    mListener.onPageScrollStateChanged(state);
//                }
//            }
//        });
//        mViewPager.setCurrentItem(pos);
//        highLightTextView(pos);
//    }

   public void setViewViewPager(ViewPager viewpager, int position) {
       mViewPager = viewpager;
       mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

           @Override
           public void onPageSelected(int position) {
               if (mListener != null) {
                   mListener.onPageSelected(position);
               }
               highLightTextView(position);
           }

           @Override
           public void onPageScrolled(int position, float positionOffset,
                                      int positionOffsetPixels) {
               // 三角形跟随ViewPager移动的距离就是:
               // tabWidth*positionOffset+position*tabWidth
               scroll(position, positionOffset);

               if (mListener != null) {
                   mListener.onPageScrolled(position, positionOffset,
                           positionOffsetPixels);
               }
           }

           @Override
           public void onPageScrollStateChanged(int state) {
               if (mListener != null) {
                   mListener.onPageScrollStateChanged(state);
               }

           }
       });
       mViewPager.setCurrentItem(position);
       highLightTextView(position);
   }

   /**
    * 高亮被点击的tab
    * @param position
    */
   private void highLightTextView(int position){
       resetTextViewColor();
       View view = getChildAt(position);
       if (view instanceof TextView) {
           ((TextView) view).setTextColor(COLOR_TEXT_SELECT);
       }
   }
   /**
    * 重置tab文本颜色
    */
   private void resetTextViewColor(){
       for (int i = 0; i < getChildCount(); i++) {
           View view = getChildAt(i);
           if (view instanceof TextView) {
               ((TextView) view).setTextColor(COLOR_TEXT_NORMAL);
           }
       }
   }

//    /**
//     * 改变选中的颜色
//     *
//     * @param pos
//     */
//    private void highLightTextView(int pos) {
//        resetTextViewAll();
//        View view = getChildAt(pos);
//        if (view instanceof TextView) {
//            ((TextView) view).setTextColor(COLOR_TEXT_SELECT);
//        }
//    }
//
//    /**
//     * 未选中的颜色
//     */
//    private void resetTextViewAll() {
//        for (int i = 0; i < getChildCount(); i++) {
//            View view = getChildAt(i);
//            if (view instanceof TextView) {
//                ((TextView) view).setTextColor(COLOR_TEXT_NORMAL);
//            }
//        }
//    }

正在回答

举报

0/150
提交
取消
Android-自定义ViewPager指示器
  • 参与学习       30028    人
  • 解答问题       75    个

带领大家实现最火爆的跟随型指示器,学完保准压倒一片

进入课程

默认不选中第一个

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信