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();
}
}