日历控件的多选

通常在开发当中,我们会根据功能需求来做日历这个功能,这个功能也是每个人必不可少要掌握的,今天就来和大家共同研究下日历,其实也比较简单,直接上步骤
先来张效果图

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.
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值