bones脚本篇 - 内置标签scroller

本文介绍了Bones脚本中scroller标签的使用方法,用于实现滚动效果。scroller标签使得原本不支持滚动的bones元素能够支持滚动。通过将image放入scroller并进行lua初始化,可以实现滚轮滚动展示图片未显示的部分。虽然名为滚动image,实际上是scroller以视口模式显示image的一部分。同时,文章提到了滚动事件的响应以及与C++接口的对应关系,并提供了相关代码示例和完整代码的下载链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

scroller标签是跟滚动相关的标签,bones标签默认是没有滚动功能的,如果标签需要滚动那么只要放到scroller里 就可以支持滚动了
下面演示下如何使用scroller
先看效果图:
这里写图片描述
在右边的图片上滚轮滚动可以显示图片未显示的部分
这里写图片描述

首先需要把image放到scroller下

      <!--垂直滚动显示图片-->
      <scroller>
        <image></image>
        <event name ="onWheel" phase ="capturing" module ="test" func ="onWheel"></event>
      </scroller>

image放到scroller下 再在lua中初始化就可以支持滚动了,这里scroller响应滚轮事件是因为 由于没有滚动条的缘故所以需要用滚轮事件来演示效果,在早期的版本中scroller是自带滚轮响应的,但经过考虑后还是去掉了这部分代码 主要是考虑到scroller嵌套scroller的问题 如果自带响应需要做一些过滤操作,比较麻烦。
lua中的初始化代码:

function mod.onCreate(self)
    self.image_ = self:getChildAt(0)
    self.scroller_ = self:getChildAt(1)

    --设置image标签显示完整的图片
    local pm_key = "lena"
    local pm = bones.resource.getPixmap(pm_key)
    local w, h = bones.pixmap.getSize(pm)
    print(w)
    self.image_:setSize(w, h)
    self.image_:setContent(pm_key)

    --设置scroller大小 即视口 演示 垂直滚动 水平方向可以和图片一样大
    self.scroller_:setSize(w, h / 2)
    self.scroller_:setLoc(w + 10, 10)
    --需要滚动显示image标签大小为图片大小
    local image = self.scroller_:getChildAt(0)
    image:setSize(w, h)
    image:setContent(pm_key)
    --scroller垂直方向的滚动范围是0-h/2 设置成image的高 scroller会自动计算滚动范围
    self.scroller_:setScrollInfo(h, false)
    self.scroller_.image_ = self.scroller_:getChildAt(0)
end

仔细看看代码 会发现 虽然说是滚动image,但image实际上并未滚动,而是scroller以视口的模式显示了image的一部分

接下来还要加上滚动事件的响应来演示效果

--滚轮事件监听放到scroller上 
function mod.onWheel(self, e)
--处理滚轮事件 滚动scroller标签
    local target = e:target()
    if target == self.image_ then
        --滚轮值通常是120的倍数
        local delta
        --计算滚动的像素 水平滚动
        if e:dx() ~= 0 then
            delta = -e:dx() / 120 * 10;
            self:setScrollPos(self:getScrollPos(true) + delta, true)
        end
        --垂直滚动
        if e:dy() ~= 0 then
            delta = -e:dy() / 120 * 10;
            self:setScrollPos(self:getScrollPos(false) + delta, false)
        end

    end
end

到此 就可以试试在右边的图片上滚动滚轮来看效果了。
到目前为止lua中的方法名和参数都与C++接口保持一致,我觉得注释应该还算详细,比如scroller文档在bones.h中BonesScroller接口里,可以看下setScrollInfo和
setScrollPos再对应上面lua脚本,应该还是很容易明白代码意思:

    /*!设置子控件可显示的尺寸
    @param[in] total 子控件可显示的尺寸
    @param[in] horizontal true则为水平滚动属性 false为垂直滚动属性
    @note scroller的size作为视口的尺寸 total 与视口的差值即为最大滚动范围
    */
    virtual void setScrollInfo(BonesScalar total, bool horizontal) = 0;
    /*!设置当前滚动值
    @param[in] cur 当前滚动值
    @param[in] horizontal true则为水平滚动属性 false为垂直滚动属性
    */
    virtual void setScrollPos(BonesScalar cur, bool horizontal) = 0;

本篇完整代码下载:
http://blog.youkuaiyun.com/dalixux/article/details/48830721

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值