package com.coolerfall.widget.lunar; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.Region; import android.util.DisplayMetrics; import android.view.View; /** * Display the week label in the top of {@link MonthView}. * * @author Vincent Cheung ([email protected]) */ final class WeekLabelView extends View { private static final int DAYS_IN_WEEK = 7; private static final String[] CHINESE_WEEK = { "日", "一", "二", "三", "四", "五", "六" }; private final Region[] weekRegion = new Region[DAYS_IN_WEEK]; private Paint paint; /** * The constructor of week view. * * @param context the context to use */ public WeekLabelView(Context context) { super(context); init(); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); int itemWidth = (int) (w / 7f); for (int i = 0; i < DAYS_IN_WEEK; i++) { weekRegion[i].set(i * itemWidth, 0, (i + 1) * itemWidth, h); } paint.setTextSize(w / 25f); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int widthSize = MeasureSpec.getSize(widthMeasureSpec); Paint.FontMetrics fm = paint.getFontMetrics(); int heightSize = (int) Math.ceil(fm.descent - fm.ascent) + getPaddingTop() + getPaddingBottom(); setMeasuredDimension(widthSize, heightSize); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Paint.FontMetrics fm = paint.getFontMetrics(); for (int i = 0; i < DAYS_IN_WEEK; i++) { Rect rect = weekRegion[i].getBounds(); float centerY = rect.height() / 2 - fm.descent + (fm.descent - fm.ascent) / 2; canvas.drawText(CHINESE_WEEK[i], rect.centerX(), centerY, paint); } } /* init week view */ private void init() { paint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG | Paint.LINEAR_TEXT_FLAG); paint.setTextAlign(Paint.Align.CENTER); paint.setColor(Color.GRAY); int padding = dip2px(getContext()); setPadding(0, padding, 0, padding); for (int i = 0; i < DAYS_IN_WEEK; i++) { Region region = new Region(); weekRegion[i] = region; } } private static int dip2px(Context context) { int dpValue = 10; int dpi = context.getResources().getDisplayMetrics().densityDpi; if (dpi >= DisplayMetrics.DENSITY_XXXHIGH) { dpValue = 18; } else if (dpi >= DisplayMetrics.DENSITY_XXHIGH) { dpValue = 16; } else if (dpi >= DisplayMetrics.DENSITY_XHIGH) { dpValue = 15; } else if (dpi >= DisplayMetrics.DENSITY_HIGH) { dpValue = 14; } final float scale = context.getResources().getDisplayMetrics().density; return (int) (dpValue * scale + 0.5f); } }