coco2dx-lua 模拟IOS时间选择器

--时间选择器
local DatePickerFrame = class("DatePickerFrame", require("core.common.BaseFrameNode"))
local resPath = "res/"

local DatePickerType = {
    PickerDay = 1,
    PickerMonth = 2,
    PickerYear = 3,
}

function DatePickerFrame:ctor(data)
    data = data or {}
    local frameData = {
        kSize = cc.size(display.width, 654),
        closeCall = data.callBack
    }
    DatePickerFrame.super.ctor(self,frameData)

    local date = os.date("*t",os.time())

    self.year = date.year
    self.month = date.month
    self.day = date.day

    self.yearDic = {}
    for i=1900,self.year do
        table.insert(self.yearDic, i)
    end
    table.insert(self.yearDic, 1, "")
    table.insert(self.yearDic, table.nums(self.yearDic)+1, "")

    self.monthDic = {"",1,2,3,4,5,6,7,8,9,10,11,12,""}

    self.dayDic = {"",1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,""}
end

--[[
    @desc: 根据年月,获取当月的天数
    author:fang
    time:2023-08-22 16:23:56
    @return:
]]
function DatePickerFrame:getMaxDay()
    local maxDay = 31
    if self.month == 1 or self.month == 3 or self.month == 5 or self.month == 7 or self.month == 8 or self.month == 10 or self.month == 12 then
        maxDay = 31
    elseif self.month == 2 then
        if self.year % 4 == 0 and self.year % 100 ~= 0 or self.year % 400 == 0 then
            maxDay = 29
        else
            maxDay = 28
        end
    else
        maxDay = 30
    end
    return maxDay
end

--[[
    @desc: 
    author:fang 检查年月,日是否合理
    time:2023-08-22 16:24:31
    --@content:
	--@i: 
    @return:
]]
function DatePickerFrame:checkDay(content,i)
    local maxDay = self:getMaxDay()

    if not content then 
        content = self.day
    end
    if not i then
        i = self.day + 1
    end

    if content > maxDay then
        local idx = i - (content - maxDay)
        self.day = self.dayDic[idx]
        self.dayPicker:jumpTo(idx)
        local para = cc.p(self.dayPicker.innerContainer:getPosition())
        self.dayPicker.changeMideItem(para)
    else
        self.day = content
    end
end


function DatePickerFrame:initFrame()
    local height = 870
    local contentNode = UIHelper:createScale9InageView(resPath.."General_bg_white3.png",cc.size(display.width, height))
    self:addChild(contentNode)
    self.contentNode = contentNode
    contentNode:setAnchorPoint(0,0)
    contentNode:setPositionY(-height)
    
    --"YEAR
    local textYear = UIHelper:createSysFont(LanguageCfg.getTipString(968), 48, cc.c3b(0, 0, 0), FONT_TYPE.TITLE)
    textYear:setPosition(96 + textYear:getContentSize().width/2, height - 84)
    self:addToContentNode(textYear)

    --"MONTH"
    local textMonth = UIHelper:createSysFont(LanguageCfg.getTipString(967), 48, cc.c3b(0, 0, 0), FONT_TYPE.TITLE)
    textMonth:setPosition(455 + textMonth:getContentSize().width/2, textYear:getPositionY())
    self:addToContentNode(textMonth)

    --"DAY"
    local textDay = UIHelper:createSysFont(LanguageCfg.getTipString(969), 48, cc.c3b(0, 0, 0), FONT_TYPE.TITLE)
    textDay:setPosition(self:getContentNodeSize().width - 101 - textDay:getContentSize().width/2, textYear:getPositionY())
    self:addToContentNode(textDay)


    self:createDayPicker(textDay:getPositionX())
    self:createMonthPicker(textMonth:getPositionX())
    self:createYearPicker(textYear:getPositionX())

    local lineNode1 = UIHelper:createLine(cc.size(1000, 2), cc.c3b(0,0,0), cc.p(0.5,0.5))
    self:addToContentNode(lineNode1)
    lineNode1:setPosition(self:getContentNodeSize().width/2, self:getContentNodeSize().height-260)
    lineNode1:setOpacity(25)

    local lineNode2 = UIHelper:createLine(cc.size(1000, 2), cc.c3b(0,0,0), cc.p(0.5,0.5))
    self:addToContentNode(lineNode2)
    lineNode2:setPosition(self:getContentNodeSize().width/2, lineNode1:getPositionY()+150)
    lineNode2:setOpacity(25)

    local layout = UIHelper:createContentNode({size = cc.size(display.width, 80)})
    layout:setAnchorPoint(0.5,0.5)
    self:addToContentNode(layout)
    layout:setPosition(self:getContentNodeSize().width/2, lineNode1:getPositionY()+290)

    local layout = UIHelper:createContentNode({size = cc.size(display.width, 80)})
    layout:setAnchorPoint(0.5,0.5)
    self:addToContentNode(layout)
    layout:setPosition(self:getContentNodeSize().width/2, lineNode1:getPositionY()-144)


    local btnOk = UIHelper:createScale9InageView(resPath.."General_btn_huge_green.png", cc.size(1000, 110), 1)
    local btnText = UIHelper:createSysFont(LanguageCfg.getTipString(311), 48, cc.c3b(255, 255, 255), FONT_TYPE.TITLE)
    btnOk:addChild(btnText)
    btnText:setPosition(btnOk:getContentSize().width/2,btnOk:getContentSize().height/2 + 4)
    self:addToContentNode(btnOk)
    btnOk:setPosition(self:getContentNodeSize().width/2,125)
    UIHelper:addTouchEvent(btnOk, function()
        self:closeFrame()
    end, true)

    self:onenFrame()

    self:registerEventIsOut()
