当前位置:  编程技术>移动开发
本页文章导读:
    ▪App使用刷榜乱象调查:刷榜公司谋划自律        App应用刷榜乱象调查:刷榜公司谋划自律 最近两年,许怀哲和刘雄都在经营着一个外界看起来颇为神秘的生意——App刷榜。 通过刷榜,他们能使一个原本无人问津的App应用,在两三个小时.........
    ▪ CCScrollView 跟 CCLabelTTF 组成CCScrollLabel        CCScrollView 和 CCLabelTTF 组成CCScrollLabel在一些项目中,经常会遇到文本很长,但是美术设计的对话框又不够大,以至于文本溢出对话框(如任务描述文字等)。为解决这个创建问题,本人写了一.........
    ▪ jquerymobile-12 拆分旋钮列表(Split button lists)       jquerymobile-12 拆分按钮列表(Split button lists)在开发的过程中我们需要在列表上做一些操做,这时候我们就可以在列表的结尾,添加一些可操作的按钮。jquerymobile为我们提供方便的方式实现这样.........

[1]App使用刷榜乱象调查:刷榜公司谋划自律
    来源: 互联网  发布时间: 2014-02-18
App应用刷榜乱象调查:刷榜公司谋划自律

最近两年,许怀哲和刘雄都在经营着一个外界看起来颇为神秘的生意——App刷榜。

通过刷榜,他们能使一个原本无人问津的App应用,在两三个小时内,冲到苹果App Store排行榜的前列,从而让客户公司所开发的App有更大几率获得苹果iPhone、iPad用户的注意,以及投资人的青睐。

对那些命运系于用户数量的App开发公司而言,刷榜算得上最实惠有效的推广渠道。据刘雄透露,通过刷榜,一款应用得到一个新增用户的成本仅相当于传统推广渠道的三分之一。

刷榜一时成为部分开发公司“搏出位”的秘诀。客户不断的刷榜公司亦从中获取着高达30%以上的利润。

在刷榜公司看来,他们行走在苹果公司所制定的犯规线以外,所从事的是“阳光下的商业行为”。而有部分App开发人士则谴责刷榜,认为这种行为破坏公平原则,挤压了那些“刷不起榜”的应用的生存空间。

不过这些谴责未影响许怀哲和刘雄的生意,他们的刷榜生意越做越大。许怀哲已开始和电视台接洽,着手为客户的App应用定制节目或嵌入广告。刘雄则计划着将刷榜生意做到国外去——他准备去刷美国、日本、德国的榜单。

百万App过独木桥

对一个应用来说,在App Store榜单中的排名至关重要。无法挤进榜单的应用,大多埋没于上百万款应用中不为人知,成为没有下载量的“僵尸应用”。

1月18日下午,北京北五环的一个写字楼里,雄文网络CEO刘雄坐在办公室的电脑前,接受或拒绝着客户们的刷榜要求。他应下一单业务,就意味着几个小时后,某款应用在App Store中的下载量迎来一轮暴增。

目前,雄文网络已是国内刷榜行业前三强。

据刘雄介绍,目前国内成规模的刷榜公司大致有十家左右。这个数字得到了同样从事刷榜的解决网CEO许怀哲的认可。

原本指挥着手下水军做网络投票以及注册QQ号生意的刘雄,在2010年发现了刷榜这个商机。在2008年,苹果公司推出了App Store。通过这个“橱窗”,由第三方开发者所开发的App应用程序得以与iPhone、iPad用户“触电”。据苹果公司发布的2013年Q1季报显示,App Store在155个国家向5亿用户提供77.5万个应用。

“对一个应用来说,在App Store榜单中的排名至关重要。”刘雄说,iPhone 4S屏幕上,一页榜单只显示4个应用,而用户的耐心和精力则比较有限,“同一款应用,排名第5和第25时,真实的用户下载量会有5到7倍的区别。”

那些无法挤进榜单的应用,则大多埋没于数十万款应用中不为人知,成为没有下载量的“僵尸应用”。

“下载量和排名等数据,是开发者寻找投资时投资人最先关注的方面。”App应用“大姨吗”的创始人柴可说。

据科技网站AppYING的分析,决定应用在榜单中排名的因素,有下载量、评论打分、当天激活率、下载转化率、账号情况等十个之多。不过,对于各个因素所占的权重,外界却难以揣摩。

水军刷榜是传说?

