|
@@ -0,0 +1,226 @@
|
|
|
|
|
+package com.atmob.keyboard_android.widget.indicator;
|
|
|
|
|
+
|
|
|
|
|
+import android.content.Context;
|
|
|
|
|
+import android.graphics.Canvas;
|
|
|
|
|
+import android.graphics.Paint;
|
|
|
|
|
+import android.graphics.Rect;
|
|
|
|
|
+import android.graphics.Typeface;
|
|
|
|
|
+import android.view.View;
|
|
|
|
|
+
|
|
|
|
|
+import net.lucode.hackware.magicindicator.buildins.UIUtil;
|
|
|
|
|
+import net.lucode.hackware.magicindicator.buildins.commonnavigator.abs.IMeasurablePagerTitleView;
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * 修改自ClipPagerTitleView,增加了设置粗体的功能和方法
|
|
|
|
|
+ */
|
|
|
|
|
+public class TabPagerTitleView extends View implements IMeasurablePagerTitleView {
|
|
|
|
|
+ private String mText;
|
|
|
|
|
+ private int mTextColor;
|
|
|
|
|
+ private int mClipColor;
|
|
|
|
|
+ private boolean mLeftToRight;
|
|
|
|
|
+ private float mClipPercent;
|
|
|
|
|
+ // 新增:粗体状态标记
|
|
|
|
|
+ private boolean mIsBold = false;
|
|
|
|
|
+ // 新增:原始字体缓存
|
|
|
|
|
+ private Typeface mOriginalTypeface;
|
|
|
|
|
+
|
|
|
|
|
+ private Paint mPaint;
|
|
|
|
|
+ private final Rect mTextBounds = new Rect();
|
|
|
|
|
+
|
|
|
|
|
+ public TabPagerTitleView(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);
|
|
|
|
|
+ // 保存初始字体
|
|
|
|
|
+ mOriginalTypeface = mPaint.getTypeface();
|
|
|
|
|
+ int padding = UIUtil.dip2px(context, 10);
|
|
|
|
|
+ setPadding(padding, 0, padding, 0);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 新增:粗体切换方法
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param isBold 是否粗体
|
|
|
|
|
+ */
|
|
|
|
|
+ public void setBoldStyle(boolean isBold) {
|
|
|
|
|
+ mIsBold = isBold;
|
|
|
|
|
+ updateTypeface();
|
|
|
|
|
+ requestLayout();
|
|
|
|
|
+ invalidate();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ private void updateTypeface() {
|
|
|
|
|
+ Typeface newTypeface = Typeface.create(mOriginalTypeface,
|
|
|
|
|
+ mIsBold ? Typeface.BOLD : Typeface.NORMAL
|
|
|
|
|
+ );
|
|
|
|
|
+ mPaint.setTypeface(newTypeface);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @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;
|
|
|
|
|
+ Paint.FontMetrics fontMetrics = mPaint.getFontMetrics();
|
|
|
|
|
+ int y = (int) ((getHeight() - fontMetrics.bottom - fontMetrics.top) / 2);
|
|
|
|
|
+
|
|
|
|
|
+ // 画底层
|
|
|
|
|
+ mPaint.setColor(mTextColor);
|
|
|
|
|
+ canvas.drawText(mText, x, y, mPaint);
|
|
|
|
|
+
|
|
|
|
|
+ // 画clip层
|
|
|
|
|
+ canvas.save();
|
|
|
|
|
+ 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);
|
|
|
|
|
+ updateTypeface(); // 修改:保持粗体状态
|
|
|
|
|
+ requestLayout();
|
|
|
|
|
+ invalidate();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ 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();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public int getContentLeft() {
|
|
|
|
|
+ int contentWidth = mTextBounds.width();
|
|
|
|
|
+ return getLeft() + getWidth() / 2 - contentWidth / 2;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public int getContentTop() {
|
|
|
|
|
+ Paint.FontMetrics metrics = mPaint.getFontMetrics();
|
|
|
|
|
+ float contentHeight = metrics.bottom - metrics.top;
|
|
|
|
|
+ return (int) (getHeight() / 2 - contentHeight / 2);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public int getContentRight() {
|
|
|
|
|
+ int contentWidth = mTextBounds.width();
|
|
|
|
|
+ return getLeft() + getWidth() / 2 + contentWidth / 2;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public int getContentBottom() {
|
|
|
|
|
+ Paint.FontMetrics metrics = mPaint.getFontMetrics();
|
|
|
|
|
+ float contentHeight = metrics.bottom - metrics.top;
|
|
|
|
|
+ return (int) (getHeight() / 2 + contentHeight / 2);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 新增:获取当前粗体状态
|
|
|
|
|
+ */
|
|
|
|
|
+ public boolean isBold() {
|
|
|
|
|
+ return mIsBold;
|
|
|
|
|
+ }
|
|
|
|
|
+}
|