package com.rehome.sbcksyy.weiget; /** * Create By HuangWenFei * 创建日期:2022-12-22 14:19 * 描述: */ import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.text.TextUtils; import com.haibin.calendarview.Calendar; import com.haibin.calendarview.MonthView; /** * 演示一个变态需求的月视图 * Created by huanghaibin on 2018/2/9. */ public class CustomMonthView extends MonthView { private int mRadius; /** * 自定义魅族标记的文本画笔 */ private Paint mTextPaint = new Paint(); /** * 24节气画笔 */ private Paint mSolarTermTextPaint = new Paint(); /** * 背景圆点 */ private Paint mPointPaint = new Paint(); /** * 今天的背景色 */ private Paint mCurrentDayPaint = new Paint(); /** * 圆点半径 */ private float mPointRadius; private int mPadding; private float mCircleRadius; /** * 自定义魅族标记的圆形背景 */ private Paint mSchemeBasicPaint = new Paint(); private float mSchemeBaseLine; public CustomMonthView(Context context) { super(context); mTextPaint.setTextSize(dipToPx(context, 8)); mTextPaint.setColor(0xffffffff); mTextPaint.setAntiAlias(true); mTextPaint.setFakeBoldText(true); mSolarTermTextPaint.setColor(0xff489dff); mSolarTermTextPaint.setAntiAlias(true); mSolarTermTextPaint.setTextAlign(Paint.Align.CENTER); mSchemeBasicPaint.setAntiAlias(true); mSchemeBasicPaint.setStyle(Paint.Style.FILL); mSchemeBasicPaint.setTextAlign(Paint.Align.CENTER); mSchemeBasicPaint.setFakeBoldText(true); mSchemeBasicPaint.setColor(Color.WHITE); mCurrentDayPaint.setAntiAlias(true); mCurrentDayPaint.setStyle(Paint.Style.FILL); mCurrentDayPaint.setColor(0xFFeaeaea); mPointPaint.setAntiAlias(true); mPointPaint.setStyle(Paint.Style.FILL); mPointPaint.setTextAlign(Paint.Align.CENTER); mPointPaint.setColor(Color.RED); mCircleRadius = dipToPx(getContext(), 7); mPadding = dipToPx(getContext(), 3); mPointRadius = dipToPx(context, 2); Paint.FontMetrics metrics = mSchemeBasicPaint.getFontMetrics(); mSchemeBaseLine = mCircleRadius - metrics.descent + (metrics.bottom - metrics.top) / 2 + dipToPx(getContext(), 1); } @Override protected void onPreviewHook() { mSolarTermTextPaint.setTextSize(mCurMonthLunarTextPaint.getTextSize()); mRadius = Math.min(mItemWidth, mItemHeight) / 11 * 5; mSchemePaint.setStyle(Paint.Style.STROKE); } @Override protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme) { int cx = x + mItemWidth / 2; int cy = y + mItemHeight / 2; canvas.drawCircle(cx, cy, mRadius, mSelectedPaint); return true; } @Override protected void onDrawScheme(Canvas canvas, Calendar calendar, int x, int y) { int cx = x + mItemWidth / 2; int cy = y + mItemHeight / 2; canvas.drawCircle(cx, cy, mRadius, mSchemePaint); // boolean isSelected = isSelected(calendar); // if (isSelected) { // mPointPaint.setColor(Color.WHITE); // } else { // mPointPaint.setColor(Color.GRAY); // } // // canvas.drawCircle(x + mItemWidth / 2, y + mItemHeight - 3 * mPadding, mPointRadius, mPointPaint); } @SuppressWarnings("IntegerDivisionInFloatingPointContext") @Override protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) { int cx = x + mItemWidth / 2; int cy = y + mItemHeight / 2; int top = y - mItemHeight / 6; if (calendar.isCurrentDay() && !isSelected) { canvas.drawCircle(cx, cy, mRadius, mCurrentDayPaint); } // if (hasScheme) { // canvas.drawCircle(x + mItemWidth - mPadding - mCircleRadius / 2, y + mPadding + mCircleRadius, mCircleRadius, mSchemeBasicPaint); // mTextPaint.setColor(calendar.getSchemeColor()); // canvas.drawText(calendar.getScheme(), x + mItemWidth - mPadding - mCircleRadius, y + mPadding + mSchemeBaseLine, mTextPaint); // } //当然可以换成其它对应的画笔就不麻烦, if (calendar.isWeekend() && calendar.isCurrentMonth()) { mCurMonthTextPaint.setColor(0xFF489dff); mCurMonthLunarTextPaint.setColor(0xFF489dff); mSchemeTextPaint.setColor(0xFF489dff); mSchemeLunarTextPaint.setColor(0xFF489dff); mOtherMonthLunarTextPaint.setColor(0xFF489dff); mOtherMonthTextPaint.setColor(0xFF489dff); } else { mCurMonthTextPaint.setColor(0xff333333); mCurMonthLunarTextPaint.setColor(0xffCFCFCF); mSchemeTextPaint.setColor(0xff333333); mSchemeLunarTextPaint.setColor(0xffCFCFCF); mOtherMonthTextPaint.setColor(0xFFe1e1e1); mOtherMonthLunarTextPaint.setColor(0xFFe1e1e1); } if (isSelected) { canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top, mSelectTextPaint); canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + y + mItemHeight / 10, mSelectedLunarTextPaint); } else if (hasScheme) { canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top, calendar.isCurrentMonth() ? mSchemeTextPaint : mOtherMonthTextPaint); canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + y + mItemHeight / 10, !TextUtils.isEmpty(calendar.getSolarTerm()) ? mSolarTermTextPaint : mSchemeLunarTextPaint); } else { canvas.drawText(String.valueOf(calendar.getDay()), cx, mTextBaseLine + top, calendar.isCurrentDay() ? mCurDayTextPaint : calendar.isCurrentMonth() ? mCurMonthTextPaint : mOtherMonthTextPaint); canvas.drawText(calendar.getLunar(), cx, mTextBaseLine + y + mItemHeight / 10, calendar.isCurrentDay() ? mCurDayLunarTextPaint : calendar.isCurrentMonth() ? !TextUtils.isEmpty(calendar.getSolarTerm()) ? mSolarTermTextPaint : mCurMonthLunarTextPaint : mOtherMonthLunarTextPaint); } } /** * dp转px * * @param context context * @param dpValue dp * @return px */ private static int dipToPx(Context context, float dpValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); } }