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.RectF; 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; /** * 包裹住内容区域的指示器,类似天天快报的切换效果,需要和IMeasurablePagerTitleView配合使用 * 博客: http://hackware.lucode.net * Created by hackware on 2016/6/26. */ public class WrapPagerIndicator extends View implements IPagerIndicator { private int mVerticalPadding; private int mHorizontalPadding; private int mFillColor; private float mRoundRadius; private Interpolator mStartInterpolator = new LinearInterpolator(); private Interpolator mEndInterpolator = new LinearInterpolator(); private List<PositionData> mPositionDataList; private Paint mPaint; private RectF mRect = new RectF(); private boolean mRoundRadiusSet; public WrapPagerIndicator(Context context) { super(context); init(context); } private void init(Context context) { mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setStyle(Paint.Style.FILL); mVerticalPadding = UIUtil.dip2px(context, 6); mHorizontalPadding = UIUtil.dip2px(context, 10); } @Override protected void onDraw(Canvas canvas) { mPaint.setColor(mFillColor); canvas.drawRoundRect(mRect, mRoundRadius, mRoundRadius, 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); mRect.left = current.mContentLeft - mHorizontalPadding + (next.mContentLeft - current.mContentLeft) * mEndInterpolator.getInterpolation(positionOffset); mRect.top = current.mContentTop - mVerticalPadding; mRect.right = current.mContentRight + mHorizontalPadding + (next.mContentRight - current.mContentRight) * mStartInterpolator.getInterpolation(positionOffset); mRect.bottom = current.mContentBottom + mVerticalPadding; if (!mRoundRadiusSet) { mRoundRadius = mRect.height() / 2; } invalidate(); } @Override public void onPageSelected(int position) { } @Override public void onPageScrollStateChanged(int state) { } @Override public void onPositionDataProvide(List<PositionData> dataList) { mPositionDataList = dataList; } public Paint getPaint() { return mPaint; } public int getVerticalPadding() { return mVerticalPadding; } public void setVerticalPadding(int verticalPadding) { mVerticalPadding = verticalPadding; } public int getHorizontalPadding() { return mHorizontalPadding; } public void setHorizontalPadding(int horizontalPadding) { mHorizontalPadding = horizontalPadding; } public int getFillColor() { return mFillColor; } public void setFillColor(int fillColor) { mFillColor = fillColor; } public float getRoundRadius() { return mRoundRadius; } public void setRoundRadius(float roundRadius) { mRoundRadius = roundRadius; mRoundRadiusSet = true; } public Interpolator getStartInterpolator() { return mStartInterpolator; } public void setStartInterpolator(Interpolator startInterpolator) { mStartInterpolator = startInterpolator; if (mStartInterpolator == null) { mStartInterpolator = new LinearInterpolator(); } } public Interpolator getEndInterpolator() { return mEndInterpolator; } public void setEndInterpolator(Interpolator endInterpolator) { mEndInterpolator = endInterpolator; if (mEndInterpolator == null) { mEndInterpolator = new LinearInterpolator(); } } }