默认不选中第一个
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);
// }
// }
// }