lua 实现类似日历效果

-- 实现日历的效果层


friend_hldnDateLayer = class("friend_hldnDateLayer", function()
    return display.newNode()
end )


function friend_hldnDateLayer:ctor()
    local beginYear = 2017
    local endYear = tonumber( os.date("%Y", os.time()) ) or 2017
  
    -- 获取需要的年份的数据
    -- 获取年 月 日 周
    local Ydata = {}
    for i = beginYear,endYear do
        local vo = {}
        vo.y = i
        vo.ms = {}
        for j=2,13 do
            -- 获取该月份的天数  month参数是要填写下月个月份的
            local tianshu = os.date("%d", os.time({year=i,month=j,day=0}) )
            vo.ms[j-1] = {}
            vo.ms[j-1].ds = {}
            -- 插入天数数据
            for k=1,tianshu do
                vo.ms[j-1].ds[k] = {}


                -- 日期
                vo.ms[j-1].ds[k].d =  k


                -- 得到该日期是周几
                local t = os.time({year=i,month=j-1,day=k})
                vo.ms[j-1].ds[k].z = os.date("*t",t).wday -1
            end
        end


        Ydata[i] = vo
    end


    -- 绘制月份的详细信息 
    function self:getCurDatedata(year,month)
        -- 日历单页显示42个日期数据 
        -- 初始42个日期数据进行标记 z=周几  d=日期初始为0
        local zsData = {}
        local _s = {0,1,2,3,4,5,6}
        for i=1,42 do
            local index = i%7
            zsData[i] = {z = _s[index == 0 and 7 or index],d = 0}
        end


        --[[
            记录第一次插入数据的位置-1  ,记录最后插入位置+1
            可以通过该参数,进行填补日期
        ]]
        local jlFristIndex,jlFinalIndex = -1,-1


        -- 把该年月的日期相应的插入到对应的位置中
        for i,ds in pairs( Ydata[year].ms[month] ) do


             -- 该参数为了避免 zsData的日期数据重复的插入
             -- 从2开始为了保证可以存在上个月分的日期显示
             local statIndex = 2 


             -- 根据周的数据依次记录日期数据 
             for j,d in pairs(ds) do


                  for k=statIndex,#zsData do
                      local t2 =  k%7


                      if tonumber(zsData[k].z) == tonumber(d.z) then


                          if jlFristIndex == -1 then
                             jlFristIndex = k - 1
                          end


                          -- 修改日期
                          zsData[k].d = d.d


                          statIndex = statIndex + 1


                          jlFinalIndex = k  + 1
                          break
                      end


                  end


             end


        end


        dump(zsData,"date1 = ")


        -- jlFristIndex,jlFinalIndex 填补缺省日期  对一月份特殊处理
        if month == 1 then
            if jlFinalIndex ~= -1 then
                local d = 1
                 for j=jlFinalIndex,#zsData do
                    zsData[j].d = d
                    zsData[j].isQs = true
                    d = d + 1
                end
            end


            if jlFristIndex ~= -1 then
                local index = 31
                for i=jlFristIndex,1,-1 do
                    zsData[i].d = index
                    zsData[i].isQs = true
                    index = index - 1
                end
            end


        else
            if jlFinalIndex ~= -1 then
                local d = 1
                 for j=jlFinalIndex,#zsData do
                    zsData[j].d = d
                    zsData[j].isQs = true
                    d = d + 1
                end
            end


            if jlFristIndex ~= -1 then
                local ds = Ydata[year].ms[month-1].ds
                local index = #ds
                for i=jlFristIndex,1,-1 do
                    zsData[i].d = ds[index].d
                    zsData[i].isQs = true
                    index = index - 1
                end
            end
        end


        -- zsData 就是 按照 0日、1、2、3、4、5、6对应排列的日期数据 可以进行绘制了
        dump(zsData,"date2 = ")


        return zsData
    end


   local zsData = self:getCurDatedata(2017,12)


   for i,data in pairs(zsData) do
      local text = ccui.Text:create(data.d, Tm.Res.FontDefault, 40)    
      self:addChild(text)


      local _ = data.isQs and text:setColor(cc.c3b(255,255,0))


      local index = i%7
      index = index == 0 and 7 or index


      local indey = math.modf(i/7) 
      indey = index == 7 and  indey - 1 or indey


      text:setPosition(100 + (index-1) * 60,650 - indey * 60 )
   end
    


end


return friend_hldnDateLayer

猜你喜欢

转载自blog.csdn.net/erweimac/article/details/78933036