刘雄说,其刷榜是通过靠四五千名水军完成。而另一个同行则告诉新京报记者,目前多数是用程序自动刷榜,“人工”的说法只是对外宣称。

经过一段时间尝试,刘雄的团队“研究透了排名的算法”,“也就是掌握了App刷榜的核心技术”。为了向“既不相信能刷到排名,又怕被下架”的客户证明,他特地上线了一款自己公司开发的应用,刷给客户看。

据刘雄透露,其刷榜是通过靠原来做网络投票时积累下来的4000—5000名水军完成。当有任务时,刘雄公司的管理人员会通过QQ群以及后台管理系统分派任务。一声令下,散布于全国范围内的几千名拥有苹果账号的水军就会利用电脑上的iTunes(苹果公司推出的客户端、多媒体管理软件)集中下载客户的应用,“几乎不用iPhone”。

“一般来说,冲到TOP25需要五六千个操作,冲到TOP10则需要1万多个操作。”刘雄自信,三至四个小时内,他的团队可以使一款排名靠后的应用冲到榜单的任何位置。

据刘雄介绍,水军每完成一个应用下载,他会向其支付几毛钱的酬劳,加上投票等其他业务,一个水军一月能拿到1000元到3000元不等的收入。为了鼓励水军在线,他还设计了一套网上签到系统,对在线率高的人给予增加任务量等奖励。

刘雄称,目前其麾下水军的在线率可保持在80%左右,如果遇到任务量特别大时,他还会找同行“串点人”。

不过,一位不愿透露姓名的刷榜公司负责人却称,目前多数的刷榜是以虚拟方式完成,“单纯依靠大规模地组织人工刷榜是不现实的。”他说,刷榜公司会在电脑上设计一个程序,该程序会自动不断变换IP地址、无限次地去申请Apple ID并下载应用;同时,员工会盯着电脑,根据情况变化及时干预。

该人士称,他的刷榜团队只有十几名员工,其刷榜能力却已位居同行业的前列。

对于“有的同行会对外宣称是依靠人工刷榜”,他解释说,刷榜这行“是千万不能激怒苹果的”,而苹果“非常忌讳拿机器刷榜”,“组织水军刷榜虽说不是真实用户的行为,但毕竟还是人,而不是机器在下载”。

刷到TOP5报价2.5万

一家位于朝阳区的刷榜公司提供的价格表显示,刷榜分为冲榜和维护排名两种,其中冲榜方面,冲到App Store免费总榜的TOP5的价格为2.5万元。

根据许怀哲的描述,App推广主要有刷榜、论坛推广、口碑传播、微博营销等几种方式。与后几者相比,刷榜“花钱最少、见效最快”,故而“性价比最高”。

新京报记者以“急需做推广的开发者”的身份,向一家位于朝阳区的刷榜公司咨询了价格。这家公司提供的价格表显示,刷榜分为冲榜和维护排名两种,其中冲榜方面,冲到App Store免费总榜的TOP5的价格为2.5万元,TOP10、TOP25、TOP50、TOP100、TOP200的价格分别为1.7万元、1.1万元、0.6万元、0.36万元以及0.18万元,此外还需再支付相当于冲榜价格10%的税款。

按照刘雄的说法,一般冲榜的时间仅需3—4个小时。此后,如果客户想要使应用继续保持排名而不至于暴跌,则需要向刷榜公司另行支付维护费。上述刷榜公司的价格表显示,TOP5、TOP10、TOP25、TOP50、TOP100维持一天的费用分为是2.8万元、1.8万元、1.3万元、0.7万元以及0.38万元。

“真实的价格相当于市场上报价的80%。”刘雄说,刷到TOP1的价格是4万多元——毕竟,多家刷榜公司都瞄着第一的“宝座”,夺魁的难度“非常大”。

而在“五一”、“十一”、圣诞等假期,用户下载高峰期时,刘雄还会将刷榜的价格调高10%到30%。

刷榜之前,客户需要预付全款,“如果客户要求进入TOP10,那么即使我们最后刷到第11位,我们也全款退还”——刷榜2年多来,刘雄达不到客户要求而退款的情况“还没出现过”。

按照刘雄的估计,依靠传统推广方式,App应用新增一个用户的成本“在10块钱左右”,而通过刷榜,每个新增用户的成本折合“在1元到3元之间”。

