当前位置:  编程技术>移动开发
本页文章导读:
    ▪关于Mac开发的若干有关问题        关于Mac开发的若干问题 1. 首先Mac OS X自带subversion版本控制工具,可用于代码管理,无需额外安装,只是用户操作界面是基于命令行的 update代码的时候出现过一些问题,子目录下的代码不会.........
    ▪ Jeff Haynie在GMIC2012表示应用开发者应注意本土化有关问题        Jeff Haynie在GMIC2012表示应用开发者应注意本土化问题 5月10日-11日,2012全球移动互联网大会(GMIC)在北京召开,本届大会以“跨界、融合、变革”为主题,通过全球移动互联网产业的巅峰对话.........
    ▪ 读取word资料,字体,颜色       读取word文件,字体,颜色 在Android读取Word文件时,在网上查看时可以用tm-extractors,但好像没有提到怎么读取Word文档中字体的颜色,字体,上下标等相关的属性。但由于需要,要把doc文档中.........

[1]关于Mac开发的若干有关问题
    来源: 互联网  发布时间: 2014-02-18
关于Mac开发的若干问题

1. 首先Mac OS X自带subversion版本控制工具,可用于代码管理,无需额外安装,只是用户操作界面是基于命令行的

  • update代码的时候出现过一些问题,子目录下的代码不会同步,这个不知道是什么原因,我是小白。。
  •  

    2. IDE为Xcode需要自己下载,这里吐槽若干版本的问题,为了避免出现各种各样的问题,最好用最新版本的操作系统,最新版本的Xcode,以及最新版本的simulator(其实我是android开发人员,偶尔会看看ios版本的code,所以经常碰到各种我不了解的问题。。)

  • 碰到若干次ARC(Automatic Reference Counting)Issue,提示无法找到本地的方法,最终就是更新Xcode,从4.2更新到4.3就好了。。
  • 另外,如果simulator中没有图片,又无法访问网络的话,原来可以直接从Mac上拖拽一张到simulator上,这样simulator会自动用浏览器打开该图片,再save一下就可以保存到photo library里了
  • 我真是各种小白。。

    以后再补充。。


        
    [2] Jeff Haynie在GMIC2012表示应用开发者应注意本土化有关问题
        来源: 互联网  发布时间: 2014-02-18
    Jeff Haynie在GMIC2012表示应用开发者应注意本土化问题
    5月10日-11日,2012全球移动互联网大会(GMIC)在北京召开,本届大会以“跨界、融合、变革”为主题,通过全球移动互联网产业的巅峰对话、G20闭门峰会等多个单元,探讨移动互联网领域的趋势与机遇。

    和讯科技对本次大会进行全程报道。圆桌论坛:如何占领手机桌面?


    引用
      主持人: Andreas Constantinou,董事总经理,VisionMobile

      嘉宾:

      罗川,CEO,应用汇

      Ouriel Ohayon,CEO,Appsfire

      Jeff Haynie,CEO,Appcelerator

      Gonzague de Vallois,高级副总裁,Gameloft

      Manav Gupta,董事总经理,FabriQate Mobile

      话题:

      今年是争夺用户的最佳时机么

      App推广与分发之道


      Appsfire首席执行官Ouriel Ohayon称,苹果打击过一批灰色手段推广APP,现实中有些人也是喜欢用这样的做法,就是每一天下载几万次,然后立刻刷到排名上。Ohayon透露,法国和英国很多公司做帮人刷排名的事情,但他认为,这样下去长远不了。

      FabriQate Mobile 董事总经理Manav Gupta介绍称,推广APP可以采用品牌内置,比如有不同的代理企业,不同的代理公司,这些代理公司有点像“星探”一样,他不断的去识别下一个杀手级的应用。企业可能需要花点钱买点关注,找一些知名品牌赞助或者支持他的APP,也许在未来,这个产品就会非常流行。

      应用汇CEO罗川分享称,可以用社交媒体推广APP,比如说有些用户喜欢对一个APP写评论,他写评论之后转到微博上,上面有APP地址也有介绍,这也可以实现一个非常好的推广的效果。

    =====================================================================

      以下为文字实录:

      Constantiou:有请应用汇CEO罗川、Appsfire CEO Ouriel Ohayon、Appcelerator CEO Jeff Haynie、Gameloft高级副总裁Gonzague de Vallois、Manav Gupta。

      罗川:我来自应用汇。

      Ouriel Ohayon:我们有600万用户,也可以给开发者建议。

      Jeff Haynie:我们是云计算和云环境和应用主要的平台。

      Gonzague de Vallois:我们是一个全球主要的内容发布商。

      Manav Gupta:我是FabriQate Mobile的董事总经理Manav Gupta。

      Constantiou:今天上午有嘉宾说到,现在如果有好产品,明天市场就都知道了,在座各位同意这样的说法吗?

      Ouriel Ohayon:基本是这样,首先确保这个产品是全球第一的。如果你真的是第一出现的话,当然可以通过口碑迅速的传播开来。但是现在市场上有那么多好的应用,有这么多好的新的应用,所以竞争非常激烈,我们必须要有好的应用。

      举个例子,有很多东西可以免费去做,比如就游戏而言,你可以去做游戏推广。比如说这个礼拜Outfit7推出了一个实时通讯的工具,用户可以通过这个跟他的朋友进行交流。我们也可以通过更多的技术给予用户鼓励,激励他们更多的下载和鼓励。除此之外还有一些传统的广告希望能够发挥作用。

      Constantiou:你觉得什么营销工具能够真正产生有效的用户而不只是人他们下载你的游戏?

      Gonzague:质量和黏度非常重要。对于应用用户来说,我们也希望能用到推荐引擎。

      Constantiou:你最喜欢的是什么?

      Gonzague:我最喜欢的是推广和促销,我们基于iOS平台有很多用户,我也喜欢跟推荐引擎合作,他们价值非常大,可以推荐高价值的下载。对于推荐我没有什么股份和利益,我不知道有没有一个放之全球都有效的引擎,但是不同的市场都有一些友生者。

      Constantiou:我们看一下Jeff Haynie,你们面对很多挑战,包括要把产品开发到不同的平台上去。你有什么样的办法帮助这些开发人员适应这种多平台的环境呢?

      Jeff Haynie:这确实是很大的挑战。我们可以看一下移动互联网是全球性的事物和全球的现象。我们再看一盈利模式到底是通过广告来做、通过促销来做还是其他的方式?每个国家每个地区都有自己的特色,这造成了很多问题。在中国有数以百计的应用商店,我们必须要考虑到地域的特点,这是很大的问题。我们也知道这个问题不可能今天就解决。我们也希望吸引更多的公司参加到我们的平台上来。

      在中国,我们也知道像Google和其他的一些APP STORE也做的非常好。我觉得整个世界条块分割非常严重,是碎片化的,所以我们必须要找到好的工具适应这样一个碎片化的全球市场。我们也希望从开发的角度能提供一些支持和协助。但是我想可能还需要更多的人参与我们的工作,提供更多的。

      Constantiou:之前一些代表也说到了碎片化的问题,他们说到了安卓平台上的游戏,他说到需要做很多开发和定制,他们提到了400多个不同的定制,Manav Gupta你们呢?

      Manav Gupta:针对同一个开发,我们往往只有一两周的时间去做,我们必须要分析这样的一个营销活动有什么具体的目标?最关键的是我们要找到那些真正有效的用户。不同的市场不能要瞄准不同的目标客户群体,这就意味着我们要选择不同的设备,这样才能真正产生价值。同时考虑到工程设计方面要花很多时间,每天我们都要面对这样的问题。

      但是情况在改善,比如HTML5和WIN7这些平台上我们都做了开发,最大的问题是市场在不断的变化,可能今天这样的一个现象再过几个月就要重新研究和调整。未来趋势怎么样?未来平台在哪里,我们的合作伙伴给我们提供了非常好的中间件,让我们做更好的开发。


    Appcelerator首席执行官Jeff Haynie

      Jeff Haynie:我觉得不是越来越简单,我们看到了很多分析,基于安卓平台的3000多不同产品的报告,不同的地区、不同的客户都有不同的描述,各个地区不同的客户是不一样的。越来越多的设备,包括电视和车载设备应用越来越多。所以这方面对我们的挑战会越来越严峻。

      Manav Gupta:我的意思是一定要聚焦,聚焦于我们开发的产品,我们要找出需要去核心应对的那些设备,保证这些设备用好,确保我们的应用在这些设备上顺畅的运行。不要把摊子铺的太大,规划非常重要。一开始就要多去了解,多去分析,然后再制定我们的产品特色。

      Constantiou:我们谈一下中国的情况,中国市场碎片化程度怎么样?跟全球比怎么样?

      罗川:中国市场碎片化程度比全球市场要高得多。我们有上百个应用商店,我觉得今年年底的时候竞争度会进一步提升。应用商店也会关注好的内容和好的推荐,从而能够实现盈利,还要跟开发人员进行利润分成。另外还有设备方面,也是日益的流水化,越来越精简。我们应用汇本身也有相关的应用,我们也做了一些相关的测试。通过这样的测试我们可以更好的、提供更优质的产品。

      另外还有很多服务供应商。比如我们有一个合作伙伴帮助我们做自动测试,为4到5百个应用做测试,所有这些服务都能成熟起来的话,市场情况就会好得多。

      Constantiou:这方面也会有一些突出的机制,包括并购等等,不知道中国是不是这样的?

      罗川:我刚才说了市场越来越集中,前天艾瑞提交了一份报告,就是让大家关注一些趋势。比如说一个网站如果有80%、90%的流量都集中于一个客户,就一定要关注这部分客户,当然那时候小规模的应用商店压力会大得多。另外去年底今年初很多OEM厂商发现经营遇到了困难,资源有限无法跟开发人员进行有效的沟通。比如说应用Flash工具开发人员越来越少,这时候不得不转向第三方的应用商店。

      Ouriel Ohayon:这让我想到了十年前的情况,当时网络上出现各种各样的连接,没有记得住这么多的连接,但是现在这样的连接就少了很多。因为我们完全可以依靠搜索引擎去找到自己想要的内容。我想对于移动互联网也是如此,每个行业都有自己的生命周期,最终要通过并购等实现行业集中。

      Constantiou:刚才罗川提到了应用的发展,你们看一下接下来会去收购什么样的公司呢?是收购应用推荐引擎吗?

      Ouriel Ohayon:我们要看业务中最关键的层级在哪里,因为目前关注度非常高,我们有什么样的并购决定或者计划都会受到广泛的关注。大家也会关注在应用推荐方面有哪些最新的发展。我们看其他行业比如电影或者音乐行业,总会有几个品牌脱颖而出。他们也会得到行业批评家的推荐,这方面有很多著名的案例。所以目前在推荐引擎方面,我们有关于电影的推荐引擎,对应用来说也是如此,有这么多用户商店,用户希望有一些可靠的推荐建议,第三方独立的推荐意见。他们本身也是持批判的态度,他们会站在用户角度看什么样的应用更有价值。

      罗川:我的角度稍微有所不同,我觉得这从用户角度来讲,应该是如何发现好应用的一个引擎。因为他不是要看多少电影或者多少ARPU,比如你有一百万ARPU,没法选某一个类别,你看看名字和描述这太虚了,你也不知道哪个最有价值。比如你在苹果APP STORE中看了半天也不知道该下载哪个,所以我觉得发现引擎可能是挺好的。未来也许APP STORE可以做一个非常好的建议,发现这个APK好于那个,这样会使我们的下载量程更加简化。

      Manav Gupta:我们有一个类别,比如各个制造商,我们看联想、索尼、松下、LG,只要是消费电子类的,大家一开始都是台式机,然后做手机电脑,现在又做自己的智能手机,而且他们选择安卓平台,主要是因为安卓在手机上定制比较方便。而且他们看到的优势,所有的安卓平台看上去都差不多,所有制造企业都在想他们的战略应该是什么。他们的生态系统应该怎么来做,他们的应用上应该推荐什么?因为这些制造企业制造商在未来会突然发生转型,突然发挥重要作用。

      其实理论上来说,只有他们才有这样的一种技术数据,或者是对用户数据分析的能力。我觉得这应该是一个市场的趋势。再过几年可能制造企业,比如说专门生产一种适合旅游的智能手机,适合探险旅游的智能手机,可能未来手机都会有这样的定制。所以我觉得这是一个特别有针对性的市场战略。就是基于这些用户个人的兴趣,作为制造企业可以在这做一个推动。

      Constantiou:您提到了一个非常有意思的话题,就是我们制造企业可以发挥的作用。我最近听到一个消息说,有人正在做46美元的手机,会有一些预安装的业务模式,这种模式行得通吗?比如电脑的时候是有这样的40多的可以预装的。

      Gonzague:个人电脑预装流程这种模式已经是非常成熟的模式。

      回到怎么推荐APP这个问题上,社交网络也可以发挥这样的作用。比如Facebook昨天新发布一款应用,我觉得最好的建议是来自于你朋友的建议,所谓的玩家他们可以提供非常好的建议。比如你看看其他的用户,你的朋友,就是所谓的口碑传播很重要。

      Constantiou:苹果未来会不会做一些限制,比如限制Facebook在它里面搞一些什么功能。另外你们APP在其他国家行销的时候碰到过一些什么问题吗?

      罗川:iOS是一个全球的平台,这个没有必要谈了。对于安卓来说中国未来一定会成为最大的安卓市场,这个市场任何一个开发者都不能忽视,我非常期待这些开发者进入中国和我们合作。比如Appsfire,也可以跟我们合作,我们也有英文版。

      Ouriel Ohayon:我们的一些应用都是英文版,就是源数据进行本土化。其实这个翻译很便宜,也很简单。特别是拉美国家他们对语言要求非常高,我们再进行本土的这样的一个翻译,这样可以挽留我们的用户。

      第三点是对我们建议的引擎进行本土化,比如在法国、或是在意大利,你看到的推荐APP是不一样的。我们可以本土化到每一个城市,我们的本土化是有层次的本土化战略。不仅要进行本身的本土化,还要进行不同区域用户的维持,另外在一些关键市场,像美国、欧洲、法国、英国、西班牙、德国这是我们关键市场,我们要做到第三个层次就是本土建议。里面最大的变化是美国,我觉得西班牙和德国很容易处理,但是拉美比较难。因为欧洲我们品牌认知度还是非常高的。

      Constantiou:Jeff Haynie你有没有一些本土化的经验?

      Jeff Haynie:我们也非常关注APP本土化的问题,我们所有语言都进行本土化。我们现在也花很多时间进行工具的本土化。因为有一些开发者不愿意用英文版的开发工具,另外一些网站上的材料也在做本土化,主要市场我们都做了这些工作。我们有成百上千万的APP,这里什么样的设备都有。

      Constantiou:有没有一些所谓的灰色手段推广你的APP?有没有一些评估?作为APP推广战略当中有多少企业用这些所谓的帮你刷排名的服务?

      Ouriel Ohayon:之前苹果打击过一批,之前已经曝光一轮了,现实中有些人是喜欢用这样的做法,就是每一天下载几万次,然后立刻刷到排名上。法国和英国我知道很多公司干这个事情就是帮你刷排名。但是这样下去长远不了。我想任何一个行业都有这样的事情,可能是利益驱使的原因,这样的事情很难避免。

      Constantiou:大家认为有什么样的推广技术是现在大家还没有意识到,但是出现了一些苗头的?

      Manav Gupta:就是怎么做品牌内置。比如有不同的代理企业,不同的代理公司,这些代理公司有点像“星探”一样,他不断的去识别下一个杀手级的应用。但是如果你不花点钱讨好他们,他们可能不会推荐你,你要光凭自己的实力推荐可能比较难。我觉得可能需要花点钱买点关注。因为我们知道有许多开发企业都是很小的企业,但是如果他能够花点钱找一些知名品牌赞助或者支持他的APP,也许在未来,这个产品就会非常流行。

      Constantiou:有没有一些案例?

      Manav Gupta:我们之前给过一个应用做推广,主要针对的是7到11岁的小朋友,我们用的唯一的推广方法就是在一个动画片频道上面做广告。我们的广告和播放的动画片进行了有机结合,这样感觉很好,我们很好的找到了小朋友这样的受众群体。其实这个APP很简单,就是让小朋友在上面用不同的动画图片和自己的朋友分享。因为小朋友没有什么认知,就是选一点自己喜欢的卡通人物进行分享,如果你能做这样的一个产品,适合这样的群体,我觉得就可以很好的做一个品牌营销,可能比直接在APP STORE推广里推广容易得多。

      Ouriel Ohayon:不能说灰色推广,我们是花点钱进行联合推广。最近APP有一个趋势就是明星代言,比如有一个明星特喜欢这个APP,他就成为了代言人,有时候就是他自己喜欢,就这么简单。

      Constantiou:还有没有一些推广策略?

      Gonzague:我们所有的工具都用过,我们也找过明星代言。我觉得这里面可选择的手段非常多,大家多选一选,追踪潮流、跟随潮流。归根到底终端用户花钱,我们是一个长期的企业,我们企业战略眼光是比较长久的。因为我们的战略是长期的,所以很多手段都会去尝试,看一看哪个手段最好,作为终端用户肯定希望花钱下载了这个APP有更好的体验。对于我们来说,保证产品质量是最重要的。

      罗川:另外可以用社交媒体推广。比如说有些用户喜欢对一个APP写评论,他写评论之后,我们让他转到新浪微博上,这样的一个评论可以自动的提交新浪微博,上面有APP地址也有介绍,这也可以实现一个非常好的推广的效果。

      Jeff Haynie:很多APP没有很好的社交分享功能很麻烦。另外也有很多STK帮助我们做到这点。我找到一个好的东西肯定跟朋友推荐,大家听了之后回到家里会到应用商店下载尝试。

      Gonzague:刚才说到了社交媒体和推荐网站非常重要,我们希望我们的工作有更强的社交性,你可以跟朋友推荐,一起玩这些游戏。

      Constantiou:谢谢各位刚才的分享和讨论!

        
    [3] 读取word资料,字体,颜色
        来源: 互联网  发布时间: 2014-02-18
    读取word文件,字体,颜色

    在Android读取Word文件时,在网上查看时可以用tm-extractors,但好像没有提到怎么读取Word文档中字体的颜色,字体,上下标等相关的属性。但由于需要,要把doc文档中的内容(字体,下划线,颜色等)读取应用到android中(不包括图片和图表)。

    后面采用的是poi三方jar包(原包太大,可以从源代码里自己抽取有用的一些代码减少包的大小)。

    我的想法是:把doc中的内容解析出来后,加上html对应的标签,在android中通过Html.fromHtml在TextView中进行显示,或者通过WebView.loadData进行加载显示

    但测试后,发现如果加载太多内容的话,在Android中效率不行。

     

    效果(该图的效果是在TextView中的效果,在WebView中效果会更好些):

    doc图:

     

     

    android图:

     

     

    做法1:(解析为span样式的,这种做法只能用WebView方式加载,Html.fromHtml无效)

    /**Span样式
    	 * 通过字体的样式进行加载
    	 * @param inputStream
    	 * @return
    	 */
    	public static String readDocToSpanByRun(InputStream inputStream) {
    		HWPFDocument hwpfDocument = null;
    		if(inputStream == null)
    			throw new RuntimeException("inputStream is null ...");
    		try{
    			hwpfDocument = new HWPFDocument(inputStream);
    		}catch(Exception e) {
    			throw new RuntimeException("HWPFDocment Exception", e);
    		}
    		Range allRange = hwpfDocument.getRange();
    		int length = allRange.numCharacterRuns();
    		StringBuffer sb = new StringBuffer();
    		CharacterRun cur;
    		String text = "";
    		for (int i = 0; i < length; i++) {
    			cur = allRange.getCharacterRun(i);
    			sb.append(CharacterRunUtils.toSpanType(cur));
    			text = CharacterRunUtils.getSpicalSysbomByRun(cur.text());
    			if(cur.getSubSuperScriptIndex() == 1)
    				sb.append("<sup>").append(text).append("</sup>");
    			else if(cur.getSubSuperScriptIndex() == 2) 
    				sb.append("<sub>").append(text).append("</sub>");
    			else 
    				sb.append(text);
    			sb.append("</span>");
    		}
    		return sb.toString();
    	}
    	

     

    做法2:(解析为font样式的,Html.fromHtml有效,但对应size的设置无效果)

     

    /**
    	 * Html样式
    	 * 通过字体样式解析
    	 * @param inputStream
    	 * @return
    	 */
    	public static String readDocToHtml(InputStream inputStream) {
    		HWPFDocument hwpfDocument = null;
    		if(inputStream == null)
    			throw new RuntimeException("inputStream is null ...");
    		try{
    			hwpfDocument = new HWPFDocument(inputStream);
    		}catch(Exception e) {
    			throw new RuntimeException("HWPFDocment Exception", e);
    		}
    		CharacterRun  cur = null;
    		StringBuffer sb = new StringBuffer();
    		StringBuffer charStr =  new StringBuffer();
    		Range allRange = hwpfDocument.getRange();
    		for(int i = 0; i < allRange.numCharacterRuns(); i++) {
    			cur = allRange.getCharacterRun(i);
    			sb.append(CharacterRunUtils.fontFaceColorSizeToHtml(cur));
    			charStr.append(CharacterRunUtils.toSupOrSub(cur, CharacterRunUtils.getSpicalSysbomByRun(cur.text())));
    			if(cur.isBold())  {
    				charStr.insert(0, "<b>");
    				charStr.insert(charStr.length(), "</b>");
    			}
    			if(cur.getUnderlineCode() != 0) { 
    				charStr.insert(0, "<u>");
    				charStr.insert(charStr.length(), "</u>");
    			}
    			if(cur.isItalic()) {
    				charStr.insert(0, "<i>");
    				charStr.insert(charStr.length(), "</i>");
    			}
    			if(cur.isStrikeThrough()) {
    				charStr.insert(0, "<s>");
    				charStr.insert(charStr.length(), "</s>");
    			}
    			sb.append(charStr).append("</font>");
    			charStr.setLength(0);
    		}
    		hwpfDocument = null;
    		return sb.toString();
    	}
     

     以下是会用到的方法:

     

    /**
     *处理字体相关的属性 
     */
    public class CharacterRunUtils {
    
    	private static final short ENTER_ASCII = 13;
    	private static final short SPACE_ASCII = 32;
    	private static final short TABULATION_ASCII = 9;
    
    	/**
    	 * 比对字体是否相同
    	 * 可以继续加其它属性
    	 * @param cr1
    	 * @param cr2
    	 * @return
    	 */
    	public static boolean compareCharStyleForSpan(CharacterRun cr1,
    			CharacterRun cr2) {
    		return cr1.isBold() == cr2.isBold()
    				&& cr1.getFontName().equals(cr2.getFontName())
    				&& cr1.getFontSize() == cr2.getFontSize()
    				&& cr1.isItalic() == cr2.isItalic()
    				&& cr1.getColor() == cr2.getColor()
    				&& cr1.getUnderlineCode() == cr2.getUnderlineCode()
    				&& cr1.isStrikeThrough() == cr2.isStrikeThrough()
    				&& cr1.getColor() == cr2.getColor();
    	}
    
    	public static boolean compareCharColor(CharacterRun cr1, CharacterRun cr2) {
    		return cr1.getFontName().equals(cr2.getFontName())
    				&& cr1.getFontSize() == cr2.getFontSize()
    				&& cr1.getColor() == cr2.getColor();
    	}
    
    	public static String getSpicalSysbom(char currentChar) {
    		String tempStr = "";
    		if (currentChar == ENTER_ASCII) {
    			tempStr += "<br/>";
    		} else if (currentChar == SPACE_ASCII) {
    			tempStr += "&nbsp;";
    		} else if (currentChar == TABULATION_ASCII) {
    			tempStr += "&nbsp;&nbsp;&nbsp;";
    		} else {
    			tempStr += currentChar;
    		}
    		return tempStr;
    	}
    	
    	public static String getSpicalSysbomSpan(char currentChar) {
    		String tempStr = "";
    		if (currentChar == ENTER_ASCII) {
    			tempStr += "<br/>";
    		} else if (currentChar == SPACE_ASCII) {
    			tempStr += "&nbsp;";
    		} else if (currentChar == TABULATION_ASCII) {
    			tempStr += "&nbsp;&nbsp;&nbsp;";
    		}
    		return tempStr;
    	}
    
    	/**
    	 * 特殊字符的取代
    	 * @param currentChar
    	 * @return
    	 */
    	public static String getSpicalSysbomByRun(String currentChar) {
    		StringBuffer tempStr = new StringBuffer();
    		int length = currentChar.length();
    		for (int i = 0; i < length; i++) {
    			tempStr.append(getSpicalSysbom(currentChar.charAt(i)));
    		}
    		return tempStr.toString();
    	}
    
    	/**
    	 * span方式前缀
    	 * @param cr
    	 * @return
    	 */
    	public static String toSpanType(CharacterRun cr) {
    		StringBuffer spanStyle = new StringBuffer("<span );
    		spanStyle.append(cr.getFontName()).append("; font-size:")
    				.append(cr.getFontSize() / 2).append("pt;");
    		if (cr.isBold())
    			spanStyle.append("font-weight:bold;");
    		if (cr.isItalic())
    			spanStyle.append("font-style:italic;");
    		if (cr.isStrikeThrough())
    			spanStyle.append("text-decoration:line-through;");
    		if (cr.getUnderlineCode() != 0)
    			spanStyle.append("text-decoration:underline;");
    		spanStyle.append("color:")
    				.append(ColorUtils.getHexColor(cr.getIco24())).append(";")
    				.append("'>");
    		return spanStyle.toString();
    	}
    
    	/**
    	 * 为font方式提供<font前缀
    	 * @param cr
    	 * @return
    	 */
    	public static String fontFaceColorSizeToHtml(CharacterRun cr) {
    		StringBuffer htmlType = new StringBuffer("<font ");
    		htmlType.append("size='").append(cr.getFontSize() / 2).append("' ")
    				.append("face='").append(cr.getFontName()).append("' ")
    				.append("color='")
    				.append(ColorUtils.getHexColor(cr.getIco24())).append("'>");
    		return htmlType.toString();
    	}
    
    	/**
    	 * 处理上下标
    	 * @param cr
    	 * @param currentChar
    	 * @return
    	 */
    	public static String toSupOrSub(CharacterRun cr, String currentChar) {
    		int sub = cr.getSubSuperScriptIndex();
    		if (sub != 0) {
    			if (sub == 1)
    				// 上标
    				return "<sup>" + currentChar + "</sup>";
    			else
    				// 下标
    				return "<sub>" + currentChar + "</sub>";
    		} else
    			return currentChar;
    	}
    
    	public static String toSupOrSub(CharacterRun cr, char currentChar) {
    		return toSupOrSub(cr, new String(new char[]{currentChar}));
    	}
    }
    

     

    用到的颜色的转换(进行简单的颜色转换)

    public class ColorUtils {
    
    	public static int  red(int c) {
    		return c & 0XFF;
    	}
    	
    	public static int green(int c) {
    		return (c >> 8) & 0XFF;
    	}
    	
    	public static int blue(int c) {
    		return (c >> 16) & 0XFF;
    	}
    	
    	public static int rgb(int c) {
    		return (red(c) << 16) | (green(c) <<8) | blue(c);
    	}
    
    	public static String rgbToSix(String rgb) {
    		int length = 6 - rgb.length();
    		String str = "";
    		while(length > 0){
    			str += "0";
    			length--;
    		}
    		return str + rgb;
    	}
    	
    	public static String getHexColor(int color) {
    		color = color == -1 ? 0 : color;
    		int rgb = rgb(color);
    		return "#" + rgbToSix(Integer.toHexString(rgb));
    	}
    }
     

     


        
    最新技术文章:
    ▪Android开发之登录验证实例教程
    ▪Android开发之注册登录方法示例
    ▪Android获取手机SIM卡运营商信息的方法
    ▪Android实现将已发送的短信写入短信数据库的...
    ▪Android发送短信功能代码
    ▪Android根据电话号码获得联系人头像实例代码
    ▪Android中GPS定位的用法实例
    ▪Android实现退出时关闭所有Activity的方法
    ▪Android实现文件的分割和组装
    ▪Android录音应用实例教程
    ▪Android双击返回键退出程序的实现方法
    ▪Android实现侦听电池状态显示、电量及充电动...
    ▪Android获取当前已连接的wifi信号强度的方法
    ▪Android提高之手游转电视游戏的模拟操控 iis7站长之家
    ▪根据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