<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>DroidChina</title>
	<atom:link href="http://www.droidchina.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.droidchina.com</link>
	<description></description>
	<lastBuildDate>Mon, 13 Dec 2010 06:54:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Android开发者掘金（2）—技术篇</title>
		<link>http://www.droidchina.com/2010/12/dig-gold-in-android-2.html</link>
		<comments>http://www.droidchina.com/2010/12/dig-gold-in-android-2.html#comments</comments>
		<pubDate>Mon, 13 Dec 2010 06:53:48 +0000</pubDate>
		<dc:creator>DroidChina</dc:creator>
				<category><![CDATA[开发者]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[广告]]></category>
		<category><![CDATA[移动广告]]></category>
		<category><![CDATA[掘金]]></category>

		<guid isPermaLink="false">http://www.droidchina.com/?p=177</guid>
		<description><![CDATA[上一篇讲了国内外主流移动广告平台，这一篇讲一些技术流的东西，了解这些开发者就可以选择适合自己的广告平台了。 开发者要弄明白自己的收入情况，只需要搞明白收入公式就可以了： 广... ]]></description>
			<content:encoded><![CDATA[<p>上一篇讲了<a href="http://www.web20share.com/2010/12/android-mobile-ad-part1.html">国内外主流移动广告平台</a>，这一篇讲一些技术流的东西，了解这些开发者就可以选择适合自己的广告平台了。</p>
<p>开发者要弄明白自己的收入情况，只需要搞明白收入公式就可以了：</p>
<p><strong>广告收入（以</strong><strong>CPC</strong><strong>计价）</strong><strong>=</strong><strong>广告请求次数（</strong><strong>request</strong><strong>）</strong><strong>*</strong><strong>填充率（</strong><strong>fill rate</strong><strong>）</strong><strong>*</strong><strong>点击率（</strong><strong>CTR</strong><strong>）</strong><strong>*CPC</strong><strong>（单次点击单价）</strong><strong></strong></p>
<p><strong>广告请求次数</strong>：这个是程序员自己设定的，请求频率通常设定为30秒一次比较合理。是否要在每个页面都请求广告，需要开发者根据统计情况作出合理安排，一个建议是减少对用户体验的影响，比如在玩游戏时候有广告就很烦，在游戏导航页面是比较好的。<span id="more-177"></span></p>
<p><strong>填充率</strong>：填充率由广告平台决定，这取决于广告平台选择了什么样的投放方法，比如某广告平台选择了向娱乐类应用投 放广告，您的app如果碰巧是新闻类应用就不会获得广告填充。一般广告平台的填充率可能在30-50%之间，有时候会因为app质量等因素造成填充率的重 大差距，可以看看<a href="http://www.javaeye.com/topic/780529">javaeye的一篇帖子</a>。上一篇有提到一种聚合广告平台：adwhirl、<a href="http://www.guohead.com/?utm_source=w20&amp;utm_medium=archive&amp;utm_content=part2&amp;utm_campaign=devgold">果合</a>，他们是通过聚合了多个广告平台，提高了填充率（通常在80-95%），也就是说当一个广告平台没有广告存货的时候就会自动请求另一个广告平台的存货。</p>
<p><strong>点击率</strong>：点击率与很多因素有关，有一些开发者发现广告放置的位置，应用质量，显示的时间，不同地区的差异（国外用户更喜欢通过点击广告向开发者捐款），广告精准性（广告与用户需求的相关性），是否是位置相关的广告等。</p>
<p><strong>CPC</strong><strong>（单次点击单价）</strong>：这个是由广告主和广告平台决定的，通常广告主愿意 为一些高端广告溢价（比如品牌广告）。在国内的广告平台cpc价格在0.1-0.3元左右。当移动广告与本地商户结合的更紧密时，这些商户将成为移动广告 里重要的长尾，他们愿意为促成一次交易付出1-5%的成本，比如通过您的广告，客户获得优惠券并在餐馆消费了200元，你将获得2-10元的CPC。</p>
<p>还有另一种不太常用的计价方式：CPM计价（每千次展示成本）</p>
<p><strong>广告收入（以</strong><strong>CPM</strong><strong>计价）</strong><strong>=</strong><strong>广告请求次数（</strong><strong>request</strong><strong>）</strong><strong>*</strong><strong>填充率（</strong><strong>fill rate</strong><strong>）</strong><strong>*CPM</strong><strong>（千次展示成本）</strong><strong></strong></p>
<p>不用多说您也看得出来，主要取决于两个因素：填充率和CPM。</p>
<p>———————–</p>
<p>ok，让我们实战演练，下面是一个工具类app在admob的收入情况：</p>
<p><a href="http://www.web20share.com/wp-content/uploads/2010/12/clip_image0021.jpg"><img title="clip_image002" src="http://www.web20share.com/wp-content/uploads/2010/12/clip_image002_thumb1.jpg" border="0" alt="clip_image002" width="644" height="388" /></a></p>
<p><strong>提高收入的一些建议：</strong><strong></strong></p>
<p>提升app本身的安装量（提高质量，促销等方式）；</p>
<p>可以选用<a href="http://www.guohead.com/?utm_source=w20&amp;utm_medium=archive&amp;utm_content=part2&amp;utm_campaign=devgold">果合</a>类平台提高填充率；</p>
<p>点击率在合理范围，可寻找点击单价更高的广告平台；</p>
<p>cocoa和eoe开发者社区上有很多关于admob,iad等广告平台的讨论，可以去看看。</p>
<p>*你可能发现admob没有CPC的价格，其实它也是以CPC计费，但是由另一种方式ecpm（有效千次展示价格，建议记作“估算千次展示价格”）呈现结果。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.droidchina.com/2010/12/dig-gold-in-android-2.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android开发者掘金（1）</title>
		<link>http://www.droidchina.com/2010/12/dig-gold-in-android-1.html</link>
		<comments>http://www.droidchina.com/2010/12/dig-gold-in-android-1.html#comments</comments>
		<pubDate>Mon, 13 Dec 2010 06:51:56 +0000</pubDate>
		<dc:creator>DroidChina</dc:creator>
				<category><![CDATA[开发者]]></category>
		<category><![CDATA[广告]]></category>
		<category><![CDATA[移动广告]]></category>
		<category><![CDATA[掘金]]></category>

		<guid isPermaLink="false">http://www.droidchina.com/?p=176</guid>
		<description><![CDATA[移动互联网和互联网有类似的地方就是它只有两种赚钱的模式：卖商品和广告，如果您有第三种方式欢迎写信给作者。由于众所周知的原因（盗版成风、付费 门槛高），开发者靠卖app赚钱在国... ]]></description>
			<content:encoded><![CDATA[<p>移动互联网和互联网有类似的地方就是它只有两种赚钱的模式：卖商品和广告，如果您有第三种方式欢迎写信给作者。由于众所周知的原因（盗版成风、付费 门槛高），开发者靠卖app赚钱在国内目前基本上是不可能的，但也不用太悲观，两年后也许是可以的。那目前我们先介绍另一种可以养活开发者的方式——移动 广告。</p>
<h2>移动广告优势</h2>
<p>移动广告很像互联网广告的广告联盟（以adsense为代表），Google通过adsense广告平台将众多广告主投放的广告分发到放置了 adsense广告代码的中小网站上。移动广告以admob为代表（admob已被google收购，未来可能整合进adsense for  mobile）。<span id="more-176"></span></p>
<p><a href="http://www.web20share.com/wp-content/uploads/2010/12/clip_image002.jpg"><img title="clip_image002" src="http://www.web20share.com/wp-content/uploads/2010/12/clip_image002_thumb.jpg" border="0" alt="clip_image002" width="163" height="244" /></a></p>
<p><strong>（admob</strong><strong>的横幅展示）</strong></p>
<p>移动广告目前有两种主要形式，admob和iad（苹果自家的广告平台）。Admob现在看起来并没有那么优雅，主要是在应用中嵌入banner（横幅），点击广告后会通过浏览器打开网页。iad继承了苹果的优雅，不用打开浏览器，直接在应用中展示炫酷的广告，参见：<a href="http://v.youku.com/v_show/id_XMTg2Mjg1NzQ4.html">http://v.youku.com/v_show/id_XMTg2Mjg1NzQ4.html</a>。</p>
<p>移动广告的优势在于定位。据美国一家调研机构的报告，位置相关的广告能够有效提高广告点击率，甚至达到50%，尽管这个数据可能过高，但10%-20%是合理的。要知道互联网广告中最精准的搜索广告的点击率也不过2-3%。</p>
<h4>移动广告平台</h4>
<h5>Admob</h5>
<p>“AdMob 是全球最大的手机广告网络之一，为在手机网上发掘商机、塑造品牌和实现收益提供解决方案。手机是重要的媒体平台，我们构建这些工具就是为了让世界上的每种业务都能通过手机来开展。”国内的有米、微云、架势等大多是此模式广告平台。<a href="http://www.admob.com/">www.admob.com</a></p>
<p><strong>下图是admob</strong><strong>类广告平台的工作机制：</strong></p>
<p><a href="http://www.web20share.com/wp-content/uploads/2010/12/clip_image003.gif"><img title="clip_image003" src="http://www.web20share.com/wp-content/uploads/2010/12/clip_image003_thumb.gif" border="0" alt="clip_image003" width="617" height="308" /></a></p>
<h5>Adwhirl、Mobclix</h5>
<p>adwhirl（已被admob收购）和mobclix是android和iphone平台面向开发者的移动广告收入优化工具，特点是免费、透明、 完全开放。相当于一个广告平台的交换平台，开发者在adwhirl上就可以同时设置显示来自不同广告平台的广告。目前这种交换平台较适合国内的移动广告环 境（减少了由于单一广告平台由于广告存货不足造成的展示浪费，并能主动选择更符合app特点的广告平台），国内类似的有果合移动广告。</p>
<p><strong>下图是Adwhirl</strong><strong>、果合类广告平台的工作机制：</strong></p>
<p><a href="http://www.web20share.com/wp-content/uploads/2010/12/clip_image001.gif"><img title="clip_image001" src="http://www.web20share.com/wp-content/uploads/2010/12/clip_image001_thumb.gif" border="0" alt="clip_image001" width="695" height="338" /></a></p>
<h3>有米</h3>
<p>“有米广告平台最大的特色在于能够为企业广告主提供精准的广告投放，让广告按广告主设定的投放目标在合适的时间到达合适地点的受众手中，并让广告在 手机上变得生动有趣，引人关注。平台还提供详实的广告统计功能，广告数据清晰透明，方便广告主了解广告效果、开发者了解收入情况。”<a href="http://www.youmi.net/">www.youmi.net</a></p>
<h3>架势</h3>
<p>“架势无线是中国领先的手机广告传媒，通过WAP、短信、彩信等无线广告投放，向企业提供精准营销的最佳服务。”www.casee.cn</p>
<h3>果合</h3>
<p>“果合移动广告是一个针对众多移动广告平台的收入优化工具。目前果合整合了国内外 6  家移动广告平台（admob、有米、wooboo、架势、易传媒、亿动广告），通过果合您可以调整各个平台广告的展示比例，优化您的收入结构，同时提高了 广告的填充率（由于整合了多家平台而获得了更多的广告展示机会），减少由于没有广告填充造成的收入浪费。”<a href="http://www.guohead.com/">www.guohead.com</a></p>
<h3>微云</h3>
<p>“微云广告是专注于中国市场的领先移动应用广告平台，为全球客户提供最优秀的无线互联网和新媒体营销解决方案。通过iPhone、Android、 Symbian等手机里的大量活跃应用内嵌广告，使用微云独有、世界首创的用户信息与行为分析系统和精确匹配和投放算法，为广告主提供精准广告和效果营销 服务，为应用开发者创造积极收益，为手机用户带来所需的信息和资讯。”<a href="http://www.wiyun.com/">www.wiyun.com</a></p>
<h3>哇棒</h3>
<p>“Wooboo(哇棒)是中国覆盖最广的手机广告自助交易平台，通过手机软件、手机游戏、WAP、短信、彩信等无线广告投放，向企业和个人提供精准营销的最佳服务.”www.wooboo.com</p>
]]></content:encoded>
			<wfw:commentRss>http://www.droidchina.com/2010/12/dig-gold-in-android-1.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>看图说话 – Android UI 设计秘笈 ：Part II</title>
		<link>http://www.droidchina.com/2010/11/android-ui-design-secret-part-i-2.html</link>
		<comments>http://www.droidchina.com/2010/11/android-ui-design-secret-part-i-2.html#comments</comments>
		<pubDate>Mon, 29 Nov 2010 17:44:12 +0000</pubDate>
		<dc:creator>DroidChina</dc:creator>
				<category><![CDATA[UI设计]]></category>
		<category><![CDATA[开发者]]></category>
		<category><![CDATA[设计]]></category>
		<category><![CDATA[UI]]></category>

		<guid isPermaLink="false">http://www.droidchina.com/?p=175</guid>
		<description><![CDATA[Android 的官方开发者博客发了一份幻灯片，介绍了一些 Android UI 设计的小贴士，整个 PPT 共分5个部分，Part II 翻译的是第三部分。 第一部分点击这里查看。 你必须了解（使用）的 UI 框架特性。 ... ]]></description>
			<content:encoded><![CDATA[<p>Android 的官方开发者博客发了<a href="http://www.slideshare.net/AndroidDev/android-ui-design-tips">一份幻灯片</a>，介绍了一些 Android UI 设计的小贴士，整个 PPT 共分5个部分，Part II 翻译的是第三部分。</p>
<p>第一部分点击<a href="http://www.droidchina.com/2010/11/android-ui-design-secret-part-i.html" target="_blank">这里</a>查看。</p>
<p><a href="http://android.google.org.cn/posts/android-ui-developments-part-ii.html/attachment/20"><img title="clip_image001" src="http://www.imliony.com/wp-content/uploads/2010/11/clip_image001.png" border="0" alt="clip_image001" width="537" height="416" /></a></p>
<p>你必须了解（使用）的 UI 框架特性。</p>
<p><a href="http://android.google.org.cn/posts/android-ui-developments-part-ii.html/attachment/21"><img title="clip_image002" src="http://www.imliony.com/wp-content/uploads/2010/11/clip_image002.png" border="0" alt="clip_image002" width="537" height="415" /></a></p>
<p>使用相对布局管理界面元素。<span id="more-175"></span></p>
<p>译 者注：相对布局和线性布局是Android里面常用的两种布局，线性布局比较简单，而相对布局可以做出比较复杂的布局管理，所以仅仅了解线性布局，很多时 候是不够的。不过以作者之前Qt的经验来看，Android里面的布局管理功能都比较阳春也不太容易使用，不过这可能是跟移动平台的性能考量有关系。</p>
<p><a href="http://android.google.org.cn/posts/android-ui-developments-part-ii.html/attachment/22"><img title="clip_image003" src="http://www.imliony.com/wp-content/uploads/2010/11/clip_image003.png" border="0" alt="clip_image003" width="537" height="415" /></a></p>
<p>使用资源修饰符来修饰同一套资源的多个不同版本。</p>
<p>1，一个apk包里面会包含所有的资源文件。</p>
<p>2，系统在运行时会根据软硬件环境来自动选择相应修饰符版本的资源。</p>
<p>译 者注：最常用的修饰符可能是locale修饰符（制作多语文本），dpi修饰符（为不同密度的屏幕制作不同尺寸的图标和皮肤），orientation修 饰符（为横屏和竖屏提供不同的UI布局）。如果系统找不到对应的修饰符版本，它就会选择无修饰符的版本，这个版本通常也是所谓的默认选择。</p>
<p><a href="http://android.google.org.cn/posts/android-ui-developments-part-ii.html/attachment/23"><img title="clip_image004" src="http://www.imliony.com/wp-content/uploads/2010/11/clip_image004.png" border="0" alt="clip_image004" width="536" height="416" /></a></p>
<p>使用 9-patch drawables – foo.9.png</p>
<p>1，9-patch drawables 的语法跟CSS3 border image 类似</p>
<p>2，根据边缘的像素宽度切割出不同的拉伸区域</p>
<p>3，最好同时提供 mdpi 和 hdpi 的版本</p>
<p>译 者注：drawables 在 Android 里面跟 WPF 里面的 Drawing  类似，用于定义一个可绘制的对象，包括位图，刷子，填充颜色或者以上物件的组合等等。所谓 9-patch drawables，就是将一个  drawable 按照定义的 4 个边缘的宽度大小切割成9个区域，包括4个角落，4条边缘和一个中心区域，当把这个 drawable  绘制到一个任意矩形区域时，drawable 的各个区域有不同的拉伸控制（角落不拉伸，横边横向拉伸，竖边竖向拉伸，中心区域横竖向都拉伸）。通常使用  9-patch drawable  一般是为了绘制出比较漂亮的带圆角背景，这样可以避免圆角及边缘被任意拉伸导致变形。当然，如果你的程序里面绘制的图像和目标区域大小完全一样，就不需要 那么麻烦，不过以 Android 的状况来说，为了适应多种设备，最好不要事先假设目标区域的像素大小。</p>
<p><a href="http://android.google.org.cn/posts/android-ui-developments-part-ii.html/attachment/24"><img title="clip_image005" src="http://www.imliony.com/wp-content/uploads/2010/11/clip_image005.png" border="0" alt="clip_image005" width="537" height="414" /></a></p>
<p><a href="http://android.google.org.cn/posts/android-ui-developments-part-ii.html/25-2"><img title="clip_image006" src="http://www.imliony.com/wp-content/uploads/2010/11/clip_image006.png" border="0" alt="clip_image006" width="537" height="415" /></a></p>
<p>使用 Selector (state list) drawables （状态列表）来提供不同状态（normal，disabled，focused，pressed…）下的绘制图像。</p>
<p><a href="http://android.google.org.cn/posts/android-ui-developments-part-ii.html/attachment/26"><img title="clip_image007" src="http://www.imliony.com/wp-content/uploads/2010/11/clip_image007.png" border="0" alt="clip_image007" width="537" height="414" /></a></p>
<p><a href="http://android.google.org.cn/posts/android-ui-developments-part-ii.html/attachment/27"><img title="clip_image008" src="http://www.imliony.com/wp-content/uploads/2010/11/clip_image008.png" border="0" alt="clip_image008" width="537" height="416" /></a></p>
<p>使用 Layer drawables （多层叠加）来制作具备复杂效果的可绘制图像。</p>
<p>译 者注：所谓多层叠加，使用PS来制作图标和皮肤的同学可能都清楚，比如说一个按钮的PS模板通常会包括所谓的background层定义底色，mask层 定义轮廓，shine层定义前景的高亮效果。而 Android 里面允许你直接在 XML 脚本里面使用 Layer drawables  的语法来定义上述的多层叠加效果，这样可能比在PS里面直接做好要更灵活一些，并且有的层可以是来自png位图，有的层可以是直接通过 XML  脚本生成（比如纯色，过渡色等等）。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.droidchina.com/2010/11/android-ui-design-secret-part-i-2.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>看图说话:Android UI 设计秘笈 Part I</title>
		<link>http://www.droidchina.com/2010/11/android-ui-design-secret-part-i.html</link>
		<comments>http://www.droidchina.com/2010/11/android-ui-design-secret-part-i.html#comments</comments>
		<pubDate>Mon, 29 Nov 2010 17:42:19 +0000</pubDate>
		<dc:creator>DroidChina</dc:creator>
				<category><![CDATA[UI设计]]></category>
		<category><![CDATA[开发者]]></category>
		<category><![CDATA[设计]]></category>
		<category><![CDATA[UI]]></category>

		<guid isPermaLink="false">http://www.droidchina.com/?p=168</guid>
		<description><![CDATA[Android 的官方开发者博客发了一份幻灯片，介绍了一些 Android UI 设计的小贴士，Roger 在这里以看图说话的形式发出来，有兴趣的读者就继续往下翻吧。整个 PPT 共分5个部分，Part I 翻译的是前两... ]]></description>
			<content:encoded><![CDATA[<p>Android 的官方开发者博客<a href="http://www.slideshare.net/AndroidDev/android-ui-design-tips">发了一份幻灯片</a>，介绍了一些 Android UI 设计的小贴士，Roger 在这里以看图说话的形式发出来，有兴趣的读者就继续往下翻吧。整个 PPT 共分5个部分，Part I 翻译的是前两个部分。</p>
<p><a href="http://www.droidchina.com/wp-content/uploads/2010/11/67df_clip_image001.png"><img class="alignnone size-full wp-image-170" title="67df_clip_image001" src="http://www.droidchina.com/wp-content/uploads/2010/11/67df_clip_image001.png" alt="" width="550" height="422" /></a></p>
<p><a href="http://www.droidchina.com/wp-content/uploads/2010/11/251d_clip_image002.png"><img class="alignnone size-full wp-image-171" title="251d_clip_image002" src="http://www.droidchina.com/wp-content/uploads/2010/11/251d_clip_image002.png" alt="" width="550" height="423" /></a></p>
<p>作为开发者，为啥我们要关心UI，前面的一堆通通可以忽略掉，直接跳到最后一条。因为好的UI设计可以帮助我们卖出更多拷贝，赚到更多钱^_^<span id="more-168"></span></p>
<p><a href="http://www.droidchina.com/wp-content/uploads/2010/11/499e_clip_image003.png"><img class="alignnone size-full wp-image-172" title="499e_clip_image003" src="http://www.droidchina.com/wp-content/uploads/2010/11/499e_clip_image003.png" alt="" width="550" height="424" /></a></p>
<p>这个 PPT 包含5个部分：</p>
<ol>
<li>该做什么，不该做什么</li>
<li>设计哲学和考量</li>
<li>你必须了解的 UI 框架特性</li>
<li>新的 UI 设计模式</li>
<li>图标和准则</li>
</ol>
<p><a href="http://www.droidchina.com/wp-content/uploads/2010/11/5770_clip_image004.png"><img class="alignnone size-full wp-image-173" title="5770_clip_image004" src="http://www.droidchina.com/wp-content/uploads/2010/11/5770_clip_image004.png" alt="" width="550" height="423" /></a></p>
<p><a href="http://www.droidchina.com/wp-content/uploads/2010/11/6326_clip_image005.png"><img class="alignnone size-full wp-image-174" title="6326_clip_image005" src="http://www.droidchina.com/wp-content/uploads/2010/11/6326_clip_image005.png" alt="" width="550" height="425" /></a></p>
<p>Don’t:</p>
<ol>
<li>不要照搬你在其它平台的UI设计，应该让用户感觉是在真正使用一个 Android 软件，在你的商标显示和平台整体观感之间做好平衡</li>
<li>不要过度使用模态对话框</li>
<li>不要使用固定的绝对定位的布局</li>
<li>不要使用px单位，使用dp或者为文本使用sp</li>
<li>不要使用太小的字体</li>
</ol>
<p><a href="http://android.google.org.cn/posts/android-ui-developments-part-i.html/p6"><img title="clip_image006" src="http://www.alibuybuy.com/wp-content/uploads/2010/11/2db1_clip_image006.png" border="0" alt="clip_image006" width="550" height="423" /></a></p>
<p><a href="http://android.google.org.cn/posts/android-ui-developments-part-i.html/p7"><img title="clip_image007" src="http://www.alibuybuy.com/wp-content/uploads/2010/11/6edd_clip_image007.png" border="0" alt="clip_image007" width="550" height="426" /></a></p>
<p>Do:</p>
<p>1&gt; 为高分辨率的屏幕创建资源（缩小总比放大好）</p>
<p>2&gt; 需要点击的元素要够大</p>
<p>3&gt; 图标设计遵循 Android 的准则</p>
<p>4&gt; 使用适当的间距（margins, padding）</p>
<p>5&gt; 支持D-pad和trackball导航</p>
<p>6&gt; 正确管理活动（activity）堆栈</p>
<p>7&gt; 正确处理屏幕方向变化</p>
<p>8&gt; 使用主题/样式，尺寸和颜色资源来减少多余的值</p>
<p>9&gt;和视觉交互设计师合作!!!</p>
<p><a href="http://android.google.org.cn/posts/android-ui-developments-part-i.html/p8"><img title="clip_image008" src="http://www.alibuybuy.com/wp-content/uploads/2010/11/30cb_clip_image008.png" border="0" alt="clip_image008" width="550" height="424" /></a></p>
<p><a href="http://android.google.org.cn/posts/android-ui-developments-part-i.html/p9"><img title="clip_image009" src="http://www.alibuybuy.com/wp-content/uploads/2010/11/e1e4_clip_image009.png" border="0" alt="clip_image009" width="550" height="425" /></a></p>
<p>设计哲学:</p>
<p>1&gt; 干净而不过于简单</p>
<p>2&gt; 关注内容而非修饰</p>
<p>3&gt; 保存一致，让用户容易投入其中，可附加少许变化</p>
<p>4&gt; 使用云端服务（存储和同步用户资料）来加强用户体验</p>
<p><a href="http://android.google.org.cn/posts/android-ui-developments-part-i.html/p10"><img title="clip_image010" src="http://www.alibuybuy.com/wp-content/uploads/2010/11/0e22_clip_image010.png" border="0" alt="clip_image010" width="550" height="426" /></a></p>
<p>优秀界面的设计准则:</p>
<p>1&gt; 关注用户</p>
<p>2&gt; 显示正确的内容</p>
<p>3&gt; 给予用户适当的回馈</p>
<p>4&gt; 有章可循的行为模式</p>
<p>5&gt; 容忍错误</p>
<p><a href="http://android.google.org.cn/posts/android-ui-developments-part-i.html/p11"><img title="clip_image011" src="http://www.alibuybuy.com/wp-content/uploads/2010/11/1fe3_clip_image011.png" border="0" alt="clip_image011" width="550" height="423" /></a></p>
<p>关注用户：</p>
<p>1&gt; 了解你的用户（年龄，技能，文化，对你的应用的需求，使用的设备，何时何地如何使用设备）</p>
<p>2&gt; ‘用户优先’的设计心态 （用户通常是任务导向的行为模式）</p>
<p>3&gt; 更早，更频繁的由真实用户来测试</p>
<p><a href="http://android.google.org.cn/posts/android-ui-developments-part-i.html/p12"><img title="clip_image012" src="http://www.alibuybuy.com/wp-content/uploads/2010/11/6fcc_clip_image012.png" border="0" alt="clip_image012" width="550" height="423" /></a></p>
<p>显示正确的内容：</p>
<p>1&gt; 最常用的操作需要最快被用户看到并且可用</p>
<p>2&gt; 不太常用的功能可以放到菜单里面</p>
<p><a href="http://android.google.org.cn/posts/android-ui-developments-part-i.html/p13"><img title="clip_image013" src="http://www.alibuybuy.com/wp-content/uploads/2010/11/4614_clip_image013.png" border="0" alt="clip_image013" width="550" height="423" /></a></p>
<p>给予用户适当的回馈：</p>
<p>1&gt; 交互式的UI元素最少需要反映出4种不同的状态 （default，disabled，focused，pressed）</p>
<p>2&gt; 保证操作的结果是清晰可见的</p>
<p>3&gt; 多给予用户进度提示，但是不要干扰他们当前的操作</p>
<p><a href="http://android.google.org.cn/posts/android-ui-developments-part-i.html/p14"><img title="clip_image014" src="http://www.alibuybuy.com/wp-content/uploads/2010/11/1904_clip_image014.png" border="0" alt="clip_image014" width="550" height="425" /></a></p>
<p><a href="http://android.google.org.cn/posts/android-ui-developments-part-i.html/p15"><img title="clip_image015" src="http://www.alibuybuy.com/wp-content/uploads/2010/11/050d_clip_image015.png" border="0" alt="clip_image015" width="550" height="421" /></a></p>
<p>有章可循的行为模式：</p>
<p>1&gt; 行为模式遵循用户的期望（正确的操作活动堆栈，显示用户期望看到的信息和动作）</p>
<p>2&gt; 使用合适的方式来加强功能可见性（可点击的元素就应该看起来是可以点击的）</p>
<p>3&gt; 如果用户完成一项任务需要复杂的操作，重新思考你的设计!!!</p>
<p><a href="http://android.google.org.cn/posts/android-ui-developments-part-i.html/p16"><img title="clip_image016" src="http://www.alibuybuy.com/wp-content/uploads/2010/11/0bb8_clip_image016.png" border="0" alt="clip_image016" width="550" height="423" /></a></p>
<p>容忍错误：</p>
<p>1&gt; 只允许有意义的操作（适当禁用一些按钮）</p>
<p>2&gt; 尽量减少不可回退的操作</p>
<p>3&gt; 允许回退（undo）比使用确定对话框更好（实际上，应该尽量少用确定对话框，它对用户是一种干扰）</p>
<p><a href="http://android.google.org.cn/posts/android-ui-developments-part-i.html/p17-2"><img title="clip_image017" src="http://www.alibuybuy.com/wp-content/uploads/2010/11/f56b_clip_image017.png" border="0" alt="clip_image017" width="550" height="424" /></a></p>
<p>如果错误是可能发生的，那它就一定会发生。</p>
<p>- Donald Norman, The Design of Everyday Things 作者</p>
<p><a href="http://android.google.org.cn/posts/android-ui-developments-part-i.html/p18"><img title="clip_image018" src="http://www.alibuybuy.com/wp-content/uploads/2010/11/4be0_clip_image018.png" border="0" alt="clip_image018" width="550" height="424" /></a></p>
<p>设计考量：</p>
<p>1&gt;屏幕的物理尺寸</p>
<p>2&gt;屏幕密度</p>
<p>3&gt; 屏幕的方向（竖向和横向）</p>
<p>4&gt;主要的UI交互方式（触屏还是使用D-pad/trackball）</p>
<p>5&gt;软键盘还是物理键盘</p>
<p><a href="http://android.google.org.cn/posts/android-ui-developments-part-i.html/p19"><img title="clip_image019" src="http://www.alibuybuy.com/wp-content/uploads/2010/11/e195_clip_image019.png" border="0" alt="clip_image019" width="550" height="424" /></a></p>
<p>设计考量：</p>
<p>6&gt;了解不同设备之间的相异之处是非常重要的!</p>
<p>7&gt;阅读CDD，学习设备可能差异的地方</p>
<p>8&gt;了解屏幕尺寸和密度分类</p>
]]></content:encoded>
			<wfw:commentRss>http://www.droidchina.com/2010/11/android-ui-design-secret-part-i.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>listview与ScrollView老问题的另类解法</title>
		<link>http://www.droidchina.com/2010/11/listview%e4%b8%8escrollview%e8%80%81%e9%97%ae%e9%a2%98%e7%9a%84%e5%8f%a6%e7%b1%bb%e8%a7%a3%e6%b3%95.html</link>
		<comments>http://www.droidchina.com/2010/11/listview%e4%b8%8escrollview%e8%80%81%e9%97%ae%e9%a2%98%e7%9a%84%e5%8f%a6%e7%b1%bb%e8%a7%a3%e6%b3%95.html#comments</comments>
		<pubDate>Sun, 21 Nov 2010 16:04:54 +0000</pubDate>
		<dc:creator>DroidChina</dc:creator>
				<category><![CDATA[代码样例]]></category>

		<guid isPermaLink="false">http://www.droidchina.com/2010/11/listview%e4%b8%8escrollview%e8%80%81%e9%97%ae%e9%a2%98%e7%9a%84%e5%8f%a6%e7%b1%bb%e8%a7%a3%e6%b3%95.html</guid>
		<description><![CDATA[这几天一直被listview怎么合理的放进scorllview中的问题困扰，尝试过把listview放入scorllview中的朋友都知道，被放入的listview显示是有问题的，无论怎么设置layout都只显示大概2行的高度，看起来很... ]]></description>
			<content:encoded><![CDATA[<p>这几天一直被listview怎么合理的放进scorllview中的问题困扰，尝试过把listview放入scorllview中的朋友都知道，被放入的listview显示是有问题的，无论怎么设置layout都只显示大概2行的高度，看起来很郁闷，更别说美观了，后来上网查询了一下，解决方法有的是用linearlayout替换listview，还有修改onmeasure的，我比较懒个人感觉很麻烦不喜欢，终于想出了一个还算和谐的解决方法：xml中的textlist设置如下：<br />
&lt;?xml version=“1.0” encoding=“UTF-8”?&gt;<br />
&lt;LinearLayout xmlns:android=“<a href="http://schemas.android.com/apk/res/android">http://schemas.android.com/apk/res/android</a>”<br />
    android:layout_width=“fill_parent”<br />
    android:layout_height=“wrap_content”<br />
    android:orientation=“vertical”<br />
    android:background=“#44444444”&gt;<br />
&lt;ScrollView<br />
     android:layout_width=“fill_parent”<br />
     android:layout_height=“wrap_content”&gt;<br />
    &lt;LinearLayout<br />
            android:id=“@+id/ll1”<br />
            android:layout_width=“fill_parent”<br />
            android:layout_height=“wrap_content”<br />
            android:scrollbars=“vertical”<br />
            android:orientation=“vertical”<br />
            android:paddingLeft=“15dp”<br />
            android:paddingRight=“15dp”<br />
            android:paddingTop=“30dp”<br />
            android:paddingBottom=“30dp”<br />
            android:background=“#ff888888”&gt;<br />
            &lt;TextView<br />
                    android:text=“あ”<br />
                    android:textColor=“#ffeeeeee”<br />
                    android:textSize=“18sp”<br />
                    android:layout_width=“fill_parent”<br />
                    android:layout_height=“wrap_content”&gt;&lt;/TextView&gt;<br />
            &lt;ListView<br />
                    android:scrollbars=“none”<br />
                    android:stackFromBottom=“true”<br />
                    android:id=“@+id/lv0”<br />
                    android:layout_width=“fill_parent”<br />
                    android:layout_height=“20dp”&gt;&lt;/ListView&gt;<br />
                    &lt;/LinearLayout&gt;<br />
&lt;/ScrollView&gt;<br />
&lt;/LinearLayout&gt;<br />
其中的textview是我做的东西要用到的，和方法无关可以不看，然后就是在java中重新设置listview的高度了，目的是把listview“撑”开：<br />
LinearLayout.LayoutParams  lp5 =new LinearLayout.LayoutParam(LayoutParams.FILL_PARENT, listItem.size()*51-1);<br />
其中第一个属性不必说了，第二个是为了计算listview要设置的总高度用的，51是我事先设置好的一行的高度（50）+每行之间的间隔（1）而得来的，listItem.size()是我要显示的行数，用.setLayoutParams(lp5);来重新设置高度，其他别的设置跟以前一样，想要源码我整理完之后贴出来</p>
]]></content:encoded>
			<wfw:commentRss>http://www.droidchina.com/2010/11/listview%e4%b8%8escrollview%e8%80%81%e9%97%ae%e9%a2%98%e7%9a%84%e5%8f%a6%e7%b1%bb%e8%a7%a3%e6%b3%95.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>资深软件工程师谈Android开发经验</title>
		<link>http://www.droidchina.com/2010/11/%e8%b5%84%e6%b7%b1%e8%bd%af%e4%bb%b6%e5%b7%a5%e7%a8%8b%e5%b8%88%e8%b0%88android%e5%bc%80%e5%8f%91%e7%bb%8f%e9%aa%8c.html</link>
		<comments>http://www.droidchina.com/2010/11/%e8%b5%84%e6%b7%b1%e8%bd%af%e4%bb%b6%e5%b7%a5%e7%a8%8b%e5%b8%88%e8%b0%88android%e5%bc%80%e5%8f%91%e7%bb%8f%e9%aa%8c.html#comments</comments>
		<pubDate>Sun, 21 Nov 2010 15:59:16 +0000</pubDate>
		<dc:creator>DroidChina</dc:creator>
				<category><![CDATA[高级技巧]]></category>
		<category><![CDATA[布局]]></category>
		<category><![CDATA[开发]]></category>
		<category><![CDATA[经验]]></category>
		<category><![CDATA[界面]]></category>

		<guid isPermaLink="false">http://www.droidchina.com/2010/11/%e8%b5%84%e6%b7%b1%e8%bd%af%e4%bb%b6%e5%b7%a5%e7%a8%8b%e5%b8%88%e8%b0%88android%e5%bc%80%e5%8f%91%e7%bb%8f%e9%aa%8c.html</guid>
		<description><![CDATA[从G1上市到现在，市面上已经出现了至少30款Android手机。为什么至今依然有一些用户在抱怨Android不好用，在相关的开发中，什么才是真正值得关注的，开发的核心是什么?为什么移动应用需要格... ]]></description>
			<content:encoded><![CDATA[<p>从G1上市到现在，市面上已经出现了至少30款Android手机。为什么至今依然有一些用户在抱怨Android不好用，在相关的开发中，什么才是真正值得关注的，开发的核心是什么?为什么移动应用需要格外关注用户体验?本文将对这些问题尽可能的作出解答。</p>
<p>Android一词的本义指“机器人”，同时也是Google于2007年11月5日宣布的基于Linux的开源手机操作系统的名称，该平台由操作系统、中间件、用户界面和应用程序组成，是首个真正为移动终端打造的开放并且完整的移动平台。2008年9月22日，美国运营商T-Mobile USA 在纽约正式发布第一款Google手机，即T-Mobile G1，从那个时候起，Android的时代就真正的来临了。</p>
<p>从Android 1.0至今经历了多次的版本更新，其中重要的变更是1.5、2.0和2.2。而其他的版本更新相对而言并不是那么重要。另外，由于每次更新都会多少改动包括 Dalvik 在内的底层模块，同时牵扯到 SDK，导致了一些程序需要跟着 Android 版本进行变动。对于相对较为保守的开发人员而言，快速的版本更新将给他们带来越来越大的限制。在这种情况下，Android 开源的意义就显得不是那么大了。</p>
<p>无论如何，由于Android与Google服务的紧密捆绑，这款操作系统拥有了得天独厚的优势。通过Google强有力的支持，很多事情在 Android上都会变得很简单。另外需要特别提出的是，Android是一款基于互联网的操作系统，在可以连接上互联网的情况下，一款Android 手机可以发挥出比其他手机更多的能力。而在没有网络的情况下，Android手机并不比其他的手机出色，尤其是娱乐性相对于iPhone可以说是逊色不少。</p>
<p>作为开发人员，应当在学习并深入了解Android之后，在自己的软件中，将Android的优势发挥出来，同时通过一些手段去弥补Android 本身的缺陷或不足。下面来看一下Android拥有的特点吧：</p>
<p>与硬件交互非常方便，包括摄像头、GPS 等，都可以简单的操作。</p>
<ul style="list-style-type: disc">
<li>拥有自己的运行时和虚拟机，优秀的内存管理能力。</li>
<li>提供丰富的界面控件供开发者使用，允许可视化开发，并保证Android平台下的应用程序界面一致。</li>
<li>提供轻量级的进程间通信机制。</li>
<li>支持无界面的后台服务类应用程序。</li>
<li>支持高效、快速的数据存取方式。</li>
</ul>
<p>在这些特性的支持下，试图在Android下开发一个应用不会太过困难。事实上，一个稍有 Java经验的开发人员，都可以快速的上手进行 Android的开发。而开发的核心，一直以来也是围绕着Android手机几个大的特点来进行的，其中就包括了触摸屏、摄像头、GPS模块、互联网功能、语音输入、Google账户等。需要说的是，如果一位 J2ME 工程师想转行做Android，那么他将付出的代价比J2SE或J2EE工程师要大得多。毕竟Android所支持的是基本完整的J2SE的子集，反过来再看J2ME就会觉得它的功能太弱了。</p>
<p>除了Java外，还有许多语言支持Android 的开发，比较为人所熟知的有Scala，而作为 Android本身的底层语言，C/C++的作用也完全不可忽视。而目前的开源社区内，已经有一些牛人在尝试让更多的语言可以开发Android应用。比较有代表性的可能是Koushik Dutta，他已经解决了在Mono平台下，让Dalvik调用Mono 代码的问题。或许在不久的将来，.NET 下的所有语言，都有可能借助Mono跑在Android上，这是一件值得让人期待的事情。</p>
<p>语言已不是问题，那还有什么会成为问题?也许很多人会说“经验”。诚然，经验决定了一位开发人员能否快速地、流畅地完成开发工作，也决定了软件的鲁棒性，Bug的数量、等级和修正问题的返工次数。不过我认为，这些都不重要，哪怕是一个 Android 行业的新人，一边查询文档一边做开发，虽然效率会很低，但是一样能把项目做完。在 Android 下，开发技术几乎是没有瓶颈的。那么瓶颈在哪里呢?事实上，在用过很多软件后，就会发现，有很多软件并不好用。很多用户不愿意用某个软件，也并不是因为软件没有技术含量或是满足不了需求，原因很简单，就是不好用。</p>
<p>用户体验是凌驾于技术之上的，可以说，优秀的用户体验将可以起到事半功倍的效果，在一堆同类的软件中，下载量最大的，一定是让用户用着感觉最舒服的，哪怕它 的功能并不比其他的产品出色，甚至略差一些。我见过很多开发人员，他们视技术为己任，一心只钻研技术，认为技术出色的软件，会受到用户的好评，甚至在一个 手机游戏中，加入各种华丽炫目的3D效果。这些固然都不错，但是真正的用户却不会喜爱它们。在移动应用中，简洁明快才是用户希望看到的。试想一下，当用户在手机上玩一个RPG游戏，并被华丽的3D效果充斥了整个界面，那么他将完全无法着手进行下一个动作。诚然，华丽的画面是很容易吸引人，但是在这种华丽的背后，却会直接把用户和开发者自己领入一条深渊，再也无法回头，最终的结果就是，用户完全舍弃该款游戏，开发者或运营商也完全赚不到钱。</p>
<p>在移动平台开发的过程中，用户体验已经成为首要大事，只有聚焦在用户的设计，才有可能被用户所接受。下面来看一些典型的例子。</p>
<p>上图是经典的Windows Mobile 6.1的界面，从Windows Mobile推 出的那天起，这个界面就一直被宣传成内容充实，包含常用所有功能的入口，非常贴合用户的实际需求。也许在当时，这样的界面确实能满足一定的需求，但是到了 现在，这样的设计只能说是远离用户。每一项的高度都过小，因此需要使用笔来点击，或是使用指甲。位于右下角的三个图标，或许用指甲都很难点到，使用笔即多 占用用户的一只手，体验是直线下降的。在用户希望连耳朵都解放的现在，多占用一只手是什么概念，这就意味着用户乘车时没有办法握紧扶手，或者没有办法拎着 自己的包。另外，在手机操作时，拥有一只空闲着的手，就能有更多机会处理突发事件，占用用户的两只手实在是不应该的。可以说Windows Mobile 的用户体验是非常差劲的，幸好微软在新的Windows Phone 7中，对界面做了巨大的改进，没有再犯过去的错误。</p>
<p>再来看看Android是如何做的，这个界面看起来简洁明了，和上面的Windows Mobile相比，可以说是毫不出彩，甚至在有些人的眼里，这个界面很丑陋。但它却是相当好用的，图标很大，图标的间距也很大。这就决定了用户可以使用指腹去进行点击的操作，并且点击的范围可以比较大，降低了点错的几率。</p>
<p>虽然屏幕点击的方式一定程度上也和屏幕的材质有关，比如电阻屏只能用笔或指甲，而电容屏允许使用指腹，有一些还可以支持多点触摸。对于普通用户来说，使用指 腹比使用指甲显得更为常见，原因很简单，如果图标很大，那么用户会不自觉的使用指腹去点击，而如果图标很小，那么用户会屈起手指然后用指甲去戳屏幕。这个 “屈起手指”的动作不能被大部分的用户所接受。因此电容屏会渐渐流行，而电阻屏会渐渐被淘汰，这完全是根据用户的体验，优胜劣汰，是一件非常符合进化论的事。</p>
<p>用户体验还不仅仅是界面上的那些事，作为手机来说，每一个特点都将成为用户体验可以挖掘的一部分。比如说是否有键盘、是否支持多点触摸等。有键盘的手机与无 键盘的手机，用户在执机时用的手势必然不同，一个着重点在机身下半部分，即键盘上;而另一个着重点在整个屏幕上，换言之，手指可能在屏幕的任何一个位置活 动。针对设备的具体情况来对应用进行设计也是很有必要的，目前Google为Android设 计的按屏幕大小自动切换布局方式的框架非常有用，它改变了以往在程序的设计过程中，需要为每一种设备单独编译一个版本，或是仅对不同的屏幕做简单拉伸的情 况。另外，在设计中，还需要考虑实际操作体验，比如放大一张图片，是使用放大按钮，还是使用多点触摸。这两种做法都很常见，但是在一个有此需求的应用中， 却不能单独的使用某一种。比较好的做法是，在程序代码中，判断设备是否支持多点触摸，若不支持，可以显示一个放大按钮，而对于支持的，则在应用第一次启动 时，弹出一个Toast提示，告诉用户可以多点触摸从而放大图片。</p>
<p>下面再说说应用界面布局的问题，来看下面两个截图。</p>
<p>这两个应用同为Android下的游戏机模拟器，上面的图是PS模拟器，可以看到虚拟按键的布局有些奇怪，特别是 L和R，一上一下非常不习惯。而右面的是GBA模拟器，可以看到它的按键中规中矩，用户马上就可以上手了。但是，从上手的角度来说，GBA模拟器的确简单，但是从实用的角度来说，PS模拟器做得更好。为什么呢?原因很简单，PS模拟器利用到了整个屏幕，而且虚拟按键的布局，防止了两只手打架，也防止了屏幕下半部分由于手指的原因完全不可见的问题。通过一段时间的习惯，PS 模拟器就可以被玩得很溜。而再看GBA模拟器，只利用到了一半的屏幕不说，而且还是纵向的，双手操作时，两只手很容易打架，相互干扰，要玩一些动作性稍强的游戏几乎不可能。虽然看起来直观易懂，但是这样的UI，是会被用户所舍弃的。</p>
<p>在移动平台上，到目前为止，用户依然没有固定的操作习惯，而软件的开发人员要做的事情，就是把用户往一个简单、明快的操作体验上引导，使他们更快的学会使用软件，并且让他们习惯、擅长某一种或几种操作。从某种意义上来说，苹果的设计人员手册已经很好的解决了问题，iPad已经做到了中老年人也可以轻松上手，甚至连猫都会玩。但是至少目前为止，还没有见到适用于Android的设计手册，开发人员或是软件厂商也都各按自己的理解去进行软件的设计，用户也被迫在使用不同的软件时，适应不同的风格。</p>
<p>在未来为期不短的一段时间内，Android上应用程序的用户体验将成为一个主要的研究点，特别是游戏类应用。由于Android上的某些限制，开发人员较难实现像PSP游戏那样的华丽效果，因此只能够在游戏本身的游戏性上下足工夫。当然了，等Android手机的性能再次大幅提升，电池容量再大幅提升后，可能会出现可以匹敌PSP游戏的华丽游戏，只是目前不应当过分考虑这些。</p>
<p>在我以前的一些文章也曾提到过，为移动平台做开发，应该尽可能的考虑程序的执行效率而不是架构，因为移动平台本身通常不会有多好的配置，在有限的配置下实现性能最佳化是非常重要的。从另一种角度上说，iPhone 能够用较低的配置来实现整机流畅运作，也是得益于较为严格地针对性优化，把硬件平台的性能完全发挥出来，这样做得到的结果是，iPhone的整体性能，看起来反而比一些更高配置的手机要好一些。</p>
<p>最后，再简单地说一下Android的开发与其他平台的开发有什么异同。我们知道不同的开发方式将对最终的结果产生不同的影响。在以往的经验中，各厂家的开发工具，都在往可视化方向发展，比如说微软的 Visual Studio，一代比一代强大，可视化程度越来越高。而苹果的Xcode也是一样，它建议用户完全使用可视化的方案来解决一个应用。这些固然很好，但是带来的问题也不小。举个简单的例子，有一个 Windows Mobile 的应用，上面有一个 ListBox，而你正试图为该 ListBox 添加一个图标，并试图按每一项的内容限定来改变文字颜色。能做到吗?当然能，但是过程却不简单，你必须经历复杂的自绘才能实现这一点。这也是常规的RAD 开发中普遍遇到的问题，即开发人员不能方便地控制到应用的每一个细节。开发框架对API的封装在某种程度上提高了开发的效率，但是另一种程度上，它屏蔽了太多的细节，而这些细节有可能就是开发人员所需要的。</p>
<p>而Android虽然也拥有可视的开发环境，但是它非常弱，第三方的RAD方案迄今为止也依然显得虚弱无力，对于用惯了微软等公司出品的高级RAD 环境的人来说，可能会充满了无奈，也可能充满了鄙视，这种可视化算什么呢?如果仅仅从开发人员的角度来看，有利也有弊，弊端很显然是开发效率不够高，而事实上，由于Android采用Java语言来进行开发，其开发效率本身就不会太高。而利的部分，可能是会被很多高级工程师所喜爱的，因为它是牺牲开发效率，来换取最大的可定制性的一个典范。也许有一些刚开始学习Android开发的朋友会觉得制作界面有种种的不便，但是只要深入地学习下去，就会觉得 Android的界面实现方式是非常领先的。同样举出上面ListBox的例子，在Android下，就可以通过一组短小精悍的代码来自定义 ListItem和相关Adapter以实现。</p>
<p>我想优秀的开发人员是应该完全放弃RAD的，在目前的环境下，RAD几乎没有什么作为，反而会成为应用分层的一个巨大的绊脚石。在RAD的环境下，要求一位开发人员对软件的每一个部分都面面俱到，这怎么可能呢?比如说软件界面就是应该交由UI专员去设计，数据库部分也应该交由相关的负责人去做，完全不可能由开发人员从头到尾一个人搞定。如果哪个老板真的雇用了一位超级开发人员来包办一切，那么除非那个人拥有100 年的工作经验，不然的话项目做死就是活该。我想Android的开发框架已经很好地说明了这个问题，程序资源(包括图片、字符串、其他的外部数据等)和代码完全分离，各部分人员各司其职，完成整个项目，每个部分的人员都不会有太大的压力。并且，由于Android采用XML对界面进行描述，使得对界面的更换也变得容易，设计师可以设计出多套界面，不论是用于UI方案评估或是在实际应用中更换界面风格都很方便。这也是其他移动平台的开发所不具备的。</p>
<p>最后，我向大家推荐一本《Google Android开发入门与实战》的专业书籍。相信Android必定越来越成熟，而开发者们，你们做好思想准备了吗?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.droidchina.com/2010/11/%e8%b5%84%e6%b7%b1%e8%bd%af%e4%bb%b6%e5%b7%a5%e7%a8%8b%e5%b8%88%e8%b0%88android%e5%bc%80%e5%8f%91%e7%bb%8f%e9%aa%8c.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>怎样成为一名Android开发者</title>
		<link>http://www.droidchina.com/2010/11/how-to-become-an-android-developer.html</link>
		<comments>http://www.droidchina.com/2010/11/how-to-become-an-android-developer.html#comments</comments>
		<pubDate>Sun, 21 Nov 2010 09:55:28 +0000</pubDate>
		<dc:creator>DroidChina</dc:creator>
				<category><![CDATA[新手上路]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[开发者]]></category>
		<category><![CDATA[收入]]></category>

		<guid isPermaLink="false">http://www.droidchina.com/2010/11/%e6%80%8e%e6%a0%b7%e6%88%90%e4%b8%ba%e4%b8%80%e5%90%8dandroid%e5%bc%80%e5%8f%91%e8%80%85.html</guid>
		<description><![CDATA[Chris（克里斯）是一位来自波兰的Android应用开发者，最为一名非著名的开发者他开发的应用在Android Market上免费提供下载，并通过广告获得收入，最近他在自己的博客上面分享了从事Android开发... ]]></description>
			<content:encoded><![CDATA[<p>Chris（克里斯）是一位来自波兰的Android应用开发者，最为一名非著名的开发者他开发的应用在Android Market上免费提供下载，并通过广告获得收入，最近他在自己的博客上面分享了从事Android开发带来的收入情况，并通过自己的经历给予 Android开发入门者非常忠实的忠告。作为国内从事Android开发的同行，APP虎第一时间发现并翻译了他的文章，以与广大Android开发者和即将进入Android开发的人们分享。</p>
<p>很多人认为从事Android开发是一件赔本的买卖。 他们说，如果你想赚钱，你应该转向iPhone，iPad和所有其他的平台。但事实显然不是这样的，虽然从事Android开发并没有让我收入数千美元，但我的收入是稳定的，并且一直在增长。<span id="more-164"></span></p>
<p>尽管我并不是顶级的开发者，并且也没有任何应用被Android Market推荐过。 我只是成千上万名Android开发者之间默默无闻的一个，我的应用也不是那么的有名。 但这有什么好奇怪的呢？我所有的应用程序都是免费的，因为谷歌不允许来至我的国家（波兰）的开发者通过Android Market出售应用程序！<br />
所以请你记住这些事实：</p>
<ol style="list-style-type: decimal;">
<li>Android Market从来没有在Top的推荐位置推荐过我的应用程序</li>
<li>我只提供（主要是由于Android Market的限制）免费的应用程序</li>
<li>即使我能够在Android Market出售应用程序我也不会将它作为主要收入来源（我相信广告才是最主要的收入来源）</li>
</ol>
<p>我所有的收入都来自应用程序中的广告。 这是它们在Android Market下载次数：</p>
<ol style="list-style-type: decimal;">
<li>X-Ray Scanner（超过268000下载）</li>
<li>Cracked Screen（超过182000下载）</li>
<li>Virtual Drums （超过20000下载）</li>
<li>Daily Beauty Tips （超过11000下载）</li>
<li>Don’t push it （超过6 500下载）</li>
<li>WP Stats （超过4 000下载）</li>
</ol>
<p>我从2010年4月开始学习Android应用开发。并且在5月份便发布了我的第一个Android应用——WP Stats，它带给我几美元的收入。虽然我一直期待这个应用是我最受欢迎的应用，可惜它不是。在我已经发布的几个应用程序中，有很多比它更受欢迎。这里是我这几个月通过Android应用的总收入明细：</p>
<ul style="list-style-type: disc;">
<li>2010年5月 – 4.92美元</li>
<li>2010年6月 – 138.87美元</li>
<li>2010年7月 – 538.26美元</li>
<li>2010年8月 – 920.00美元</li>
<li>2010年9月 – 1545.45美元</li>
<li>2010年10月 – 1059.31美元</li>
</ul>
<p>十月份的收入看起来有所下降，但事实上发生这种情况是因为我没有着这一个月之内没有更新过应用程序。因此，大家可以看到，虽然收入不高，但是却是稳步增长的！并且这些收入全部来自广告。</p>
<p>即使这样，在我看来，从事Android开发给我带来的收入甚至远没有达到iPhone开发人员的水平。 但不管怎么说，从事Android开发是非常有前途的，特别是对于新的应用点子有很大的发展空间。下面这些问题是在成为一名开发者之前常常困扰我的，所以，如果你有兴趣让Android开发成为您每月一笔收入来源，这篇文章可能对你有帮助。</p>
<p>我应该熟练的掌握JAVA——事实并非如此！</p>
<p>有很多专家都会非常严肃的说：“你必须要熟练的掌握Java，否则您做梦都不要期望成为一名Android开发者！”。 以我的情况来看，事实并非如此，我仅仅只是对于PHP非常熟练。 至于Java，我一直计划着在空余时间好好的学习它，但是我几乎没有空闲时间，所以我只只是略知皮毛。虽然我购买了《 Thinking in Java 》，但不幸的是到目前为止我还没有看完第三章。 所以，非常基本的Java的基础知识，这就是你所需要的！</p>
<p>我必须先熟练的掌握一种IDE（Eclipse或NetBeans）——这也是错误的！</p>
<p>另外，专家们还会说会说：“你必须要先完美的掌握一种IDE，否则在学习一门新的语言之前你便会掉队！”。专家们总是这么耸人听闻，看来，我不是真正的专家。因为我是在学习 Java Dalvik ( Android apps开发语言) 的同时才开始使用IDE（Eclipse）的。 所以，事实是你只需要在需要使用的时候再开始学习它，而那些IDE专家撰写的有关书籍在大多数情况下是浪费时间和金钱。</p>
<p>我需要拥有一台基于Android的手机——这（再一次）是错误的！</p>
<p>如果你拥有一台Android手机，那当然最好。甚至，你最好能够几台不同系统版本的Android手机来测试你的应用——如果你准备让他们在所有的Android设备中正常工作！ 但是事实上这并不能解决所有的问题。 虽然一台真正的Android手机有利于你测试自己的应用程序，但在大多数情况下Android模拟器（包含在Android SDK中）便已经足够了。</p>
<p>那么什么是你真正需要的？</p>
<p>在我看来，想要成为一名真正的Android开发者，你需要拥有这些东西：</p>
<ul style="list-style-type: disc;">
<li>Java基本知识（或任何其他面向对象语言）</li>
<li>免费下载的Android SDK（包含Android模拟器）</li>
<li>免费的IDE （例如Eclipse）</li>
<li>免费的Android文档</li>
</ul>
<p>还有一些并不是必要的，但可能非常有用的东西：</p>
<ul style="list-style-type: disc;">
<li>一部Android手机（我的选择是HTC Desire ）</li>
<li>一本不错的Android开发入门书籍（我买了两本让我非常满意的书籍——《Hello, Android 》和 《Beginning Android 2》</li>
</ul>
<p>所以，如果你真的想成为一名Android开发者——不要被砖家吓到。只要你肯努力学习它，你会惊奇地发现它是那么的容易！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.droidchina.com/2010/11/how-to-become-an-android-developer.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用Android自带Gallery组件实现CoverFlow，源码+解析</title>
		<link>http://www.droidchina.com/2010/10/android-gallery-coverflow.html</link>
		<comments>http://www.droidchina.com/2010/10/android-gallery-coverflow.html#comments</comments>
		<pubDate>Tue, 26 Oct 2010 02:45:59 +0000</pubDate>
		<dc:creator>DroidChina</dc:creator>
				<category><![CDATA[代码样例]]></category>
		<category><![CDATA[资源分享]]></category>
		<category><![CDATA[CoverFlow]]></category>
		<category><![CDATA[组件]]></category>
		<category><![CDATA[Galley]]></category>
		<category><![CDATA[源码]]></category>

		<guid isPermaLink="false">http://www.droidchina.com/?p=161</guid>
		<description><![CDATA[使用过Android自带的gallery组件的人都知道，gallery实现的效果就是拖动浏览一组图片，相比iphone里也是用于拖动浏览图片的coverflow，显然逊色不少。实际上，可以通过扩展gallery，通过伪3D变换可... ]]></description>
			<content:encoded><![CDATA[<p>使用过Android自带的gallery组件的人都知道，gallery实现的效果就是拖动浏览一组图片，相比iphone里也是用于拖动浏览图片的coverflow，显然逊色不少。实际上，可以通过扩展gallery，通过伪3D变换可以基本实现coverflow的效果。本文通过源代码解析这一功能的实现。具体代码作用可参照注释。</p>
<p>最终实现效果如下：</p>
<p><a href="http://www.droidchina.com/wp-content/uploads/2010/10/1010231947edda1338ef1f49d8.png"><img class="alignnone size-full wp-image-162" title="1010231947edda1338ef1f49d8" src="http://www.droidchina.com/wp-content/uploads/2010/10/1010231947edda1338ef1f49d8.png" alt="" width="700" height="394" /></a></p>
<p>要使用gallery，我们必须首先给其指定一个adapter。在这里，我们实现了一个自定义的ImageAdapter，为图片制作倒影效果。<br />
传入参数为context和程序内drawable中的图片ID数组。之后调用其中的createReflectedImages()方法分别创造每一个图像的倒影效果，生成对应的ImageView数组，最后在getView()中返回。<span id="more-161"></span></p>
<div class="code">
<ol>
<li>/*</li>
<li>* Copyright (C) 2010 Neil Davies</li>
<li>*</li>
<li>* Licensed under the Apache License, Version 2.0 (the &#8220;License&#8221;);</li>
<li>* you may not use this file except in compliance with the License.</li>
<li>* You may obtain a copy of the License at</li>
<li>*</li>
<li>* http://www.apache.org/licenses/LICENSE-2.0</li>
<li>*</li>
<li>* Unless required by applicable law or agreed to in writing, software</li>
<li>* distributed under the License is distributed on an &#8220;AS IS&#8221; BASIS,</li>
<li>* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</li>
<li>* See the License for the specific language governing permissions and</li>
<li>* limitations under the License.</li>
<li>*</li>
<li>* This code is base on the Android Gallery widget and was Created</li>
<li>* by Neil Davies neild001 &#8216;at&#8217; gmail dot com to be a Coverflow widget</li>
<li>*</li>
<li>* @author Neil Davies</li>
<li>*/</li>
<li>public class ImageAdapter extends BaseAdapter {</li>
<li>int mGalleryItemBackground;</li>
<li>private Context mContext;</li>
<li>private Integer[] mImageIds ;</li>
<li>private ImageView[] mImages;</li>
<li>public ImageAdapter(Context c, int[] ImageIds) {</li>
<li>mContext = c;</li>
<li>mImageIds = ImageIds;</li>
<li>mImages = new ImageView[mImageIds.length];</li>
<li>}</li>
<li>public boolean createReflectedImages() {</li>
<li>// The gap we want between the reflection and the original image</li>
<li>final int reflectionGap = 4;</li>
<li>int index = 0;</li>
<li>for (int imageId : mImageIds) {</li>
<li>Bitmap originalImage = BitmapFactory.decodeResource(</li>
<li>mContext.getResources(), imageId);</li>
<li>int width = originalImage.getWidth();</li>
<li>int height = originalImage.getHeight();</li>
<li>// This will not scale but will flip on the Y axis</li>
<li>Matrix matrix = new Matrix();</li>
<li>matrix.preScale(1, -1);</li>
<li>// Create a Bitmap with the flip matrix applied to it.</li>
<li>// We only want the bottom half of the image</li>
<li>Bitmap reflectionImage = Bitmap.createBitmap(originalImage, 0,</li>
<li>height / 2, width, height / 2, matrix, false);</li>
<li>// Create a new bitmap with same width but taller to fit</li>
<li>// reflection</li>
<li>Bitmap bitmapWithReflection = Bitmap.createBitmap(width,</li>
<li>(height + height / 2), Config.ARGB_8888);</li>
<li>// Create a new Canvas with the bitmap that&#8217;s big enough for</li>
<li>// the image plus gap plus reflection</li>
<li>Canvas canvas = new Canvas(bitmapWithReflection);</li>
<li>// Draw in the original image</li>
<li>canvas.drawBitmap(originalImage, 0, 0, null);</li>
<li>// Draw in the gap</li>
<li>Paint deafaultPaint = new Paint();</li>
<li>canvas.drawRect(0, height, width, height + reflectionGap,</li>
<li>deafaultPaint);</li>
<li>// Draw in the reflection</li>
<li>canvas.drawBitmap(reflectionImage, 0, height + reflectionGap,</li>
<li>null);</li>
<li>// Create a shader that is a linear gradient that covers the</li>
<li>// reflection</li>
<li>Paint paint = new Paint();</li>
<li>LinearGradient shader = new LinearGradient(0,</li>
<li>originalImage.getHeight(), 0,</li>
<li>bitmapWithReflection.getHeight() + reflectionGap,</li>
<li>0x70ffffff, 0x00ffffff, TileMode.CLAMP);</li>
<li>// Set the paint to use this shader (linear gradient)</li>
<li>paint.setShader(shader);</li>
<li>// Set the Transfer mode to be porter duff and destination in</li>
<li>paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));</li>
<li>// Draw a rectangle using the paint with our linear gradient</li>
<li>canvas.drawRect(0, height, width,</li>
<li>bitmapWithReflection.getHeight() + reflectionGap, paint);</li>
<li>ImageView imageView = new ImageView(mContext);</li>
<li>imageView.setImageBitmap(bitmapWithReflection);</li>
<li>imageView</li>
<li>.setLayoutParams(new GalleryFlow.LayoutParams(160, 240));</li>
<li>// imageView.setScaleType(ScaleType.MATRIX);</li>
<li>mImages[index++] = imageView;</li>
<li>}</li>
<li>return true;</li>
<li>}</li>
<li>public int getCount() {</li>
<li>return mImageIds.length;</li>
<li>}</li>
<li>public Object getItem(int position) {</li>
<li>return position;</li>
<li>}</li>
<li>public long getItemId(int position) {</li>
<li>return position;</li>
<li>}</li>
<li>public View getView(int position, View convertView, ViewGroup parent) {</li>
<li>// Use this code if you want to load from resources</li>
<li>/*</li>
<li>* ImageView i = new ImageView(mContext);</li>
<li>* i.setImageResource(mImageIds[position]); i.setLayoutParams(new</li>
<li>* CoverFlow.LayoutParams(350,350));</li>
<li>* i.setScaleType(ImageView.ScaleType.CENTER_INSIDE);</li>
<li>*</li>
<li>* //Make sure we set anti-aliasing otherwise we get jaggies</li>
<li>* BitmapDrawable drawable = (BitmapDrawable) i.getDrawable();</li>
<li>* drawable.setAntiAlias(true); return i;</li>
<li>*/</li>
<li>return mImages[position];</li>
<li>}</li>
<li>/**</li>
<li>* Returns the size (0.0f to 1.0f) of the views depending on the</li>
<li>* &#8216;offset&#8217; to the center.</li>
<li>*/</li>
<li>public float getScale(boolean focused, int offset) {</li>
<li>/* Formula: 1 / (2 ^ offset) */</li>
<li>return Math.max(0, 1.0f / (float) Math.pow(2, Math.abs(offset)));</li>
<li>}</li>
<li>}</li>
<li>}</li>
</ol>
</div>
<p>仅仅实现了图片的倒影效果还不够，因为在coverflow中图片切换是有旋转和缩放效果的，而自带的gallery中并没有实现。因此，我们扩展自带的 gallery，实现自己的galleryflow。在原gallery类中，提供了一个方法 getChildStaticTransformation()以实现对图片的变换。我们通过覆写这个方法并在其中调用自定义的 transformImageBitmap(“每个图片与gallery中心的距离”)方法，，即可实现每个图片做相应的旋转和缩放。其中使用了 camera和matrix用于视图变换。具体可参考代码注释。</p>
<div class="code">
<ol>
<li>public void onCreate(Bundle savedInstanceState) {</li>
<li>super.onCreate(savedInstanceState);</li>
<li> setContentView(R.layout.layout_gallery);</li>
<li>Integer[] images = { R.drawable.img0001, R.drawable.img0030,</li>
<li>R.drawable.img0100, R.drawable.img0130, R.drawable.img0200,</li>
<li>R.drawable.img0230, R.drawable.img0300, R.drawable.img0330,</li>
<li>R.drawable.img0354 };</li>
<li>ImageAdapter adapter = new ImageAdapter(this, images);</li>
<li>adapter.createReflectedImages();</li>
<li>GalleryFlow galleryFlow = (GalleryFlow) findViewById(R.id.gallery_flow);</li>
<li>galleryFlow.setAdapter(adapter);</li>
<li>}</li>
</ol>
</div>
<p>可以看出来这样实现的gallery锯齿问题比较严重。可以在createReflectedImages()使用以下代码：</p>
<div class="code">
<ol>
<li>BitmapDrawable bd = new BitmapDrawable(bitmapWithReflection);</li>
<li>bd.setAntiAlias=true;</li>
<li>&#8230;</li>
</ol>
</div>
<p>然后用iv.setImageDrawable(bd); 代替 iv.setImageBitmap(bitmapWithReflection); 即可基本消除锯齿。</p>
<p>ImageAdapter有待确定的MemoryLeak问题，貌似的Bitmap的decode方法会造成ML，使用ImageAdapter时多次旋转屏幕后会出现OOM。目前可以通过将使用完毕的bimap调用recycle()方法和设置null并及时调用system.gc()得到一些改善，但是问题并不明显。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.droidchina.com/2010/10/android-gallery-coverflow.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java日期时间函数</title>
		<link>http://www.droidchina.com/2010/10/java-date-time-function.html</link>
		<comments>http://www.droidchina.com/2010/10/java-date-time-function.html#comments</comments>
		<pubDate>Tue, 26 Oct 2010 02:08:38 +0000</pubDate>
		<dc:creator>DroidChina</dc:creator>
				<category><![CDATA[代码样例]]></category>
		<category><![CDATA[资源分享]]></category>
		<category><![CDATA[函数]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[日期]]></category>
		<category><![CDATA[时间]]></category>
		<category><![CDATA[手册]]></category>

		<guid isPermaLink="false">http://www.droidchina.com/?p=159</guid>
		<description><![CDATA[package test; import java.sql.Timestamp; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; public class SQLDate { public static void main(String[] args){ System.out.println(System.currentTimeMillis());　　... ]]></description>
			<content:encoded><![CDATA[<div class="code">
<ol>
<li>package test;</li>
<li>import java.sql.Timestamp;</li>
<li>import java.text.DateFormat;</li>
<li>import java.text.ParseException;</li>
<li>import java.text.SimpleDateFormat;</li>
<li>public class SQLDate {</li>
<li>public static void main(String[] args){</li>
<li>System.out.println(System.currentTimeMillis());　　　　　　　 //结果：1244711626453</li>
<li>java.util.Date date1 = new java.util.Date();</li>
<li>System.out.println(date1.toString());　　　 //结果: Thu Jun 11 16:27:57 CST 2009</li>
<li>//java.sql.Date extends java.util.Date</li>
<li>java.sql.Date date2 = new java.sql.Date(System.currentTimeMillis());</li>
<li>System.out.println(date2.toString());　　　 //结果: 2009-06-11</li>
<li>java.sql.Date date3 = new java.sql.Date(date1.getTime());</li>
<li>System.out.println(date3.toString());　　　 //结果：2009-06-11</li>
<li>//Timestamp extends java.util.Date</li>
<li>Timestamp stamp1 = new Timestamp(System.currentTimeMillis());</li>
<li>System.out.println(stamp1.toString());　　　 //结果： 2009-06-11 16:27:57.75</li>
<li>Timestamp stamp2 = new Timestamp(date1.getTime());</li>
<li>System.out.println(stamp2.toString());　　　 //结果：2009-06-11 16:52:56.171</li>
<li>//日期时间转换成格式化的字符串</li>
<li>SimpleDateFormat sdf = new SimpleDateFormat(&#8220;yyyy/MM/dd HH:mm:ss&#8221;);</li>
<li>//format(java.util.Date date), Timestamp是java.util.Date的子类</li>
<li>String timeStr =　 sdf.format(stamp1);</li>
<li>System.out.println(timeStr);　　　 //结果：2009/06/11 16:52:56</li>
<li>//SimpleDateFormat extends DateFormat，DateFormat是抽象类</li>
<li>DateFormat df = new SimpleDateFormat(&#8220;yyyy/MM/dd HH:mm:ss&#8221;);</li>
<li>String timeStr2 = df.format(date1);</li>
<li>String timeStr3 = df.format(date2);</li>
<li>System.out.println(timeStr2);　　　 //结果：2009/06/11 16:52:56</li>
<li>System.out.println(timeStr3);　　　 //结果： 2009/06/11 16:52:56</li>
<li>//字符串转化为日期时间</li>
<li>try {</li>
<li>//parse()中的参数必须与sdf中定义的格式一致,否则抛异常</li>
<li>java.util.Date date6 = sdf.parse(&#8220;2009/12/10 5:12:02&#8243;);</li>
<li>System.out.println(date6.toString()); //结果: Thu Dec 10 05:12:02 CST 2009</li>
<li>java.sql.Date date7 = new java.sql.Date(date6.getTime());</li>
<li>System.out.println(date7.toString()); //结果: 2009-12-10</li>
<li>//注意: sdf.parse()返回值是java.util.Date类型,不能转化成java.sql.Date类型</li>
<li>//java.sql.Date date8 = (java.sql.Date)sdf.parse(&#8220;2009/12/10 5:12:02&#8243;); //不可行</li>
<li>Timestamp stamp9 = new Timestamp(date7.getTime());</li>
<li>System.out.println(stamp9.toString()); //结果: 2009-12-10 05:12:02.0</li>
<li>} catch (ParseException e) {</li>
<li>e.printStackTrace();</li>
<li>}</li>
<li>}</li>
<li>}</li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.droidchina.com/2010/10/java-date-time-function.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Android GPS获取地理位置</title>
		<link>http://www.droidchina.com/2010/10/android-gps-get-location.html</link>
		<comments>http://www.droidchina.com/2010/10/android-gps-get-location.html#comments</comments>
		<pubDate>Tue, 26 Oct 2010 02:06:19 +0000</pubDate>
		<dc:creator>DroidChina</dc:creator>
				<category><![CDATA[代码样例]]></category>
		<category><![CDATA[资源分享]]></category>
		<category><![CDATA[位置服务]]></category>
		<category><![CDATA[地理位置]]></category>
		<category><![CDATA[经纬度]]></category>
		<category><![CDATA[GPS]]></category>

		<guid isPermaLink="false">http://www.droidchina.com/?p=158</guid>
		<description><![CDATA[import android.app.Activity; import android.content.Context; import android.location.Criteria; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.w... ]]></description>
			<content:encoded><![CDATA[<div class="code">
<ol>
<li>import android.app.Activity;</li>
<li>import android.content.Context;</li>
<li>import android.location.Criteria;</li>
<li>import android.location.Location;</li>
<li>import android.location.LocationListener;</li>
<li>import android.location.LocationManager;</li>
<li>import android.os.Bundle;</li>
<li>import android.widget.TextView;</li>
<li>public class CurrentLocation extends Activity {</li>
<li>/** Called when the activity is first created. */</li>
<li>@Override</li>
<li>public void onCreate(Bundle savedInstanceState) {</li>
<li>super.onCreate(savedInstanceState);</li>
<li>setContentView(R.layout.main);</li>
<li>LocationManager locationManager;</li>
<li>String serviceName = Context.LOCATION_SERVICE;</li>
<li>locationManager = (LocationManager)getSystemService(serviceName);</li>
<li>//String provider = LocationManager.GPS_PROVIDER;</li>
<li>Criteria criteria = new Criteria();</li>
<li>criteria.setAccuracy(Criteria.ACCURACY_FINE);</li>
<li>criteria.setAltitudeRequired(false);</li>
<li>criteria.setBearingRequired(false);</li>
<li>criteria.setCostAllowed(true);</li>
<li>criteria.setPowerRequirement(Criteria.POWER_LOW);</li>
<li>String provider = locationManager.getBestProvider(criteria, true);</li>
<li>Location location = locationManager.getLastKnownLocation(provider);</li>
<li>updateWithNewLocation(location);</li>
<li>locationManager.requestLocationUpdates(provider, 2000, 10,</li>
<li>locationListener);</li>
<li>}</li>
<li>private final LocationListener locationListener = new LocationListener() {</li>
<li>public void onLocationChanged(Location location) {</li>
<li>updateWithNewLocation(location);</li>
<li>}</li>
<li>public void onProviderDisabled(String provider){</li>
<li>updateWithNewLocation(null);</li>
<li>}</li>
<li>public void onProviderEnabled(String provider){ }</li>
<li>public void onStatusChanged(String provider, int status,</li>
<li>Bundle extras){ }</li>
<li>};</li>
<li>private void updateWithNewLocation(Location location) {</li>
<li>String latLongString;</li>
<li>TextView myLocationText;</li>
<li>myLocationText = (TextView)findViewById(R.id.myLocationText);</li>
<li>if (location != null) {</li>
<li>double lat = location.getLatitude();</li>
<li>double lng = location.getLongitude();</li>
<li>latLongString = &#8220;纬度:&#8221; + lat + &#8220;\n经度:&#8221; + lng;</li>
<li>} else {</li>
<li>latLongString = &#8220;无法获取地理信息&#8221;;</li>
<li>}</li>
<li>myLocationText.setText(&#8220;您当前的位置是:\n&#8221; +</li>
<li>latLongString);</li>
<li>}</li>
<li>}</li>
</ol>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.droidchina.com/2010/10/android-gps-get-location.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