1月25日,《商业价值》主笔夏勇峰在一个主题为“App刷榜那些事”的活动上举例称,他的一个做应用的朋友,不久前以一种传统的方式推广应用,花费60万元得到了3万个真实用户,平均每个用户的成本折合20元;另一个20多人的游戏团队,每个月花费几十万元进行刷榜,随着新增用户增多,其每个月的盈利保持在200万元左右。

夏勇峰援引该游戏团队创始人的话说,“运用刷榜这种营销手段,公司取得了不错的收益,并且获得了可持续的发展”。

同行协商瓜分TOP10

2012年的7、8月份,刷榜市场上曾爆发过一轮价格战。最终价格战在“同行们坐下来谈一谈”后平息,同样以这种方式解决的还有“榜单的瓜分”。

“当一夜之间发现自己获得大量的用户和数据后,移动互联网的从业者都会觉得很亢奋,甚至肾上腺素都会往上升。”夏勇峰说,刷榜容易使人“上瘾”。

“上瘾”所产生的效果,就是刷榜成为移动互联网界公开的“潜规则”。经济之声曾报道称,截至去年12月,App中国区总榜单中,有40%的应用正在进行或进行过刷榜,其中游戏类超50%。

“前200名中,至少有70%刷过榜。”刘雄说。

在“App刷榜那些事”的活动现场,一位科技网站的编辑出示的图表显示,某一日,游戏分榜中出现过一游戏公司开发的5款游戏占领前5位的“盛景”;而一款受众有限的新闻类应用则曾在圣诞节的清晨5点“悄悄”爬进了总榜的第9位。

随着刷榜的流行,刷榜行业的竞争也愈发激烈。

刘雄称,随着后进者的增多,2012年的七八月份,刷榜市场上爆发过一轮价格战。

“战况非常激烈。”刘雄回忆说,当时一家刷榜公司的报价比另一家低500元,作为反击,另一家就再低上1000元,“甚至有的为了留住客户,赔本都敢做。”

最终,价格战在“同行们坐下来谈一谈”后悄然平息,“大家都知道,继续打下去的话,吃亏的还是我们自己。”刘雄介绍说。

同样以这种“友好协商”方式解决的还有“榜单的瓜分”。“每家公司都想多刷几个应用进TOP10,但就只有10个名额。”刘雄说,本来进入TOP10需要6000个下载量,如果同行间恶意竞争的话,那可能7000个下载量都不够。同行们一番协商后达成的共识是,“和平相处,轮着来”,“比如说,这个月你3个,我2个,别家1个”,而下一个月,各家名额再协商分配。

大客户五六十万“包月”

刘雄的大客户,会为一款应用每月斥资五六十万“包月”刷榜。刘雄的刷榜公司目前每月销售收入超过几百万元。

手法各异的刷榜方式,按其操作方式不同,被行业归纳为“六大流派”:短时间内借助刷榜排名迅速上扬的,为“电梯流”;选在周五晚上刷榜,以期在周末早上第一时间与用户见面的,为“周末效应流”;面临用户压力或正在融资,此时不想“出问题”而短暂刷一下的,为“保榜单流”。

此外,第一次刷榜用力过猛造成排名飙升的,为“爆发流”;不定期刷榜,或者其他原因造成排名骤起骤降的,为“无脑周期流”;那些明面宣传、暗地刷榜或者于新版发布前后刷榜的,为“新版流”。

根据客户实力不同,刘雄把他的客户分为“大客户”、“小客户”和“中型客户”。其中,大客户是指那些为一款应用每月斥资五六十万“包月”刷榜的公司;中型客户的刷榜周期以周计,而小客户往往只刷一两天。

刘雄说,他以做大客户业务为主,目前其公司每月刷榜的销售收入达几百万元。“最近几年,刷榜的利润率有所下降,大约在30%—40%之间。”刘雄称,去年初期时他获得了一笔200万的天使投资,一年时间内该投资人已获利三四倍。

许怀哲就是被高利润所吸引而涉足刷榜业的。在此之前,这位“赢在中国”第一季创业挑战赛的12强选手曾考虑过开发App应用。权衡一番后,相比没有清晰商业模式的应用程序,他认为刷榜可以“短平快”地赚到钱。

“刷榜利润确实高。”许怀哲透露称,其公司负责推介刷榜业务的销售人员中,业绩突出的销售人员的月收入远超普通白领。

绝望的开发者

见识到刷榜后,一位开发者对App Store里这种简单粗暴、金钱开道的做法感到绝望。

