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.Interpolator; import android.view.animation.LinearInterpolator; 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.List; /** * 带有小尖角的直线指示器 * 博客: http://hackware.lucode.net * Created by hackware on 2016/6/26. */ public class TriangularPagerIndicator extends View implements IPagerIndicator { private List<PositionData> mPositionDataList; private Paint mPaint; private int mLineHeight; private int mLineColor; private int mTriangleHeight; private int mTriangleWidth; private Path mPath = new Path(); private Interpolator mStartInterpolator = new LinearInterpolator(); private float mAnchorX; public TriangularPagerIndicator(Context context) { super(context); init(context); } private void init(Context context) { mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setStyle(Paint.Style.FILL); mLineHeight = UIUtil.dip2px(context, 3); mTriangleWidth = UIUtil.dip2px(context, 14); mTriangleHeight = UIUtil.dip2px(context, 8); } @Override protected void onDraw(Canvas canvas) { mPaint.setColor(mLineColor); canvas.drawRect(0, getHeight() - mLineHeight, getWidth(), getHeight(), mPaint); mPath.reset(); mPath.moveTo(mAnchorX - mTriangleWidth / 2, getHeight()); mPath.lineTo(mAnchorX, getHeight() - mTriangleHeight); mPath.lineTo(mAnchorX + mTriangleWidth / 2, getHeight()); mPath.close(); canvas.drawPath(mPath, mPaint); } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if (mPositionDataList == null || mPositionDataList.isEmpty()) { return; } // 计算锚点位置 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; mAnchorX = leftX + (rightX - leftX) * 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 int getLineHeight() { return mLineHeight; } public void setLineHeight(int lineHeight) { mLineHeight = lineHeight; } public int getLineColor() { return mLineColor; } public void setLineColor(int lineColor) { mLineColor = lineColor; } public int getTriangleHeight() { return mTriangleHeight; } public void setTriangleHeight(int triangleHeight) { mTriangleHeight = triangleHeight; } public int getTriangleWidth() { return mTriangleWidth; } public void setTriangleWidth(int triangleWidth) { mTriangleWidth = triangleWidth; } public Interpolator getStartInterpolator() { return mStartInterpolator; } public void setStartInterpolator(Interpolator startInterpolator) { mStartInterpolator = startInterpolator; if (mStartInterpolator == null) { mStartInterpolator = new LinearInterpolator(); } } }