自定义Calendar实现签到功能

本文介绍了一个自定义的CalendarView组件,用于实现签到功能。文章重点讲解了组件的工作流程,包括初始化数据、测量组件大小和绘制过程。在onDraw方法中动态计算并绘制日期,同时详细阐述了如何添加签到标签的功能。源码中包含大量注释,便于理解。
摘要由CSDN通过智能技术生成

前言

这篇文章没有什么可看性,主要是源码注释太多,推荐自己看源码,更容易理解些,在这里主要介绍,其运作流程,贴代码片段。

先贴源码地址:点此进入源码地址。

自定义View要重写三个方法:onMeasureonLayoutonDraw,这三个方法各有个的作用,onMeasure是对组件的宽高进行测量,onLayout是对子控件的位置进行摆放,onDraw是对自定义控件进行绘制,在《仿探探头像编辑解析》这篇文章中,已经对onMeasure,onLayout方法进行了运用,那个源码注释也很多,如果有兴趣的可以去看看,本章是对onDraw方法进行使用,顺带使用Path对象。

好了,先谈谈为什么我要重复造轮子,要做一个有签到功能的日历,由于自己对自定义的组件ondraw方法还没怎么用过,所以重复造轮子咯,是不是理由不是很充分,没关系,开心就好。

先来张效果图
这里写图片描述

这个CalendarView的API

    String clickLeftMonth();    //上一个月 return String(年-月)
    String clickRightMonth();   //下一个月 return String(年-月)
    Surface getSurface();       //获取整个组件画图对象,可进行设置字体颜色等 return Surface
    String getYearAndmonth();   // 获得当前应该显示的年月 return String(年-月)
    boolean isSelectMore();     //返回是否多选
    setSelectMore(boolean flag);//设置是否多选
    setFlagData(String[] flags);//设置要进行标记的数据
    setOnItemClickListener(OnItemClickListener); //点击一个日期的回调事件
    setWritingFlag(String str); //设置标记字符,默认为签到

OK,先来简述下这个组件跑起来的流程,
1.初始化数据。
2.测量组件大小,即调用了OnMeasure方法
3.调用onDraw方法。

步骤是不是很简单呀?OK,通过源码简单的跑一下流程。

初始化数据

    public CalendarView(Context context) {
        super(context);
        // 初始化数据
        init();
    }

    public CalendarView(Context context, AttributeSet attrs) {
        super(context, attrs);
        // 初始化数据
        init();
    }

    /**
     * 初始化数据 ,初始化事件对象 ,初始化日期格式类对象 ,Surface布局对象初始化 ,获取屏幕密度比例 ,设置View背景 ,设置触摸事件
     */
    private void init() {
        // 创建一个Date对象并将引用给显示的月,选择开始,选择结束,今天的日期
        curDate = selectedStartDate = selectedEndDate = today = new Date();
        // 获取一个日期类对象
        calendar = Calendar.getInstance();
        // 设置日期
        calendar.setTime(curDate);
        // 创建一个布局路径
        surface = new Surface(this);
        // 获取屏幕密度比例
        surface.density = getResources().getDisplayMetrics().density;
        // 给整个控件设置触摸事件
        setOnTouchListener(this);
    }

这一块看出,在组件进行实例化的时候调用了init方法,然后看见了new Surface() 创建了一个Surface对象。ok来看下这个Surface类,其他的应该都知道是什么。(像我注释这么密的看不懂才怪(*\^__^*))。

    public void init() {
        float temp = height / 7f;// 将整个视图分成了7份,每份所占的高度
        monthHeight = 0;// (float) ((t
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值