package com.example.administrator.cookman.ui.component.magicindicator.buildins.commonnavigator.indicators; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Path; import android.view.View; import android.view.animation.AccelerateInterpolator; import android.view.animation.DecelerateInterpolator; import android.view.animation.Interpolator; import com.example.administrator.cookman.ui.component.magicindicator.buildins.ArgbEvaluatorHolder; import com.example.administrator.cookman.ui.component.magicindicator.buildins.UIUtil; import com.example.administrator.cookman.ui.component.magicindicator.buildins.commonnavigator.abs.IPagerIndicator; import com.example.administrator.cookman.ui.component.magicindicator.buildins.commonnavigator.model.PositionData; import java.util.Arrays; import java.util.List; /** * 贝塞尔曲线ViewPager指示器,带颜色渐变 * 博客: http://hackware.lucode.net * Created by hackware on 2016/6/26. */ public class BezierPagerIndicator extends View implements IPagerIndicator { private List<PositionData> mPositionDataList; private float mLeftCircleRadius; private float mLeftCircleX; private float mRightCircleRadius; private float mRightCircleX; private float mYOffset; private float mMaxCircleRadius; private float mMinCircleRadius; private Paint mPaint; private Path mPath = new Path(); private List<Integer> mColors; private Interpolator mStartInterpolator = new AccelerateInterpolator(); private Interpolator mEndInterpolator = new DecelerateInterpolator(); public BezierPagerIndicator(Context context) { super(context); init(context); } private void init(Context context) { mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setStyle(Paint.Style.FILL); mMaxCircleRadius = UIUtil.dip2px(context, 3.5); mMinCircleRadius = UIUtil.dip2px(context, 2); mYOffset = UIUtil.dip2px(context, 1.5); } @Override protected void onDraw(Canvas canvas) { canvas.drawCircle(mLeftCircleX, getHeight() - mYOffset - mMaxCircleRadius, mLeftCircleRadius, mPaint); canvas.drawCircle(mRightCircleX, getHeight() - mYOffset - mMaxCircleRadius, mRightCircleRadius, mPaint); drawBezierCurve(canvas); } /** * 绘制贝塞尔曲线 * * @param canvas */ private void drawBezierCurve(Canvas canvas) { mPath.reset(); float y = getHeight() - mYOffset - mMaxCircleRadius; mPath.moveTo(mRightCircleX, y); mPath.lineTo(mRightCircleX, y - mRightCircleRadius); mPath.quadTo(mRightCircleX + (mLeftCircleX - mRightCircleX) / 2.0f, y, mLeftCircleX, y - mLeftCircleRadius); mPath.lineTo(mLeftCircleX, y + mLeftCircleRadius); mPath.quadTo(mRightCircleX + (mLeftCircleX - mRightCircleX) / 2.0f, y, mRightCircleX, y + mRightCircleRadius); mPath.close(); // 闭合 canvas.drawPath(mPath, mPaint); } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if (mPositionDataList == null || mPositionDataList.isEmpty()) { return; } // 计算颜色 if (mColors != null && mColors.size() > 0) { int currentColor = mColors.get(position % mColors.size()); int nextColor = mColors.get((position + 1) % mColors.size()); int color = (Integer) ArgbEvaluatorHolder.eval(positionOffset, currentColor, nextColor); mPaint.setColor(color); } // 计算锚点位置 int currentPosition = Math.min(mPositionDataList.size() - 1, position); int nextPosition = Math.min(mPositionDataList.size() - 1, position + 1); PositionData current = mPositionDataList.get(currentPosition); PositionData next = mPositionDataList.get(nextPosition); float leftX = current.mLeft + (current.mRight - current.mLeft) / 2; float rightX = next.mLeft + (next.mRight - next.mLeft) / 2; mLeftCircleX = leftX + (rightX - leftX) * mStartInterpolator.getInterpolation(positionOffset); mRightCircleX = leftX + (rightX - leftX) * mEndInterpolator.getInterpolation(positionOffset); mLeftCircleRadius = mMaxCircleRadius + (mMinCircleRadius - mMaxCircleRadius) * mEndInterpolator.getInterpolation(positionOffset); mRightCircleRadius = mMinCircleRadius + (mMaxCircleRadius - mMinCircleRadius) * mStartInterpolator.getInterpolation(positionOffset); invalidate(); } @Override public void onPageSelected(int position) { } @Override public void onPageScrollStateChanged(int state) { } @Override public void onPositionDataProvide(List<PositionData> dataList) { mPositionDataList = dataList; } public float getMaxCircleRadius() { return mMaxCircleRadius; } public void setMaxCircleRadius(float maxCircleRadius) { mMaxCircleRadius = maxCircleRadius; } public float getMinCircleRadius() { return mMinCircleRadius; } public void setMinCircleRadius(float minCircleRadius) { mMinCircleRadius = minCircleRadius; } public float getYOffset() { return mYOffset; } public void setYOffset(float yOffset) { mYOffset = yOffset; } public void setColors(Integer... colors) { mColors = Arrays.asList(colors); } public void setStartInterpolator(Interpolator startInterpolator) { mStartInterpolator = startInterpolator; if (mStartInterpolator == null) { mStartInterpolator = new AccelerateInterpolator(); } } public void setEndInterpolator(Interpolator endInterpolator) { mEndInterpolator = endInterpolator; if (mEndInterpolator == null) { mEndInterpolator = new DecelerateInterpolator(); } } }