package cn.flightfeather.thirdappmodule.view.calendarview; import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.RectF; import com.haibin.calendarview.Calendar; import com.haibin.calendarview.WeekView; import java.util.ArrayList; import java.util.List; /** * @author riku * 2019.3.29 * 精美进度风格 */ public class ProgressWeekView extends WeekView { private Paint mProgressPaint = new Paint(); private Paint mTagPaint = new Paint(); private Paint mNoneProgressPaint = new Paint(); private List colorList = new ArrayList<>(); private int mRadius; private int tagRadius; public ProgressWeekView(Context context) { super(context); mProgressPaint.setAntiAlias(true); mProgressPaint.setStyle(Paint.Style.STROKE); mProgressPaint.setStrokeWidth(dipToPx(context, 2.2f)); mProgressPaint.setColor(0xBBf54a00); mTagPaint.setAntiAlias(true); mTagPaint.setStyle(Paint.Style.STROKE); // mTagPaint.setStrokeWidth(dipToPx(context, 2.2f)); mTagPaint.setColor(0xF700F5BC); colorList.add(0xBBf54a00); colorList.add(0xF700F5BC); mNoneProgressPaint.setAntiAlias(true); mNoneProgressPaint.setStyle(Paint.Style.STROKE); mNoneProgressPaint.setStrokeWidth(dipToPx(context, 2.2f)); mNoneProgressPaint.setColor(0x90CfCfCf); } @Override protected void onPreviewHook() { mRadius = Math.min(mItemWidth, mItemHeight) / 11 * 4; } @Override protected boolean onDrawSelected(Canvas canvas, Calendar calendar, int x, boolean hasScheme) { int cx = x + mItemWidth / 2; int cy = mItemHeight / 2; int tempRadius = (int) (mRadius - mProgressPaint.getStrokeWidth() - dipToPx(getContext(), 2f)); canvas.drawCircle(cx, cy, tempRadius, mSelectedPaint); return true; } @Override protected void onDrawScheme(Canvas canvas, Calendar calendar, int x) { // int cx = x + mItemWidth / 2; // int cy = mItemHeight / 2; // // int mode = 0; // int progress = 0; // for (Calendar.Scheme s : calendar.getSchemes()) { // if (s.getType() == 1) { // progress = Integer.parseInt(s.getScheme()); // break; // } // mode++; // } // // int angle = getAngle(progress); // // RectF progressRectF = new RectF(cx - mRadius, cy - mRadius, cx + mRadius, cy + mRadius); // switch (mode) { // case 0: // canvas.drawArc(progressRectF, -90, angle, false, mProgressPaint); // break; // case 1: // canvas.drawArc(progressRectF, -90, angle, false, mTagPaint); // break; // } // // RectF noneRectF = new RectF(cx - mRadius, cy - mRadius, cx + mRadius, cy + mRadius); // canvas.drawArc(noneRectF, angle - 90, 360 - angle, false, mNoneProgressPaint); int cx = x + mItemWidth / 2; int cy = mItemHeight / 2; int index = 0; int progress = 0; RectF progressRectF = new RectF(cx - mRadius, cy - mRadius, cx + mRadius, cy + mRadius); for (Calendar.Scheme s : calendar.getSchemes()) { //type == 1,画进度条 if (s.getType() == 1) { progress = Integer.parseInt(s.getScheme()); mProgressPaint.setColor(colorList.get(index % 2)); int angle = getAngle(progress); canvas.drawArc(progressRectF, -90, angle, false, mProgressPaint); RectF noneRectF = new RectF(cx - mRadius, cy - mRadius, cx + mRadius, cy + mRadius); canvas.drawArc(noneRectF, angle - 90, 360 - angle, false, mNoneProgressPaint); } //type == 2,画标记 else if (s.getType() == 2) { Paint.FontMetrics fontMetrics = mSelectTextPaint.getFontMetrics(); float textBottomY = mTextBaseLine + fontMetrics.bottom; float cardBottomY = mItemHeight; // float tagCy = (textBottomY + cardBottomY) / 2; float tagCy = (textBottomY + 4); canvas.drawCircle((float) cx, tagCy, tagRadius, mTagPaint); } index++; } } @Override protected void onDrawText(Canvas canvas, Calendar calendar, int x, boolean hasScheme, boolean isSelected) { float baselineY = mTextBaseLine; int cx = x + mItemWidth / 2; if (isSelected) { canvas.drawText(String.valueOf(calendar.getDay()), cx, baselineY, mSelectTextPaint); } else if (hasScheme) { canvas.drawText(String.valueOf(calendar.getDay()), cx, baselineY, calendar.isCurrentDay() ? mCurDayTextPaint : calendar.isCurrentMonth() ? mSchemeTextPaint : mOtherMonthTextPaint); } else { canvas.drawText(String.valueOf(calendar.getDay()), cx, baselineY, calendar.isCurrentDay() ? mCurDayTextPaint : calendar.isCurrentMonth() ? mCurMonthTextPaint : mOtherMonthTextPaint); } } /** * 获取角度 * * @param progress 进度 * @return 获取角度 */ private static int getAngle(int progress) { return (int) (progress * 3.6); } /** * dp转px * * @param context context * @param dpValue dp * @return px */ @SuppressWarnings("all") private static int dipToPx(Context context, float dpValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); } }