package com.example.administrator.cookman.ui.component.magicindicator.buildins.commonnavigator.titles; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Rect; import android.view.View; import com.example.administrator.cookman.ui.component.magicindicator.buildins.UIUtil; import com.example.administrator.cookman.ui.component.magicindicator.buildins.commonnavigator.abs.IPagerTitleView; /** * 类似今日头条切换效果的指示器标题 * 博客: http://hackware.lucode.net * Created by hackware on 2016/6/26. */ public class ClipPagerTitleView extends View implements IPagerTitleView { private String mText; private int mTextColor; private int mClipColor; private boolean mLeftToRight; private float mClipPercent; private Paint mPaint; private Rect mTextBounds = new Rect(); public ClipPagerTitleView(Context context) { super(context); init(context); } private void init(Context context) { int textSize = UIUtil.dip2px(context, 16); mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setTextSize(textSize); int padding = UIUtil.dip2px(context, 10); setPadding(padding, 0, padding, 0); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { measureTextBounds(); setMeasuredDimension(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec)); } private int measureWidth(int widthMeasureSpec) { int mode = MeasureSpec.getMode(widthMeasureSpec); int size = MeasureSpec.getSize(widthMeasureSpec); int result = size; switch (mode) { case MeasureSpec.AT_MOST: int width = mTextBounds.width() + getPaddingLeft() + getPaddingRight(); result = Math.min(width, size); break; case MeasureSpec.UNSPECIFIED: result = mTextBounds.width() + getPaddingLeft() + getPaddingRight(); break; default: break; } return result; } private int measureHeight(int heightMeasureSpec) { int mode = MeasureSpec.getMode(heightMeasureSpec); int size = MeasureSpec.getSize(heightMeasureSpec); int result = size; switch (mode) { case MeasureSpec.AT_MOST: int height = mTextBounds.height() + getPaddingTop() + getPaddingBottom(); result = Math.min(height, size); break; case MeasureSpec.UNSPECIFIED: result = mTextBounds.height() + getPaddingTop() + getPaddingBottom(); break; default: break; } return result; } @Override protected void onDraw(Canvas canvas) { int x = (getWidth() - mTextBounds.width()) / 2; int y = (getHeight() + mTextBounds.height()) / 2; // 画底层 mPaint.setColor(mTextColor); canvas.drawText(mText, x, y, mPaint); // 画clip层 canvas.save(Canvas.CLIP_SAVE_FLAG); if (mLeftToRight) { canvas.clipRect(0, 0, getWidth() * mClipPercent, getHeight()); } else { canvas.clipRect(getWidth() * (1 - mClipPercent), 0, getWidth(), getHeight()); } mPaint.setColor(mClipColor); canvas.drawText(mText, x, y, mPaint); canvas.restore(); } @Override public void onSelected(int index, int totalCount) { } @Override public void onDeselected(int index, int totalCount) { } @Override public void onLeave(int index, int totalCount, float leavePercent, boolean leftToRight) { mLeftToRight = !leftToRight; mClipPercent = 1.0f - leavePercent; invalidate(); } @Override public void onEnter(int index, int totalCount, float enterPercent, boolean leftToRight) { mLeftToRight = leftToRight; mClipPercent = enterPercent; invalidate(); } private void measureTextBounds() { mPaint.getTextBounds(mText, 0, mText == null ? 0 : mText.length(), mTextBounds); } public String getText() { return mText; } public void setText(String text) { mText = text; requestLayout(); } public float getTextSize() { return mPaint.getTextSize(); } public void setTextSize(float textSize) { mPaint.setTextSize(textSize); requestLayout(); } public int getTextColor() { return mTextColor; } public void setTextColor(int textColor) { mTextColor = textColor; invalidate(); } public int getClipColor() { return mClipColor; } public void setClipColor(int clipColor) { mClipColor = clipColor; invalidate(); } }