end

function DatePickerFrame:createDayPicker(posx)
    self.dayPicker = self:createDatePicker(posx,self.dayDic,DatePickerType.PickerDay)
end

function DatePickerFrame:createMonthPicker(posx)
    self:createDatePicker(posx,self.monthDic,DatePickerType.PickerMonth)
end

function DatePickerFrame:createYearPicker(posx)
    self:createDatePicker(posx,self.yearDic,DatePickerType.PickerYear)
end

function DatePickerFrame:createDatePicker(posx,contentDic,pickerType)


    local lv = require("core.utils.ListViewPro").new()
	lv:setBounceEnabled(false)
	lv:setContentSize(cc.size(150, 450))
	lv:setBackGroundColorType(0)
	lv:setBackGroundColor(cc.c3b(0, 100, 0))
	lv:setAnchorPoint(0.5, 0.5)
    self:addToContentNode(lv)
    lv:setPosition(posx,self:getContentNodeSize().height/2 + 140)

    local itemSize = cc.size(lv:getContentSize().width, 150)

    local len = #contentDic
    for i=1,#contentDic do
        local layout = ccui.Layout:create()
        local textId = UIHelper:createSysFont(contentDic[i], 48, cc.c3b(0, 0, 0), FONT_TYPE.TITLE)
        layout:addChild(textId)
        textId:setPosition(75, 75)
        layout.textId = textId
        layout:setContentSize(itemSize)
	    layout:setBackGroundColorType(0)
	    layout:setBackGroundColor(cc.c3b(math.random(1, 255),(math.random(1, 255)),(math.random(1, 255))))
        lv:pushBackCustomItem(layout)
    end

    local innerSize = lv:getInnerContainerSize()
    local pos = cc.p(lv.innerContainer:getPosition())
    local listSize = lv:getContentSize()

    local mathabs = math.abs
    local changeMideItem
    changeMideItem = function (para,eventType)
        local idx = math.floor((innerSize.height + para.y) / itemSize.width + 0.5) - 1
        if para.y == 0 then
            idx = len - 1
        end
        if para.y == listSize.height - innerSize.height then
            idx = 2
        end

        -- print("Idx"..idx)

        local allItem = lv:getItems()
        for i,v in ipairs(allItem) do
            if mathabs(i - idx) < 5 then 
                if i == idx then 
                    v.textId:enableBold(cc.size(1.2, 0))
                    v.textId:setColor(cc.c3b(0, 0, 0))
                    if eventType == "stop" then
                        local content = contentDic[i]
                        if pickerType == DatePickerType.PickerDay then 
                            self:checkDay(content,i)
                        elseif pickerType == DatePickerType.PickerMonth then 
                            self.month = content
                            self:checkDay()
                        elseif pickerType == DatePickerType.PickerYear then 
                            self.year = content
                            self:checkDay()
                        end
                    end
                else
                    v.textId:disableEffect()
                    v.textId:setColor(cc.c3b(159, 167, 173))
                end
            end
            
        end
    end

    lv:registerLoadingEvent(function (eventType,para)
        if eventType == "stop" then 
            local subPos = math.ceil(para.y) % itemSize.width 
            if mathabs(subPos) <= itemSize.width / 2 then 
                subPos = -subPos
            else
                subPos = itemSize.width - subPos
            end
            lv.innerContainer:runAction(cc.Sequence:create(cc.EaseSineOut:create(cc.MoveBy:create(0.2, cc.p(0, subPos))),
                cc.CallFunc:create(function ()
                    local innerPosy = lv.innerContainer:getPositionY()
                    lv.innerContainer:setPositionY(math.ceil(innerPosy))
                    changeMideItem({x = para.x, y = innerPosy},eventType)
                end)
            ))
        elseif eventType == "scrolling" then 
            changeMideItem(para,eventType)
        end
    end)

    performWithDelay(self, function ()
        local off = 1
        if pickerType == DatePickerType.PickerDay then 
            off = self.day + 1    
        elseif pickerType == DatePickerType.PickerMonth then 
            off = self.month + 1
        elseif pickerType == DatePickerType.PickerYear then 
            off = table.nums(self.yearDic) - 1
        end
        lv:jumpTo(off)

        local para = cc.p(lv.innerContainer:getPosition())
        para.eventType = "stop"
        changeMideItem(para)
    end, 0.1)

    lv.changeMideItem = changeMideItem
    return lv