重奖之下,销售人员四面出击,为这项业务开土拓疆。

草根创业者张翮为其开发的运动应用“益动GPS”进行推广的第二天,QQ上就有几个陌生的头像打来招呼,“要不要做刷榜?”

“这是种不道德的行为。”张翮评价说,刷榜践踏了App Store中公平竞争的游戏规则。

夏勇峰说,他的一个朋友2011年时打算“静下心来做一款优秀的应用”,但见识到刷榜后,朋友对App Store里这种简单粗暴、金钱开道的做法,“感到很绝望”。

“对那些小开发者来说,刷榜的确有些不公平。”刘雄对刷榜有着自己的理解逻辑——“有排名的地方就有江湖”,而刷榜无非是把应用的排名优化得高一点,跟百度上的竞价广告一样的道理。

“一般大公司推出的应用,品质和排名本身就不错,刷榜对它们起到了锦上添花的作用;而对那些急需推广应用的小公司来说,刷榜能达到雪中送炭的效果。”

在刘雄看来,他所从事的完全是一项“阳光下的商业行为”。以广告费、信息服务费等名义为刷榜的客户开具发票的同时,他还试图纠正客户们的固有叫法,“不能再说刷榜,得改叫App排名优化。”

“我们做的是朝阳产业,为什么要叫得那么难听呢?”刘雄甚至打算,如果明年还有客户称“刷榜”,而不是“App排名优化”的话,他就中止合作。

目前,刘雄手下有2个工作人员专职负责苹果方面信息的搜集和分析,“他俩一个在微软工作过,一个是苹果的前员工”。跟随苹果的动态及时做出微调,使刘雄自信其公司的玩法完全符合苹果的规则,“如果确因违规遭到处罚,那我愿赌服输。”

刷榜公司的自律

几家较大的刷榜公司已谋划成立一个行业协会,加强行业自律,维护App Store的生态环境。同时,一些刷榜公司开始为未来筹谋。

去年上半年,苹果App Store突然调整了中国区榜单的排名算法,并以警告或下架等方式惩罚了部分存在刷榜嫌疑的应用。如此严厉的打击曾使刷榜公司短时间内销声匿迹。

许怀哲耗费2个月破解新算法后高调复出,“苹果每一次的打击,都会致使行业重新洗牌,技术落后的被淘汰,而能破解苹果算法的公司越做越大。”

在维护App Store整体环境方面,刘雄与苹果的诉求一致。他担心,刷榜疯狂地持续下去,或导致用户不再信任榜单——于刷榜公司而言,生存土壤的消失“恐怕是最坏的局面”。

刘雄说,他的公司中有个产品小组,负责对接到的应用进行品质判定,“如果用户体验太差,我们拒绝为其刷榜”。他同时称,一旦有刷榜公司将一款很差的应用的排名刷上去,那该刷榜公司将遭到几家同行的共同抵制。

“App Store的生态环境一定要维护好。”刘雄称,几家较大的刷榜公司甚至已谋划成立一个行业协会,以加强行业自律。

对于刷榜业的前景,刘雄和许怀哲的观点截然不同。届时,目前“市场规模2个亿左右”的刷榜业将走上下坡路。

不久前,湖南卫视一期《天天向上》的播出,使出现在节目中的5款App应用下载量瞬间进入TOP10,这给了许怀哲灵感,他认为这是能带来最真实有效下载的推广方式。他目前已组织团队开始与几个卫视台接洽,着手为客户的App应用定制节目或嵌入广告。

根据许怀哲的设想,未来电视节目营销将与刷榜并驾齐驱,成为其公司主要的推广渠道。

刘雄则计划“刷向国外”。近期新一轮的融资完毕后,他就带着队伍去刷向国外!


    
[2] CCScrollView 跟 CCLabelTTF 组成CCScrollLabel
    来源: 互联网  发布时间: 2014-02-18
CCScrollView 和 CCLabelTTF 组成CCScrollLabel

在一些项目中,经常会遇到文本很长,但是美术设计的对话框又不够大,以至于文本溢出对话框(如任务描述文字等)。为解决这个创建问题,本人写了一个CCScrollLabel,此类实现一个可以滚动查看文本的窗口。CCScrollLabel是基于cocos2d-x-2.0.4版本的。另外特别注意:cocos2d-x-2.0.3版本的CCScrollView有很大缺陷,建议基于该版本的游戏项目不要使用该CCScrollView。或者将项目中CCScrollView替换成至少2.0.4版本的。

