折叠菜单,用过jquery accordion的同学都知道是啥玩艺儿~,图片效果就是介样:

cocos2dx不带有此控件,因此我们动手来实现一个。

原理很简单,展开的时候往listview里insertCustomItem,收起的时候从listview里removeItem。下面给出一个功能丰富的折叠菜单控件。
先看控件主类:

  1. --[[
  2. 二级折叠菜单组
  3.  
  4. 构造:
  5. local groupData = {
  6. {
  7. title = '分类1',
  8. items = {
  9. { id = 1, count = 20, lv = 19 },
  10. { id = 2, count = 21, lv = 21 },
  11. { id = 3, count = 22, lv = 23 },
  12. }
  13. },
  14. {
  15. title = '图腾',
  16. items = {
  17. { id = 500001, count = 32, lv = 19 },
  18. { id = 500002, count = 21, lv = 65 },
  19. { id = 500003, count = 22, lv = 27 },
  20. }
  21. },
  22. {
  23. title = '武器',
  24. items = {
  25. { id = 101002, count = 20, lv = 45 },
  26. { id = 101003, count = 21, lv = 34 },
  27. }
  28. },
  29. }
  30. self._goodsCateList = gm.Common.UIMenuList.new( cc.size( 310, 510 ), groupData )
  31.  
  32. -- 必须设置标题类型和内容类型,重写可改变样式
  33. self._goodsCateList:setClass( gm.Market.MarketMenuTitle, gm.Market.MarketMenuItem )
  34.  
  35. -- 可选参数,是否可同时展开多个分组,默认false
  36. self._goodsCateList.showMulti = true
  37.  
  38. -- 可选参数,是否默认选中组中第一个item
  39. self._goodsCateList.autoSelectFirstItem = true
  40.  
  41. -- 可选参数,选中的title索引,默认为1
  42. self._goodsCateList.defaultGroup = 1
  43.  
  44. -- 可选参数,选中的item索引,默认为1
  45. self._goodsCateList.defaultItem = 1
  46.  
  47. 加入舞台:
  48. self._goodsCateList:addToParent( self._bg, { x = 0, y = 0 } )
  49.  
  50. @author cc
  51. --]]
  52.  
  53. gm = gm or {}
  54. rm = rm or {}
  55.  
  56. local gm = gm
  57. local rm = rm
  58.  
  59. gm.Common = gm.Common or {}
  60. gm.Common.UIMenuList = class( "Common.UIMenuList" )
  61. gm.Common.UIMenuList._name = "Common.UIMenuList"
  62.  
  63. local g = gm.Common.UIMenuList
  64.  
  65. ---------------------------------------------------------------------------------
  66. -- --
  67. -- 以下定义私有部分 --
  68. -- --
  69. ---------------------------------------------------------------------------------
  70.  
  71. local function log( ... )
  72. print( '>>>>gm.Common.UIMenuList<<<<:', ...)
  73. end
  74.  
  75. -- 点击标题项
  76. function g:_onTouchTitle( sender )
  77. local titleInst = sender._inst
  78.  
  79. -- 收缩点击项
  80. if titleInst.selected then
  81. self:_unSelectTitleInst( titleInst )
  82. return
  83. end
  84.  
  85. -- 如果同时只展开一个分组,则隐藏上次展开的
  86. if not self._showMulti and self._selectedTitle then
  87. self:_unSelectTitleInst( self._selectedTitle )
  88. end
  89.  
  90. -- 展开点击项
  91. local index = self._listView:getIndex( sender )
  92. local group = titleInst.data
  93. local itemInst
  94. for itemIdx, itemData in ipairs( group.items ) do
  95. itemInst = self:_createItemInst( itemData )
  96. self._listView:insertCustomItem( itemInst.ui, index + itemIdx )
  97.  
  98. -- 将第一项设置为当前选中的内容项
  99. if self._autoSelectFirstItem and itemIdx == then
  100. self.selectedItem = itemInst
  101. end
  102. end
  103.  
  104. -- 设置当前选中的标题项
  105. self.selectedTitle = titleInst
  106. end
  107.  
  108. -- 点击内容项
  109. function g:_onTouchItem( sender, eventType )
  110. if eventType == ccui.TouchEventType.ended then
  111. self.selectedItem = sender._inst
  112. end
  113. if self._itemClickFunc then
  114. self._itemClickFunc( sender, eventType )
  115. end
  116. end
  117.  
  118. -- 收起标题项对应的分组
  119. function g:_unSelectTitleInst( titleInst )
  120. local index = self._listView:getIndex( titleInst.ui )
  121. local group = titleInst.data
  122. local itemInst
  123.  
  124. for i = , #group.items do
  125.  
  126. -- 析构删除项
  127. itemInst = self._listView:getItem( index + )._inst
  128. itemInst:finalize()
  129.  
  130. -- 选中项被删除
  131. if self._selectedItem and self._selectedItem == itemInst then
  132. self._selectedItem = nil
  133. end
  134.  
  135. self._listView:removeItem( index + )
  136. end
  137. titleInst.selected = false
  138.  
  139. if titleInst == self._selectedTitle then
  140. self._selectedTitle = nil
  141. end
  142. end
  143.  
  144. -- 创建标题项
  145. function g:_createTitleInst( data )
  146. if not self._titleCls then
  147. log( '没有设置标题类型!' )
  148. return
  149. end
  150.  
  151. local titleInst = self._titleCls.new( )
  152. titleInst.data = data
  153. titleInst.ui._inst = titleInst
  154. makeTouchHandle( self, titleInst.ui, self._onTouchTitle )
  155. return titleInst
  156. end
  157.  
  158. -- 创建内容项
  159. function g:_createItemInst( data )
  160. if not self._itemCls then
  161. log( '没有设置内容类型!' )
  162. return
  163. end
  164.  
  165. local itemInst = self._itemCls.new( )
  166. itemInst.data = data
  167. itemInst.ui._inst = itemInst
  168. makeTouchHandle2( self, itemInst.ui, self._onTouchItem )
  169. return itemInst
  170. end
  171.  
  172. -- 初始化
  173. function g:_initialize( )
  174. self._listView = ccui.ListView:create()
  175. self._listView:setBounceEnabled( true )
  176. self._listView:setDirection( ccui.ScrollViewDir.vertical )
  177. self._listView:setSize( self._size )
  178.  
  179. if not self._groupData then
  180. log( '分组数据为空!' )
  181. return
  182. end
  183.  
  184. local titleInst, itemInst
  185. self._titleInstList = {}
  186.  
  187. for groupIdx, group in ipairs( self._groupData ) do
  188.  
  189. titleInst = self:_createTitleInst( group )
  190. self._listView:pushBackCustomItem( titleInst.ui )
  191. table.insert( self._titleInstList, titleInst )
  192.  
  193. -- 展开默认分组
  194. if self._defaultGroupIdx and groupIdx == self._defaultGroupIdx then
  195. self.selectedTitle = titleInst
  196.  
  197. for itemIdx, itemData in ipairs( group.items ) do
  198.  
  199. itemInst = self:_createItemInst( itemData )
  200. self._listView:pushBackCustomItem( itemInst.ui )
  201.  
  202. -- 选中默认项
  203. if self._defaultItemIdx and itemIdx == self._defaultItemIdx then
  204. self.selectedItem = itemInst
  205. end
  206. end
  207. end
  208. end
  209. end
  210.  
  211. ---------------------------------------------------------------------------------
  212. -- --
  213. -- 以下定义set, get 部分函数 --
  214. -- --
  215. ---------------------------------------------------------------------------------
  216.  
  217. function g:_getUi( )
  218. return self._listView
  219. end
  220.  
  221. -- 是否同时展开多个组
  222. function g:_setShowMulti( value )
  223. self._showMulti = value
  224. end
  225.  
  226. -- 获取数据
  227. function g:_getGroupData( )
  228. return self._groupData
  229. end
  230.  
  231. function g:_setGroupData( value )
  232. self._groupData = value
  233. end
  234.  
  235. -- 设置默认展开的分组索引
  236. -- @i value
  237. function g:_setDefaultGroup( value )
  238. self._defaultGroupIdx = value
  239. end
  240.  
  241. -- 设置默认选中的item索引
  242. --@i value
  243. function g:_setDefaultItem( value )
  244. self._defaultItemIdx = value
  245. end
  246.  
  247. -- 获取选中的标题项
  248. function g:_getSelectedTitle( )
  249. return self._selectedTitle
  250. end
  251.  
  252. function g:_setSelectedTitle( value )
  253. value.selected = true
  254. self._selectedTitle = value
  255. rm.BindManager.propertyChanged( self, "selectedTitle" )
  256. end
  257.  
  258. -- 获取选中的内容项
  259. function g:_getSelectedItem( )
  260. return self._selectedItem
  261. end
  262.  
  263. function g:_setSelectedItem( value )
  264. if self._selectedItem then
  265. self._selectedItem.selected = false
  266. end
  267. value.selected = true
  268. self._selectedItem = value
  269. rm.BindManager.propertyChanged( self, "selectedItem" )
  270. end
  271.  
  272. -- 设置点击item项的回调函数
  273. function g:_setItemClickFunc( value )
  274. self._itemClickFunc = value
  275. end
  276.  
  277. -- 设置是否自动选中组中第一个item
  278. function g:_setAutoSelectFirstItem( value )
  279. self._autoSelectFirstItem = value
  280. end
  281.  
  282. ---------------------------------------------------------------------------------
  283. -- --
  284. -- 以下定义公共部分 --
  285. -- --
  286. ---------------------------------------------------------------------------------
  287.  
  288. -- 构造
  289. -- @t size cc.size类型
  290. -- @t groupData 分组数据,结构如{ { title = tData, items = { iData1, iData2 } }, ... }
  291. function g:ctor( size, groupData )
  292. self._size = size or cc.size( , )
  293. self._groupData = groupData
  294. self._titleInstList = nil
  295. self._defaultGroupIdx = nil
  296. self._defaultItemIdx = nil
  297. self._selectedTitle = nil
  298. self._selectedItem = nil
  299. self._titleCls = nil
  300. self._itemCls = nil
  301. self._showMulti = false
  302. self._autoSelectFirstItem = false
  303. self._itemClickFunc = nil
  304. end
  305.  
  306. -- 设置标题项和内容项类型
  307. -- @t titleClass 继承自gm.Common.UIMenuItem,重写可改变样式
  308. -- @t itemClass 继承自gm.Common.UIMenuItem,重写可改变样式
  309. function g:setClass( titleClass, itemClass )
  310. self._titleCls = titleClass
  311. self._itemCls = itemClass
  312. end
  313.  
  314. -- 添加到舞台
  315. -- @widget parent 父显示对象
  316. -- @t pos 位置,{ x = , y = }
  317. -- @i zOrder 层级
  318. function g:addToParent( parent, pos, zOrder )
  319. if not parent then
  320. log( '父显示对象不可为空!' )
  321. return
  322. end
  323. self:_initialize()
  324. zOrder = zOrder or
  325. pos = pos or cc.p( , )
  326. self._listView:setPosition( pos )
  327. parent:addChild( self._listView, zOrder )
  328. end
  329.  
  330. -- 刷新当前展开的分组,只可在互斥(showMulti = false)模式下使用
  331. -- @t group 数据,结构如{ title = tData, items = { iData1, iData2 } }
  332. function g:refreshSelectedTitle( group )
  333. if not self._selectedTitle then return end
  334. self:refreshTitle( self._selectedTitle, group )
  335. end
  336.  
  337. -- 刷新指定位置的分组
  338. -- @i titleIndex 分组索引
  339. -- @t group 组数据
  340. function g:refreshTitleAtIndex( titleIndex, group )
  341. local title = self._titleInstList( titleIndex )
  342. self:refreshTitle( title, group )
  343. end
  344.  
  345. -- 刷新指定分组
  346. -- @t 某个分组
  347. -- @t group 组数据
  348. function g:refreshTitle( title, group )
  349. local index = self._listView:getIndex( title.ui )
  350. local prevNumItems = title.selected and #title.data.items or
  351. local currNumItems = #group.items
  352. local deltaNum = prevNumItems - currNumItems
  353. local itemInst
  354.  
  355. -- 设置title数据
  356. title:_setData( group )
  357. self._groupData[ table.indexOf( self._titleInstList, title ) ] = group
  358.  
  359. -- title没展开,以下无需执行
  360. if not title.selected then return end
  361.  
  362. -- 设置item数据
  363. for itemIdx, itemData in ipairs( group.items ) do
  364. if itemIdx <= prevNumItems then
  365. itemInst = self._listView:getItem( index + itemIdx )._inst
  366. itemInst:_setData( itemData )
  367. else
  368. itemInst = self:_createItemInst( itemData )
  369. self._listView:insertCustomItem( itemInst.ui, index + itemIdx )
  370. end
  371. end
  372.  
  373. -- 旧数量比当前数量多,需要删除多余的item
  374. if deltaNum > then
  375. for i = , deltaNum do
  376. itemInst = self._listView:getItem( index + currNumItems + )._inst
  377. itemInst:finalize()
  378.  
  379. -- 选中项被删除
  380. if self._selectedItem and self._selectedItem == itemInst then
  381. self._selectedItem = nil
  382. end
  383.  
  384. self._listView:removeItem( index + currNumItems + )
  385. end
  386. end
  387. end
  388.  
  389. -- 刷新整个控件
  390. -- @t 控件数据,结构如构造函数同名参数所示
  391. function g:refresh( groupData )
  392. self._groupData = groupData
  393. if not self._groupData then
  394. log( '分组数据为空!' )
  395. return
  396. end
  397.  
  398. local prevNumTitles = #self._titleInstList
  399. local currNumTitles = #groupData
  400. local deltaNum = prevNumTitles - currNumTitles
  401. local titleInst
  402.  
  403. -- 刷新所有分组
  404. for groupIdx, group in ipairs( groupData ) do
  405. if groupIdx <= prevNumTitles then
  406. titleInst = self._titleInstList[ groupIdx ]
  407. self:refreshTitle( titleInst, group )
  408. else
  409. titleInst = self:_createTitleInst( group )
  410. self._listView:pushBackCustomItem( titleInst.ui )
  411. table.insert( self._titleInstList, titleInst )
  412. end
  413. end
  414.  
  415. -- 新分组比旧分组少,需要删除多余的title
  416. if deltaNum > then
  417. local numListItems = #self._listView:getItems()
  418.  
  419. -- 清空全部
  420. if currNumTitles == then
  421. for i = numListItems - , , - do
  422. titleInst = self._listView:getItem( i )._inst
  423. titleInst:finalize()
  424. end
  425. self._listView:removeAllItems()
  426. self._titleInstList = {}
  427. self._selectedTitle = nil
  428. self._selectedItem = nil
  429. return
  430. end
  431.  
  432. local lastTitleInst = self._titleInstList[ currNumTitles ]
  433. local index = self._listView:getIndex( lastTitleInst.ui ) + ( lastTitleInst.selected and #lastTitleInst.data.items or )
  434.  
  435. for i = numListItems - , index + , - do
  436. -- 析构被删除的title
  437. titleInst = self._listView:getItem( i )._inst
  438. titleInst:finalize()
  439.  
  440. -- 选中title被删除
  441. if self._selectedTitle and self._selectedTitle == titleInst then
  442. self._selectedTitle = nil
  443. end
  444.  
  445. -- 选中项被删除
  446. if self._selectedItem and self._selectedItem == titleInst then
  447. self._selectedItem = nil
  448. end
  449.  
  450. self._listView:removeItem( i )
  451. end
  452.  
  453. -- title列表中移除
  454. for i = prevNumTitles, currNumTitles + , - do
  455. table.remove( self._titleInstList, i )
  456. end
  457. end
  458. end
  459.  
  460. -- 析构
  461. function g:finalize()
  462. if self._listView then
  463. self._listView:removeFromParent()
  464. self._listView = nil
  465. end
  466. self._titleInstList = nil
  467. self._groupData = nil
  468. self._itemClickFunc = nil
  469. end

我们把折叠菜单抽象成标题项(title)和内容项(item),title即指标题项,展开标题项显示出来的内容项叫item。title和item均从uimenuitem派生而来,这们做的好处是我们可以方便的更改折叠菜单标题项和内容项的样式。

下面来看看uimenuitem.lua:

  1. --[[
  2. 折叠菜单项
  3.  
  4. @author cc
  5. --]]
  6.  
  7. gm = gm or {}
  8. rm = rm or {}
  9.  
  10. local gm = gm
  11. local rm = rm
  12.  
  13. gm.Common = gm.Common or {}
  14. gm.Common.UIMenuItem = class( "Common.UIMenuItem" )
  15. gm.Common.UIMenuItem._name = "Common.UIMenuItem"
  16.  
  17. local g = gm.Common.UIMenuItem
  18.  
  19. ---------------------------------------------------------------------------------
  20. -- --
  21. -- 以下定义私有部分 --
  22. -- --
  23. ---------------------------------------------------------------------------------
  24.  
  25. ---------------------------------------------------------------------------------
  26. -- --
  27. -- 以下定义set, get 部分函数 --
  28. -- --
  29. ---------------------------------------------------------------------------------
  30.  
  31. -- 获取显示对象
  32. function g:_getUi( )
  33. return self._ui
  34. end
  35.  
  36. function g:_getData( )
  37. return self._data
  38. end
  39.  
  40. -- 设置数据
  41. function g:_setData( value )
  42. self._data = value
  43. end
  44.  
  45. function g:_getSelected( )
  46. return self._selected
  47. end
  48.  
  49. -- 设置选中状态
  50. function g:_setSelected( value )
  51. self._selected = value
  52. end
  53.  
  54. ---------------------------------------------------------------------------------
  55. -- --
  56. -- 以下定义公共部分 --
  57. -- --
  58. ---------------------------------------------------------------------------------
  59.  
  60. -- 构造
  61. function g:ctor( )
  62. self._selected = false
  63. self._data = nil
  64.  
  65. self:initialize()
  66. end
  67.  
  68. -- 初始化
  69. function g:initialize( )
  70. self._ui = nil
  71. end
  72.  
  73. -- 析构
  74. function g:finalize( )
  75. if self._ui then
  76. self._ui:removeFromParent( )
  77. self._ui = nil
  78. end
  79. end

下面举个简单的使用例子,

  1. local groupData = {
  2. {
  3. title = { cate = , cate_desc = '技能书' },
  4. items = {
  5. {
  6. sub_cate = , sub_cate_desc = '一级技能书',
  7. },
  8. {
  9. sub_cate = , sub_cate_desc = '二级技能书',
  10. },
  11. {
  12. sub_cate = , sub_cate_desc = '三级技能书',
  13. }
  14. }
  15. },
  16. {
  17. title = { cate = , cate_desc = '宝石' },
  18. items = {
  19. {
  20. sub_cate = , sub_cate_desc = '攻击宝石',
  21. },
  22. {
  23. sub_cate = , sub_cate_desc = '暴击宝石',
  24. }
  25. }
  26. },
  27. {
  28. title = { cate = , cate_desc = '月石' },
  29. items = {
  30. {
  31. sub_cate = , sub_cate_desc = '很好的月石',
  32. }
  33. }
  34. },
  35. }
  36.  
  37. self._goodsCateList = gm.Common.UIMenuList.new( cc.size( , ), groupData )
  38. self._goodsCateList:setClass( gm.Market.MarketMenuTitle, gm.Market.MarketMenuItem )
  39. self._goodsCateList.showMulti = true
  40. self._goodsCateList.defaultGroup =
  41. self._goodsCateList.defaultItem =
  42. self._goodsCateList:addToParent( self._bg, cc.p( , ) )

这里方便演示手写了分类数据,但一般情况下是用遍历生成的。通过上面这段代码,我们生成了一个折叠菜单,效果即本文首部的演示图片。

这里用到的两个类gm.Market.MarketMenuTitle和gm.Market.MarketMenuItem即是用来自定义折叠菜单样式的,代码也一块贴出:

  1. --[[
  2. 市场折叠菜单标题项
  3.  
  4. @author cc
  5. --]]
  6.  
  7. gm = gm or {}
  8. rm = rm or {}
  9.  
  10. local gm = gm
  11. local rm = rm
  12.  
  13. gm.Market = gm.Market or {}
  14. gm.Market.MarketMenuTitle = class( "Market.MarketMenuTitle", gm.Common.UIMenuItem )
  15. gm.Market.MarketMenuTitle._name = "Market.MarketMenuTitle"
  16.  
  17. local g = gm.Market.MarketMenuTitle
  18.  
  19. ---------------------------------------------------------------------------------
  20. -- --
  21. -- 以下定义私有部分 --
  22. -- --
  23. ---------------------------------------------------------------------------------
  24.  
  25. ---------------------------------------------------------------------------------
  26. -- --
  27. -- 以下定义set, get 部分函数 --
  28. -- --
  29. ---------------------------------------------------------------------------------
  30.  
  31. -- 设置数据
  32. function g:_setData( value )
  33. self._data = value
  34.  
  35. self._labelName:setText( value.title.cate_desc )
  36. end
  37.  
  38. -- 设置选中状态
  39. function g:_setSelected( value )
  40. self._selected = value
  41.  
  42. local texture = value and 'tab_btn_4.png' or 'tab_btn_3.png'
  43. self._imgBg:loadTexture( texture, ccui.TextureResType.plistType )
  44. end
  45.  
  46. ---------------------------------------------------------------------------------
  47. -- --
  48. -- 以下定义公共部分 --
  49. -- --
  50. ---------------------------------------------------------------------------------
  51.  
  52. -- -- 构造
  53. -- function g:ctor( )
  54. -- g.super.ctor( self )
  55. -- end
  56.  
  57. -- 初始化
  58. function g:initialize( )
  59. g.super.initialize( self )
  60. self._ui = ccs.GUIReader:getInstance():widgetFromJsonFile('ui/new_market_menu_title.json')
  61.  
  62. self._labelName = self._ui:getChildByName('LabName')
  63. self._imgBg = self._ui:getChildByName('ImgBg')
  64. end
  65.  
  66. -- -- 析构
  67. -- function g:finalize( )
  68. -- g.super.finalize( self )
  69. -- end
  1. --[[
  2. 市场折叠菜单内容项
  3.  
  4. @author cc
  5. --]]
  6.  
  7. gm = gm or {}
  8. rm = rm or {}
  9.  
  10. local gm = gm
  11. local rm = rm
  12.  
  13. gm.Market = gm.Market or {}
  14. gm.Market.MarketMenuItem = class( "Market.MarketMenuItem", gm.Common.UIMenuItem )
  15. gm.Market.MarketMenuItem._name = "Market.MarketMenuItem"
  16.  
  17. local g = gm.Market.MarketMenuItem
  18.  
  19. ---------------------------------------------------------------------------------
  20. -- --
  21. -- 以下定义私有部分 --
  22. -- --
  23. ---------------------------------------------------------------------------------
  24.  
  25. ---------------------------------------------------------------------------------
  26. -- --
  27. -- 以下定义set, get 部分函数 --
  28. -- --
  29. ---------------------------------------------------------------------------------
  30.  
  31. -- 设置数据
  32. function g:_setData( value )
  33. self._data = value
  34.  
  35. self._labelName:setText( value.sub_cate_desc )
  36. end
  37.  
  38. -- 设置选中状态
  39. function g:_setSelected( value )
  40. self._selected = value
  41.  
  42. self._imgSelected:setVisible( value )
  43. end
  44.  
  45. ---------------------------------------------------------------------------------
  46. -- --
  47. -- 以下定义公共部分 --
  48. -- --
  49. ---------------------------------------------------------------------------------
  50.  
  51. -- 构造
  52. function g:ctor( )
  53. g.super.ctor( self )
  54. end
  55.  
  56. -- 初始化
  57. function g:initialize( )
  58. g.super.initialize( self )
  59. self._ui = ccs.GUIReader:getInstance():widgetFromJsonFile('ui/new_market_menu_item.json')
  60.  
  61. self._labelName = self._ui:getChildByName('LabName')
  62. self._imgSelected = self._ui:getChildByName('ImgSelected')
  63. end
  64.  
  65. -- 析构
  66. function g:finalize( )
  67. g.super.finalize( self )
  68. end

cocos2dx-lua使用UIListView制作二级折叠菜单的更多相关文章

  1. DIV+CSS制作二级横向弹出菜单,略简单

    没有使用JavaScript控制二级菜单的显示,结果如上图所示. 代码如下: <!DOCTYPE html> <html> <head> <meta char ...

  2. jQuery制作右侧边垂直二级导航菜单

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  3. 个人练习:使用HTML+CSS制作二级菜单

    最近一直在学习HTML+CSS,刚看完如果制作下拉菜单部分,就想着做一个练练手. 先上成品图: 就是上面这个效果,横向菜单选项能点击,鼠标放在上面也能展开二级菜单,二级菜单也能点击,点击后就会在底下的 ...

  4. Excel应用----制作二级下拉菜单【转】

    应用: 原始数据源是两列的源数据,那该如何制作二级下拉菜单, 当然可以将这两列的数据源,转换成上面的那种格式,再用上面的方法来制作. 今天教大学的方法是直接通过这种两列式的数据源来制作下拉菜单,如果A ...

  5. CSS制作二级菜单时,二级菜单与一级菜单不对齐

    效果如图: 部分代码如图: <li><a href="#" target="_blank">关于我们</a> <ul& ...

  6. dedecms模版制作活动的折叠菜单

    需要做成这种样式 url请求为这样: http://m03.com/plus/list.php?tid=19 这些菜单项都有对应的tid项,页面刷新后,应该将所有的菜单折叠起来,对于tid=19的菜单 ...

  7. 滑动式折叠菜单 - Slashdot's Menu

    折叠菜单让你在尽可能小的地方放置尽可能多的内容,同时加大了操作的简便性,因此,深受前台设计师的喜爱.随着大家对动画效果的钟爱,折叠菜单也开始“动”起来了,本文介绍的就是 DimX 制作的滑动式折叠菜单 ...

  8. Cocos2dx lua 3D实例代码

    用cocoside 创建一个项目 cocos2dx lua 项目即可 ,然后替换掉gamescene 就可以,具体效果还有函数的参数,相信大家一看就明白.简单说下ide 创建的 cocos lua 项 ...

  9. 第一个Cocos2d-x Lua游戏

    我们的编写的第一个Cocos2d-x Lua程序,命名为HelloLua,从该工程开始学习其它的内容.创建工程我们创建Cocos2d-x Lua工程可以通过Cocos2d-x提供的命令工具cocos实 ...

随机推荐

  1. JAVA逻辑字符串判断真假

    package com.chinahrt.zyn.iteye; import javax.script.Bindings; import javax.script.Compilable; import ...

  2. HDU ACM 3177 Crixalis's Equipment

    Crixalis's Equipment Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  3. Gridheh 垂直居中

    Gridheh 垂直居中 上下居中 each columns  set layout ColumnDefValues.Layout = tlCenter 有colResize,拖动调整列宽. 但是没有 ...

  4. 【转】玩转log4j

    原文链接:http://www.cnblogs.com/shenliang123/archive/2012/05/02/2479286.html 由于最近正在扩展卫生局考务系统,由于上一次使用过一次该 ...

  5. HTML5每日一练之视频标签的应用

    与音频一样,在过去,我们如果想在Web上播放视频,也是都是通过Flash来播放,同样并不是所有的浏览器都安装了Flash播放器插件,而现在我们在HTML5中,就能完全脱离Flash或其他的插件来播放视 ...

  6. USB的四种传输类型

    USB协议规定了4种传输类型:批量(bulk)传输,等时传输(同步传输),中断传输和控制传输.

  7. hdu 1199 Color the Ball

    http://acm.hdu.edu.cn/showproblem.php?pid=1199 Color the Ball Time Limit: 2000/1000 MS (Java/Others) ...

  8. AutoCAD.NET 不使用P/Invoke方式调用acad.exe或accore.dll中的接口(如acedCommand、acedPostCommand等)

    使用C#进行AutoCAD二次开发,有时候由于C#接口不够完善,或者低版本AutoCAD中的接口缺少,有些工作不能直接通过C#接口来实现,所以需要通过P/Invoke的方式调用AutoCAD的其他DL ...

  9. flask中的request对象方法

    'accept_charsets','accept_encodings','accept_languages','accept_mimetypes','access_route','applicati ...

  10. HDU 1242 Rescue (BFS(广度优先搜索))

    Rescue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submis ...