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