其实这个功能实现起来应该说是很容易的,但是网上CCScrollView的资料手册不多。这里比较详细的说明一下2.0.4版本下的CCScrollView的各项特性:

  • CCScrollView拥有两个重要属性,一个是View(可视区域)。一个是Container(容器区域)。
  • View就是CCScrollView可以显示的区域,同时也是可以接受触摸消息的区域,即玩家可以滚动的大小。
  • Container是CCScrollView的直接子节点。其大小即可以滚动的内容面板大小。举个常见的例子:如果View大小是(200,200),Container大小是(200,800),那么我们就可以滚动Container以显示其不同区域。
  • CCScrollView创建后,默认将Container的左下角于自身的左下角对齐,即从Container的底部区域开始显示。例如:上面的例子,CCScrollView中显示的是Container最下方的(200,200)区域,而不是顶部的(200,200)区域。所以这个特性加大我们CCScrollLabel的难度,因为我们一般希望文本顶格显示。
  • Container的初始位置可以进行调用setContentOffset()进行偏移,这样就可以让Container的顶部作为一开始的显示区域。
  • 调用CCScrollView::addChild的节点,都会被CCScrollView更改锚点和坐标。新的锚点值和坐标值都将是(0,0)。这也是为什么Container一开始会在CCScrollView的左下角的原因,如果CCScrollView有了Container(无论是你提供的,还是默认创建的),那么addChild( A ),会将A节点作为Container的直接子节点。
  • 当Container的大小小于CCScrollView的大小的时候,CCScrollView一旦被滚动,就会试图将Container位置重置为创建时的位置,也就是将Container放在CCScrollView的左下角。这个也会加大我们创建CCScrollLabel的难度,因为当我们的文本很少时,我们无法将其顶格显示,因为只要滚动,文本即使一开始位于CCScrollView顶部,也会被CCScrollView强制拉回到最下角。
  • 那么CCLabelTTF有什么特性呢?看一下几个重要的地方:
  • CCLabelTTF可以设定字符串贴图的宽度,及字符串显示的宽度。例如:你有100个中文字符,我们可以设置CCLabelTTF的宽度为300,CCLabelTTF为我们生成的字符串texture,会保证其宽度为用户制定的宽度。高度是取max(用户制定的宽度,为了容纳字符串所需的最小高度)。所以我们可以在创建CCLabelTTF是将CCSizeMake( width, 0 )传给Dimension参数。
  • CCLabelTTF的文本贴图(texture)大小,我们可以通过getTexture()->getContentSize()或者直接getContentSize()。但千万别使用getDimensions()。
  • 通过以上对CCScrollView和CCLabelTTF特性的分析,我们能得出这样的结论:我们不能将我们的CCLabelTTF作为CCScrollView的Container!

    因为当我们的文本不够大的时候,即使我们将文本强制设置到的CCScrollView的左上角,但是只要玩家一拖动,我们的文本还是会被CCScrollView设置到左下角。如何解决这个问题呢?解决方法就是:我们要保证Container的大小至少和CCScrollView(或者称为View)的大小一样大。这样就可以确保Container在被拖动时,不会因为自己太小而被CCScrollView强制拉回左下角,以至于出现诡异的现象。

    如何确保Container的大小不比View小呢?那就是让CCScrollView默认创建一个Container(是一个CCLayer,大小为屏幕大小),然后我们在根据需求改变Container的大小(因为如果Container的大小为屏幕大小时,我们将会有一大片无用的区域可被玩家拖动,这是谁都不想看到的)。然后在将CCLabelTTF作为Container的子节点,并将其对齐到Container的左上角。之后,我们只需要确保Container一开始的时候顶格显示,就能保证我们的CCLabelTTF顶格显示了。

    下面附带个人代码,仅供大家学习交流。任何因使用本人代码而造成的项目损失或者间接损失,本人不负任何责任。
    • .h
      //
      //  XJScrollLabel.h
      //
      //  Created by jason on 13-1-30.
      //
      
      #ifndef __COG__XJScrollLabel__
      #define __COG__XJScrollLabel__
      
      #include <iostream>
      #include "cocos2d.h"
      #include "cocos-ext.h"
      
      USING_NS_CC;
      USING_NS_CC_EXT;
      
      
      #define POINTER_OPERATION( pointer, operation ) \
      do\
      {\
      if( pointer )\
      {\
      operation;\
      }\
      }while( 0 )
      
      //the anchor point of XJScrollLabel is the left-bottom corner.
      class XJScrollLabel : public CCNode, public CCScrollViewDelegate
      {
      public://static functions
      	static XJScrollLabel* create( const char* pszText, const char *fontName, float fontSize, CCTextAlignment hAlignment, CCSize ScrollViewSize );
      	
      public:
      	XJScrollLabel();
      	~XJScrollLabel();
      	bool init( const char* pszText, const char *fontName, float fontSize, CCTextAlignment hAlignment, CCSize& ScrollViewSize );
      	
      	void setTextColor(const ccColor3B& color3)
      	{ POINTER_OPERATION( m_pLabel, m_pLabel->setColor( color3 ) ); }
      	
      public://scroll view delegate
      	virtual void scrollViewDidScroll(CCScrollView* view){}
          virtual void scrollViewDidZoom(CCScrollView* view){}
      	
      private:
      	CCScrollView* m_pScrollView;
      	CCLabelTTF* m_pLabel;
      };
      
      #endif /* defined(__COG__CGScrollLabel__) */
      


    • .cpp
      //
      //  XJScrollLabel.cpp
      //
      //  Created by jason on 13-1-30.
      //
      
      #include "XJScrollLabel.h"
      
      XJScrollLabel* XJScrollLabel::create(const char *pszText, const char *fontName, float fontSize, CCTextAlignment hAlignment, cocos2d::CCSize ScrollViewSize)
      {
      	XJScrollLabel* pScrollLabel = new XJScrollLabel;
      	if( pScrollLabel && pScrollLabel->init( pszText, fontName, fontSize, hAlignment, ScrollViewSize ) )
      	{
      		pScrollLabel->autorelease();
      		return pScrollLabel;
      	}
      	else
      	{
      		CC_SAFE_DELETE( pScrollLabel );
      		return NULL;
      	}
      }
      
      XJScrollLabel::XJScrollLabel() :
      m_pScrollView( NULL ),
      m_pLabel( NULL )
      {
      	
      }
      
      XJScrollLabel::~XJScrollLabel()
      {
      	CC_SAFE_RELEASE_NULL( m_pLabel );
      	CC_SAFE_RELEASE_NULL( m_pScrollView );
      }
      
      bool XJScrollLabel::init(const char *pszText, const char *fontName, float fontSize, CCTextAlignment hAlignment, cocos2d::CCSize& ScrollViewSize)
      {
      	//object has been initialized.
      	if( m_pScrollView || m_pLabel )
      	{
      		return false;
      	}
      	
      	//constraint the label's width, but not height.
      	m_pLabel = CCLabelTTF::create( pszText, fontName, fontSize, CCSizeMake( ScrollViewSize.width, 0 ), hAlignment );
      	m_pLabel->retain();
      	
      	//get the texture size
      	CCSize TextSize = m_pLabel->getTexture()->getContentSize();
      	
      	//we have to invoke CCScrollView::create( ScrollViewSize ) instead of 
      	//CCScrollView::create( ScrollViewSize, m_pLabel ) to let the CCScrollView
      	//create a default container for you.
      	
      	//It's because that the label may smaller than the view of
      	//CCScrollView. If that is the condition, the label will be positioned
      	//at the bottom of the View by CCScrollView. 
      	
      	//Even though you can set the label at the top, but the behavior of
      	//ScrollView always try to reposition it. So we must ensure the container
      	//is larger than the View of CCScrollView.
      	m_pScrollView = CCScrollView::create( ScrollViewSize );
      	m_pScrollView->retain();
      	m_pScrollView->setDelegate( this );
      	m_pScrollView->setDirection( kCCScrollViewDirectionVertical );
      	
      	//set the container size.
      	//So we must ensure the conainer is larger than the View of CCScrollView.
      	if( TextSize.height > ScrollViewSize.height )
      	{
      		m_pScrollView->setContentSize( TextSize );
      		//make the left-top corner of container coincide with View's
      		m_pScrollView->setContentOffset( ccp( 0, ScrollViewSize.height - TextSize.height ) );
      	}
      	else
      	{
      		m_pScrollView->setContentSize( ScrollViewSize );
      	}
      	
      	//put the label at the top of the container.
      	m_pScrollView->addChild( m_pLabel );
      	m_pLabel->ignoreAnchorPointForPosition( false );
      	m_pLabel->setAnchorPoint( ccp( 0, 1 ) );
      	m_pLabel->setPosition( ccp( 0, m_pScrollView->getContentSize().height ) );
      	
      
      	addChild( m_pScrollView );
      	return true;
      }

    关键代码我都做了有比较详尽的注释,就不对代码做过多解释。


    1楼wangqiuyun昨天 19:08顶起!

        
    [3] jquerymobile-12 拆分旋钮列表(Split button lists)
        来源: 互联网  发布时间: 2014-02-18
    jquerymobile-12 拆分按钮列表(Split button lists)

    在开发的过程中我们需要在列表上做一些操做,这时候我们就可以在列表的结尾,添加一些可操作的按钮。jquerymobile为我们提供方便的方式实现这样的功能,只要我们在ul中添加data-split-icon属性就可以了。这个属性的可选值在 jquerymobile常用data属性这篇文章中列出了一部分。下面给一个例子代码:

    <!DOCTYPE html>
    <html>
    <head>
    <title>List Divider Example</title>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="http://code.jquery.com/mobile/latest/jquery.mobile.min.css" />
    <script src="http://code.jquery.com/jquery-1.7.1.min.js"></script>
    <script src="http://code.jquery.com/mobile/latest/jquery.mobile.min.js"></script>
    </head>
    
    <body>
    
    <div data-role="page">
    
    	<div data-role="header">
    		<h1>My Header</h1>
    	</div>
    	
    	<div data-role="content">
    		<ul data-role="listview" data-inset="true" data-split-icon="gear">
    		<li><a href="/blog_article/ray.html"><img src="/blog_article/ray_small.png" > Raymond Camden</a> <a href="/blog_article/foo.html" >Delete</a></li>
    		<li><a href="/blog_article/scott.html"><img src="/blog_article/scott_small.png" > Scott Stroz</a> <a href="/blog_article/foo.html">Delete</a></li>
    		<li><a href="/blog_article/todd.html"><img src="/blog_article/todd_small.png" > Todd Sharp</a> <a href="/blog_article/foo.html">Delete</a></li>
    		<li><a href="/blog_article/dave.html"><img src="/blog_article/dave_small.png" > Dave Ferguson</a> <a href="/blog_article/foo.html">Delete</a></li>
    		</ul>
    	</div>
    
    	<div data-role="footer">
    		<h4>My Footer</h4>
    	</div>
    		
    </div>
    
    </body>
    </html>
    

    效果如下:


    但是还有一个问题就是,我试了一下,没找到怎么同时添加两个按钮。如果谁会,麻烦请留言告诉我,谢谢。


        
    最新技术文章:
    ▪Android开发之登录验证实例教程
    ▪Android开发之注册登录方法示例
    ▪Android获取手机SIM卡运营商信息的方法
    ▪Android实现将已发送的短信写入短信数据库的...
    ▪Android发送短信功能代码
    ▪Android根据电话号码获得联系人头像实例代码
    ▪Android中GPS定位的用法实例
    ▪Android实现退出时关闭所有Activity的方法
    ▪Android实现文件的分割和组装
    ▪Android录音应用实例教程
    ▪Android双击返回键退出程序的实现方法
    ▪Android实现侦听电池状态显示、电量及充电动...
    ▪Android获取当前已连接的wifi信号强度的方法
    ▪Android实现动态显示或隐藏密码输入框的内容
    ▪根据USER-AGENT判断手机类型并跳转到相应的app...
    ▪Android Touch事件分发过程详解
    ▪Android中实现为TextView添加多个可点击的文本
    ▪Android程序设计之AIDL实例详解
    ▪Android显式启动与隐式启动Activity的区别介绍
    ▪Android按钮单击事件的四种常用写法总结
    ▪Android消息处理机制Looper和Handler详解
    ▪Android实现Back功能代码片段总结
    ▪Android实用的代码片段 常用代码总结
    ▪Android实现弹出键盘的方法
    ▪Android中通过view方式获取当前Activity的屏幕截...
    ▪Android提高之自定义Menu(TabMenu)实现方法
    ▪Android提高之多方向抽屉实现方法
    ▪Android提高之MediaPlayer播放网络音频的实现方法...
    ▪Android提高之MediaPlayer播放网络视频的实现方法...
    ▪Android提高之手游转电视游戏的模拟操控
     


    站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3