通常在开发当中,我们会根据功能需求来做日历这个功能,这个功能也是每个人必不可少要掌握的,今天就来和大家共同研究下日历,其实也比较简单,直接上步骤
先来张效果图
1、基础类,直接复制可用
> package com.example.android_mzsz.utils;
>
> import android.content.Context; import android.graphics.Canvas; import
> android.graphics.Color; import android.graphics.Paint; import
> android.graphics.Path; import android.graphics.Typeface; import
> android.util.AttributeSet; import android.util.Log; import
> android.view.MotionEvent; import android.view.View;
>
> import java.util.ArrayList; import java.util.Calendar; import
> java.util.Date; import java.util.HashMap; import java.util.List;
> import java.util.Map;
>
> /** * 日历控件 功能:获得点选的日期区间 */ public class CalendarView extends View
> implements View.OnTouchListener {
> private final static String TAG = "anCalendar";
> private Date selectedStartDate;
> private Date selectedEndDate;
> private Date curDate; // 当前日历显示的月
> private Date today; // 今天的日期文字显示红色
> private Date downDate; // 手指按下状态时临时日期
> private Date showFirstDate, showLastDate; // 日历显示的第一个日期和最后一个日期
> private int downIndex; // 按下的格子索引
> private Calendar calendar;
> private Surface surface;
> private int[] date = new int[42]; // 日历显示数字
> private int curStartIndex, curEndIndex; // 当前显示的日历起始的索引
> private boolean completed = false; // 为false表示只选择了开始日期,true表示结束日期也选择了
> private boolean isSelectMore = false;
> private int chazhi=0;
> private int zhi=0;
> //给控件设置监听事件
> private OnItemClickListener onItemClickListener;
>
> public CalendarView(Context context) {
> super(context);
> init();
> }
>
> public CalendarView(Context context, AttributeSet attrs) {
> super(context, attrs);
> init();
> }
>
> private void init() {
> curDate = selectedStartDate = selectedEndDate = today = new Date();
> calendar = Calendar.getInstance();
> calendar.setTime(curDate);
> surface = new Surface();
> surface.density = getResources().getDisplayMetrics().density;
> setBackgroundColor(surface.bgColor);
> setOnTouchListener(this);
> }
>
> @Override
> protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
> surface.width = getResources().getDisplayMetrics().widthPixels;
> surface.height = (int) (getResources().getDisplayMetrics().heightPixels * 2 / 5); // if
> (View.MeasureSpec.getMode(widthMeasureSpec) ==
> View.MeasureSpec.EXACTLY) { // surface.width =
> View.MeasureSpec.getSize(widthMeasureSpec); // } // if
> (View.MeasureSpec.getMode(heightMeasureSpec) ==
> View.MeasureSpec.EXACTLY) { // surface.height =
> View.MeasureSpec.getSize(heightMeasureSpec); // }
> widthMeasureSpec = MeasureSpec.makeMeasureSpec(surface.width,
> MeasureSpec.EXACTLY);
> heightMeasureSpec = MeasureSpec.makeMeasureSpec(surface.height,
> MeasureSpec.EXACTLY);
> setMeasuredDimension(widthMeasureSpec, heightMeasureSpec);
> super.onMeasure(widthMeasureSpec, heightMeasureSpec);
> }
>
> @Override
> protected void onLayout(boolean changed, int left, int top, int right,
> int bottom) {
> Log.d(TAG, "[onLayout] changed:"
> + (changed ? "new size" : "not change") + " left:" + left
> + " top:" + top + " right:" + right + " bottom:" + bottom);
> if (changed) {
> surface.init();
> }
> super.onLayout(changed, left, top, right, bottom);
> }
>
> @Override
> protected void onDraw(Canvas canvas) {
> Log.d(TAG, "onDraw");
> // 画框
> canvas.drawPath(surface.boxPath, surface.borderPaint);
> // 年月
> //String monthText = getYearAndmonth();
> //float textWidth = surface.monthPaint.measureText(monthText);
> //canvas.drawText(monthText, (surface.width - textWidth) / 2f,
> // surface.monthHeight * 3 / 4f, surface.monthPaint);
> // 上一月/下一月
> //canvas.drawPath(surface.preMonthBtnPath, surface.monthChangeBtnPaint);
> //canvas.drawPath(surface.nextMonthBtnPath, surface.monthChangeBtnPaint);
> // 星期
> float weekTextY = surface.monthHeight + surface.weekHeight * 3 / 4f;
> // 星期背景 // surface.cellBgPaint.setColor(surface.textColor); // canvas.drawRect(surface.weekHeight, surface.width,
> surface.weekHeight, surface.width, surface.cellBgPaint);
> for (int i = 0; i < surface.weekText.length; i++) {
> float weekTextX = i
> * surface.cellWidth
> + (surface.cellWidth - surface.weekPaint
> .measureText(surface.weekText[i])) / 2f;
> canvas.drawText(surface.weekText[i], weekTextX, weekTextY,
> surface.weekPaint);
> }
>
> // 计算日期
> calculateDate();
> // 按下状态,选择状态背景色
> drawDownOrSelectedBg(canvas);
> // write date number
> // today index
> int todayIndex = -1;
> calendar.setTime(curDate);
> String curYearAndMonth = calendar.