end

return DatePickerFrame

### 关于 DeepLabV3 语义分割实战教程 #### 深度解析 DeepLabV3 的结构与特性 DeepLabV3 是一种先进的图像语义分割方法,其核心在于通过空洞卷积(Atrous Convolution)、空间金字塔池化模块(ASPP)来增强特征提取能力。该模型能够有效地捕捉不同尺度的对象并保持高分辨率的细节[^1]。 #### PyTorch 版本的 DeeplabV3 实现指南 对于希望基于 PyTorch 平台构建和训练自己的 DeepLabV3 模型的研究者来说,《憨批的语义分割重制版9——Pytorch 搭建自己的DeeplabV3+语义分割平台》提供了详细的指导文档。这份资料不仅涵盖了理论基础还包含了完整的代码实例,帮助读者理解如何调整参数以适应特定应用场景的需求。 ```python import torch from torchvision import models # 加载预训练权重 deeplab_model = models.segmentation.deeplabv3_resnet101(pretrained=True) # 设置为评估模式 deeplab_model.eval() def predict(image_tensor): """预测给定图片张量对应的类别标签""" with torch.no_grad(): output = deeplab_model(image_tensor)['out'] return output.argmax(1).squeeze().cpu().numpy() ``` #### 数据集准备与处理流程 为了使模型更好地学习到各类物体之间的区别,在实际操作过程中通常会采用批量加载的方式读取数据,并对其进行标准化等预处理操作。例如,在 Keras 中可以创建如下所示的数据管道用于训练: ```python train_dataset = tf.data.Dataset.from_generator( generator, args=[], output_types=(tf.float32, tf.int64), output_shapes=((None, None, 3), (None, None)) ) batched_train_data = train_dataset.batch(batch_size=4) ``` 这里展示了 TensorFlow 下的一个简单例子,而在 PyTorch 生态系统内也有类似的工具链可供选用[^5]。 #### 调整模型配置优化性能表现 根据不同硬件条件和个人偏好可以选择不同的骨干网络作为编码部分的基础框架。比如 MobileNet V2 更适合资源受限设备上的部署;而对于计算能力强且追求更高精度的任务,则推荐使用 Xception 或 ResNet 系列中的某些变体版本。具体设置可以通过修改 `model_variant` 参数完成,如需利用 Xception_65 骨干网则应指定相应的 atrous rates 和解码步长[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值