﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-zhaojianhua</title><link>http://www.blogjava.net/zhaojianhua/</link><description /><language>zh-cn</language><lastBuildDate>Sun, 10 May 2026 13:13:40 GMT</lastBuildDate><pubDate>Sun, 10 May 2026 13:13:40 GMT</pubDate><ttl>60</ttl><item><title>Activity四种启动模式</title><link>http://www.blogjava.net/zhaojianhua/archive/2015/06/23/425836.html</link><dc:creator>建华</dc:creator><author>建华</author><pubDate>Tue, 23 Jun 2015 03:04:00 GMT</pubDate><guid>http://www.blogjava.net/zhaojianhua/archive/2015/06/23/425836.html</guid><wfw:comment>http://www.blogjava.net/zhaojianhua/comments/425836.html</wfw:comment><comments>http://www.blogjava.net/zhaojianhua/archive/2015/06/23/425836.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaojianhua/comments/commentRss/425836.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaojianhua/services/trackbacks/425836.html</trackback:ping><description><![CDATA[<p style="margin: 0px; padding: 0px; font-family: Arial; line-height: 26px; background-color: #ffffff;">Activity启动方式有四种，分别是：<br /><br />standard<br />singleTop<br />singleTask<br />singleInstance<br /><br />可以根据实际的需求为Activity设置对应的启动模式，从而可以避免创建大量重复的Activity等问题。<br /><br />设置Activity的启动模式，只需要在AndroidManifest.xml里对应的&lt;activity&gt;标签设置android:launchMode属性，例如：<br /></p><div bg_html"="" style="width: 936.53125px; line-height: 26px;"><div><div><strong>[html]</strong>&nbsp;<a href="http://blog.csdn.net/shinay/article/details/7898492#" title="view plain" style="padding: 1px; display: inline-block; width: 16px; height: 16px; text-indent: -2000px; background-image: url(http://static.blog.csdn.net/scripts/SyntaxHighlighter/styles/images/default/ico_plain.gif); background-position: 0% 0%; background-repeat: no-repeat;">view plain</a><a href="http://blog.csdn.net/shinay/article/details/7898492#" title="copy" style="padding: 1px; display: inline-block; width: 16px; height: 16px; text-indent: -2000px; background-image: url(http://static.blog.csdn.net/scripts/SyntaxHighlighter/styles/images/default/ico_copy.gif); background-position: 0% 0%; background-repeat: no-repeat;">copy</a><div style="position: absolute; left: 719px; top: 697px; width: 18px; height: 18px; z-index: 99;"></div></div></div><ol start="1"><li style="line-height: 18px;"><span style="color: #993300; font-weight: bold;">&lt;</span><span style="color: #993300; font-weight: bold;">activity</span>&nbsp;&nbsp;</li><li style="line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: red;">android:name</span>=<span style="color: blue;">".A1"</span>&nbsp;&nbsp;</li><li style="line-height: 18px;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: red;">android:launchMode</span>=<span style="color: blue;">"standard"</span>&nbsp;<span style="color: #993300; font-weight: bold;">/&gt;</span>&nbsp;&nbsp;</li></ol></div><br style="font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="font-family: Arial; line-height: 26px; background-color: #ffffff;">下面是这四种模式的作用：</span><br style="font-family: Arial; line-height: 26px; background-color: #ffffff;" /><br style="font-family: Arial; line-height: 26px; background-color: #ffffff;" /><strong style="font-family: Arial; line-height: 26px; background-color: #ffffff;">standard<br /></strong><span style="font-family: Arial; line-height: 26px; background-color: #ffffff;">默认模式，可以不用写配置。在这个模式下，都会默认创建一个新的实例。因此，在这种模式下，可以有多个相同的实例，也允许多个相同Activity叠加。</span><br style="font-family: Arial; line-height: 26px; background-color: #ffffff;" /><br style="font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="font-family: Arial; line-height: 26px; background-color: #ffffff;">例如：</span><br style="font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="font-family: Arial; line-height: 26px; background-color: #ffffff;">若我有一个Activity名为A1, 上面有一个按钮可跳转到A1。那么如果我点击按钮，便会新启一个Activity A1叠在刚才的A1之上，再点击，又会再新启一个在它之上&#8230;&#8230;</span><br style="font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="font-family: Arial; line-height: 26px; background-color: #ffffff;">点back键会依照栈顺序依次退出。</span><br style="font-family: Arial; line-height: 26px; background-color: #ffffff;" /><br style="font-family: Arial; line-height: 26px; background-color: #ffffff;" /><strong style="font-family: Arial; line-height: 26px; background-color: #ffffff;">singleTop</strong><br style="font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="font-family: Arial; line-height: 26px; background-color: #ffffff;">可以有多个实例，但是不允许多个相同Activity叠加。即，如果Activity在栈顶的时候，启动相同的Activity，不会创建新的实例，而会调用其onNewIntent方法。</span><br style="font-family: Arial; line-height: 26px; background-color: #ffffff;" /><br style="font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="font-family: Arial; line-height: 26px; background-color: #ffffff;">例如：</span><br style="font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="font-family: Arial; line-height: 26px; background-color: #ffffff;">若我有两个Activity名为B1,B2,两个Activity内容功能完全相同，都有两个按钮可以跳到B1或者B2，唯一不同的是B1为standard，B2为singleTop。</span><br style="font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="font-family: Arial; line-height: 26px; background-color: #ffffff;">若我意图打开的顺序为B1-&gt;B2-&gt;B2，则实际打开的顺序为B1-&gt;B2（后一次意图打开B2，实际只调用了前一个的onNewIntent方法）</span><br style="font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="font-family: Arial; line-height: 26px; background-color: #ffffff;">若我意图打开的顺序为B1-&gt;B2-&gt;B1-&gt;B2，则实际打开的顺序与意图的一致，为B1-&gt;B2-&gt;B1-&gt;B2。</span><br style="font-family: Arial; line-height: 26px; background-color: #ffffff;" /><br style="font-family: Arial; line-height: 26px; background-color: #ffffff;" /><br style="font-family: Arial; line-height: 26px; background-color: #ffffff;" /><strong style="font-family: Arial; line-height: 26px; background-color: #ffffff;">singleTask</strong><br style="font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="font-family: Arial; line-height: 26px; background-color: #ffffff;">只有一个实例。在同一个应用程序中启动他的时候，若Activity不存在，则会在当前task创建一个新的实例，若存在，则会把task中在其之上的其它Activity destory掉并调用它的onNewIntent方法。</span><br style="font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="font-family: Arial; line-height: 26px; background-color: #ffffff;">如果是在别的应用程序中启动它，则会新建一个task，并在该task中启动这个Activity，singleTask允许别的Activity与其在一个task中共存，也就是说，如果我在这个singleTask的实例中再打开新的Activity，这个新的Activity还是会在singleTask的实例的task中。</span><br style="font-family: Arial; line-height: 26px; background-color: #ffffff;" /><br style="font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="font-family: Arial; line-height: 26px; background-color: #ffffff;">例如：</span><br style="font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="font-family: Arial; line-height: 26px; background-color: #ffffff;">若我的应用程序中有三个Activity,C1,C2,C3，三个Activity可互相启动，其中C2为singleTask模式，那么，无论我在这个程序中如何点击启动，如：C1-&gt;C2-&gt;C3-&gt;C2-&gt;C3-&gt;C1-C2，C1,C3可能存在多个实例，但是C2只会存在一个，并且这三个Activity都在同一个task里面。</span><br style="font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="font-family: Arial; line-height: 26px; background-color: #ffffff;">但是C1-&gt;C2-&gt;C3-&gt;C2-&gt;C3-&gt;C1-C2，这样的操作过程实际应该是如下这样的，因为singleTask会把task中在其之上的其它Activity destory掉。</span><br style="font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="font-family: Arial; line-height: 26px; background-color: #ffffff;">操作：C1-&gt;C2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C1-&gt;C2-&gt;C3&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;C1-&gt;C2-&gt;C3-&gt;C2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C1-&gt;C2-&gt;C3-&gt;C2-&gt;C3-&gt;C1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;C1-&gt;C2-&gt;C3-&gt;C2-&gt;C3-&gt;C1-C2</span><br style="font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="font-family: Arial; line-height: 26px; background-color: #ffffff;">实际：C1-&gt;C2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C1-&gt;C2-&gt;C3 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C1-&gt;C2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;C1-&gt;C2-&gt;C3-&gt;C1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; C1-&gt;C2</span><br style="font-family: Arial; line-height: 26px; background-color: #ffffff;" /><br style="font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="font-family: Arial; line-height: 26px; background-color: #ffffff;">若是别的应用程序打开C2，则会新启一个task。</span><br style="font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="font-family: Arial; line-height: 26px; background-color: #ffffff;">如别的应用Other中有一个activity，taskId为200，从它打开C2，则C2的taskIdI不会为200，例如C2的taskId为201，那么再从C2打开C1、C3，则C2、C3的taskId仍为201。</span><br style="font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="font-family: Arial; line-height: 26px; background-color: #ffffff;">注意：如果此时你点击home，然后再打开Other，发现这时显示的肯定会是Other应用中的内容，而不会是我们应用中的C1 C2 C3中的其中一个。</span><br style="font-family: Arial; line-height: 26px; background-color: #ffffff;" /><br style="font-family: Arial; line-height: 26px; background-color: #ffffff;" /><br style="font-family: Arial; line-height: 26px; background-color: #ffffff;" /><strong style="font-family: Arial; line-height: 26px; background-color: #ffffff;">singleInstance</strong><br style="font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="font-family: Arial; line-height: 26px; background-color: #ffffff;">只有一个实例，并且这个实例独立运行在一个task中，这个task只有这个实例，不允许有别的Activity存在。</span><br style="font-family: Arial; line-height: 26px; background-color: #ffffff;" /><br style="font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="font-family: Arial; line-height: 26px; background-color: #ffffff;">例如：</span><br style="font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="font-family: Arial; line-height: 26px; background-color: #ffffff;">程序有三个ActivityD1,D2,D3，三个Activity可互相启动，其中D2为singleInstance模式。那么程序从D1开始运行，假设D1的taskId为200，那么从D1启动D2时，D2会新启动一个task，即D2与D1不在一个task中运行。假设D2的taskId为201，再从D2启动D3时，D3的taskId为200，也就是说它被压到了D1启动的任务栈中。</span><br style="font-family: Arial; line-height: 26px; background-color: #ffffff;" /><br style="font-family: Arial; line-height: 26px; background-color: #ffffff;" /><span style="font-family: Arial; line-height: 26px; background-color: #ffffff;">若是在别的应用程序打开D2，假设Other的taskId为200，打开D2，D2会新建一个task运行，假设它的taskId为201，那么如果这时再从D2启动D1或者D3，则又会再创建一个task，因此，若操作步骤为other-&gt;D2-&gt;D1，这过程就涉及到了3个task了。</span><img src ="http://www.blogjava.net/zhaojianhua/aggbug/425836.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaojianhua/" target="_blank">建华</a> 2015-06-23 11:04 <a href="http://www.blogjava.net/zhaojianhua/archive/2015/06/23/425836.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>蓝牙发送文件</title><link>http://www.blogjava.net/zhaojianhua/archive/2013/02/20/395435.html</link><dc:creator>建华</dc:creator><author>建华</author><pubDate>Wed, 20 Feb 2013 00:45:00 GMT</pubDate><guid>http://www.blogjava.net/zhaojianhua/archive/2013/02/20/395435.html</guid><wfw:comment>http://www.blogjava.net/zhaojianhua/comments/395435.html</wfw:comment><comments>http://www.blogjava.net/zhaojianhua/archive/2013/02/20/395435.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaojianhua/comments/commentRss/395435.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaojianhua/services/trackbacks/395435.html</trackback:ping><description><![CDATA[<div><span style="white-space: pre;">系统4.0.3以后的</span><br />&nbsp; &nbsp; &nbsp; File file=new File("");</div><div><span style="white-space:pre">	 </span>&nbsp;Uri uri1 = Uri.fromFile(file);</div><div><span style="white-space:pre">	 </span>&nbsp;Intent intent = new Intent(); &nbsp; &nbsp;</div><div><span style="white-space:pre">	 </span>intent.setAction(Intent.ACTION_SEND); &nbsp;&nbsp;</div><div><span style="white-space:pre">	</span>&nbsp;//intent.setType("audio/*");&nbsp;</div><div><span style="white-space: pre;">&nbsp;        </span>intent.setType("application/octet-stream");</div><div><span style="white-space:pre">	</span>ComponentName comp=new ComponentName("com.mediatek.bluetooth","com.mediatek.bluetooth.BluetoothShareGatewayActivity");</div><div><span style="white-space:pre">	</span>intent.setComponent(comp);</div><div><span style="white-space:pre">	</span>&nbsp;intent.putExtra(Intent.EXTRA_STREAM, uri1);</div><div><span style="white-space:pre">	</span>startActivity(intent);</div><div><span style="white-space:pre">				</span></div><div><span style="white-space: pre;">系统4.0.3以前的</span><span style="white-space:pre">		</span></div><div><span style="white-space:pre">	</span>Intent intent = new Intent();</div><div><span style="white-space:pre">	</span>intent.setAction(Intent.ACTION_SEND);</div><div><span style="white-space:pre">	</span>//这个类型函数是自己工具类的方法，你可以自己设置文件类型，例如图片文件：image/* &nbsp;</div><div><span style="white-space: pre;">&nbsp;     </span>//不想写类型直接*/*也是可以的</div><div><span style="white-space:pre">	</span>intent.setType("audio/*");</div><div><span style="white-space:pre">	</span>//这里setClassName就是指定蓝牙，不写这句就弹出选择用什么发送</div><div><span style="white-space: pre;">&nbsp;      </span>//有蓝牙啊，gmail啊，彩信之类的</div><div><span style="white-space:pre">	</span>intent.setClassName("com.android.bluetooth" , "com.android.bluetooth.opp.BluetoothOppLauncherActivity");</div><div><span style="white-space:pre">	</span>intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File("")));</div><div><span style="white-space:pre">	</span>startActivity(intent);<br /><br /><br /><div>&nbsp; ArrayList&lt;Uri&gt; uris = new ArrayList&lt;Uri&gt;();</div><div><span style="white-space:pre">				</span> &nbsp; &nbsp;uris.add(Uri.fromFile(new File("/sdcard/111.txt")));</div><div><span style="white-space:pre">				</span> &nbsp; &nbsp;uris.add(Uri.fromFile(new File("/sdcard/222.txt")));</div><div><span style="white-space:pre">				</span> &nbsp; &nbsp;</div><div><span style="white-space:pre">	</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Intent intent = new Intent();</div><div><span style="white-space:pre">					</span>intent.setAction(Intent.ACTION_SEND_MULTIPLE);</div><div><span style="white-space:pre">					</span>intent.setType("video/*");</div><div><span style="white-space:pre">					</span>intent.setClassName("com.android.bluetooth" , "com.android.bluetooth.opp.BluetoothOppLauncherActivity");</div><div><span style="white-space:pre">					</span>//intent.setClassName("com.mediatek.bluetooth","com.mediatek.bluetooth.BluetoothShareGatewayActivity");</div><div><span style="white-space:pre">					</span>//intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File("/sdcard/111.txt")) );</div><div><span style="white-space:pre">					</span>//intent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new File("/sdcard/222.txt")));</div><div><span style="white-space:pre">					</span>intent.putExtra(Intent.EXTRA_STREAM, uris);</div><div><span style="white-space:pre">					</span>startActivity(intent);</div></div><div></div><img src ="http://www.blogjava.net/zhaojianhua/aggbug/395435.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaojianhua/" target="_blank">建华</a> 2013-02-20 08:45 <a href="http://www.blogjava.net/zhaojianhua/archive/2013/02/20/395435.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android中关于dip和px以及转换的总结 </title><link>http://www.blogjava.net/zhaojianhua/archive/2013/02/01/395007.html</link><dc:creator>建华</dc:creator><author>建华</author><pubDate>Fri, 01 Feb 2013 02:08:00 GMT</pubDate><guid>http://www.blogjava.net/zhaojianhua/archive/2013/02/01/395007.html</guid><wfw:comment>http://www.blogjava.net/zhaojianhua/comments/395007.html</wfw:comment><comments>http://www.blogjava.net/zhaojianhua/archive/2013/02/01/395007.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaojianhua/comments/commentRss/395007.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaojianhua/services/trackbacks/395007.html</trackback:ping><description><![CDATA[<div align="left" style="word-wrap: break-word; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;">我们在页面布局的时候，经常会设置容器的长度，但是到底该使用哪个作为长度的单位而懊恼。在Android中支持的描述大小区域的类型有以下几种:</div><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;" /><div align="left" style="word-wrap: break-word; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;">px(pixels)&#8212;&#8212;像素：不同的设备显示效果相同，一般我们HVGA代表320x480像素，这个用的比较多。</div><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;" /><div align="left" style="word-wrap: break-word; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;">dip(device independent pixels)&#8212;&#8212;设备独立像素：这个和设备硬件有关，一般我们为了支持WCGA、HVGA和QVGA推荐使用这个，不依赖于像素。等同于dp。</div><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;" /><div align="left" style="word-wrap: break-word; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;">sp(scaled pixels&#8212;best for text size)&#8212;&#8212;带比例的像素。</div><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;" /><div align="left" style="word-wrap: break-word; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;">pt(points)&#8212;&#8212;磅：1pt = 1/72英寸</div><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;" /><div align="left" style="word-wrap: break-word; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;">in(inches)&#8212;&#8212;英寸</div><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;" /><div align="left" style="word-wrap: break-word; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;">mm(millimeters)&#8212;&#8212;毫米</div><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;" /><div align="left" style="word-wrap: break-word; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;"><strong style="word-wrap: break-word;">到底px和dip有什么区别呢？</strong></div><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;" /><div align="left" style="word-wrap: break-word; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;"><strong style="word-wrap: break-word;">dip</strong>&nbsp;!= px</div><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;" /><div align="left" style="word-wrap: break-word; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;">主要是针对不同设备而言的。在Density是160的设备上，比如用AVDManager创建的默认模拟器，dip和px是一样的但是如果同样的代码，换到不同Density的设备上，比如换到一个Density是240的设备上，dip和px体现出来的大小就不一样了。px不管在什么样的设备上都是那样长，但是<strong style="word-wrap: break-word;">dip</strong>会根据设备变化；WQVGA屏density=120；QVGA屏density=120；HVGA屏density=160；WVGA屏density=240；density值表示每英寸有多少个显示点，与分辨率是两个概念。<br style="word-wrap: break-word;" /><br style="word-wrap: break-word;" />当屏幕density=240时使用hdpi标签的资源<br style="word-wrap: break-word;" />当屏幕density=160时，使用mdpi标签的资源<br style="word-wrap: break-word;" />当屏幕density=120时，使用ldpi标签的资源。<br style="word-wrap: break-word;" /><br style="word-wrap: break-word;" />不加任何标签的资源是各种分辨率情况下共用的。布局时尽量使用单位dip，少使用px。<br style="word-wrap: break-word;" /><br style="word-wrap: break-word;" />换算公式为：<br style="word-wrap: break-word;" />pixs =dips * (densityDpi/160).&nbsp;</div><div align="left" style="word-wrap: break-word; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;">dips=(pixs*160)/densityDpi</div><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;" /><div align="left" style="word-wrap: break-word; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;">如何获得设备的屏幕分辨率和屏幕密度？<br style="word-wrap: break-word;" /></div><div align="left" style="word-wrap: break-word; background-color: #ffffff;"><font color="#444444" face="Tahoma, Microsoft Yahei, Simsun">例如分辨率为480*800，密度为240的设备，方法如下</font><br /><br /><br /><div>DisplayMetrics dm =getResources().getDisplayMetrics();</div><div>dm.densityDpi=240</div><div>dm.widthPixels=480</div><div>dm.heightPixels=800</div><div style="color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun;"></div></div><img src ="http://www.blogjava.net/zhaojianhua/aggbug/395007.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaojianhua/" target="_blank">建华</a> 2013-02-01 10:08 <a href="http://www.blogjava.net/zhaojianhua/archive/2013/02/01/395007.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在android模拟器中永久删除自带应用程序</title><link>http://www.blogjava.net/zhaojianhua/archive/2012/12/26/393514.html</link><dc:creator>建华</dc:creator><author>建华</author><pubDate>Wed, 26 Dec 2012 10:17:00 GMT</pubDate><guid>http://www.blogjava.net/zhaojianhua/archive/2012/12/26/393514.html</guid><wfw:comment>http://www.blogjava.net/zhaojianhua/comments/393514.html</wfw:comment><comments>http://www.blogjava.net/zhaojianhua/archive/2012/12/26/393514.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaojianhua/comments/commentRss/393514.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaojianhua/services/trackbacks/393514.html</trackback:ping><description><![CDATA[<span style="color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;">首先启动android模拟器。</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;" /><span style="color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;">打开cmd命令行窗口。输入adb -s emulator-5554 shell</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;" /><span style="color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;">此时可以管理系统文件夹了，再输入ls</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;" /><span style="color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;">可以看到列出了文件夹和文件，输入cd system/app再输入ls</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;" /><span style="color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;">可以看到系统自带的应用程序apk文件，删除你想要删除的，例如Phone.apk，输入rm Phone.apk</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;" /><span style="color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;">此时会看到提示说rm failed for Phone.apk, Read-only file system那是因为这些是只读文件，我们没有权限删除它。所以接下来要做的是获取权限，首先查看权限，输入mount</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;" /><span style="color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;">可以看到/dev/block/mtdblock0 /system yaffs2 ro 0 0说明在system这个地方我们没有权限那么接下来我们就来获取权限，输入mount -o remount,rw -t yaffs2 /dev/block/mtdblock0 /system</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;" /><span style="color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;">没有提示错误，再次查看权限，输入mount</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;" /><span style="color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;">可以看到/dev/block/mtdblock0 /system yaffs2 rw 0 0</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;" /><span style="color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;">说明我们已经获取到权限了此时再输入rm Phone.apk就可以成功删除了</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;" /><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;" /><span style="color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;">最后一点，就算你成功删除了，android模拟器每次启动时也会恢复回来。</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;" /><span style="color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;">那么如何永久删除呢，很简单，删除SdkSetup.apk，输入rm SdkSetup.apk</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;" /><span style="color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;">还没完，找到avd目录(一般在我的文档)，进入xxxx.avd目录，删除cache.img和userdata-qemu.img</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;" /><span style="color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;">还有还有，找到%SDK_HOME%/platforms/android-X/images/system.img，复制到上面的目录中。</span><br style="word-wrap: break-word; color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;" /><span style="color: #444444; font-family: Tahoma, 'Microsoft Yahei', Simsun; background-color: #ffffff;">最后最后，再重启模拟器，大功告成！</span><img src ="http://www.blogjava.net/zhaojianhua/aggbug/393514.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaojianhua/" target="_blank">建华</a> 2012-12-26 18:17 <a href="http://www.blogjava.net/zhaojianhua/archive/2012/12/26/393514.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>surfaceView 与View 的区别</title><link>http://www.blogjava.net/zhaojianhua/archive/2012/03/23/372555.html</link><dc:creator>建华</dc:creator><author>建华</author><pubDate>Fri, 23 Mar 2012 08:33:00 GMT</pubDate><guid>http://www.blogjava.net/zhaojianhua/archive/2012/03/23/372555.html</guid><wfw:comment>http://www.blogjava.net/zhaojianhua/comments/372555.html</wfw:comment><comments>http://www.blogjava.net/zhaojianhua/archive/2012/03/23/372555.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaojianhua/comments/commentRss/372555.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaojianhua/services/trackbacks/372555.html</trackback:ping><description><![CDATA[<div><div id="sina_keyword_ad_area2"  "=""><wbr> 如果你的游戏不吃CPU，用View就比较好，符合标准<a href="http://dev.10086.cn/cmdn/wiki/index.php?doc-view-1789">Android</a>操作方式，由系统决定刷新surface的时机。 <div> <p><span style="font-size:14px">　　但如果很不幸的，你做不到不让你的程序吃CPU，你就只好使用SurfaceView来强制刷新surface了，不然系统的<a href="http://dev.10086.cn/cmdn/wiki/index.php?doc-view-1788">UI</a>进程很可能抢不过你那些吃CPU的线程。</span></p> <p>　　当然其实不止这两种方法来刷新Surface的，这两种只是纯<a href="http://dev.10086.cn/cmdn/wiki/index.php?doc-view-1306">Java</a>应用比较常见的方法。</p> <p> 　　SurfaceView和View最本质的区别在于，surfaceView是在一个新起的单独线程中可以重新绘制画面而View必须在UI的主线程中更新画面。</p> <p>　　那么在UI的主线程中更新画面 可能会引发问题，比如你更新画面的时间过长，那么你的主UI线程会被你正在画的函数阻塞。那么将无法响应按键，触屏等消息。</p> <p>　 　当使用surfaceView 由于是在新的线程中更新画面所以不会阻塞你的UI主线程。但这也带来了另外一个问题，就是事件同步。比如你触屏了一下，你需要surfaceView中 thread处理，一般就需要有一个event queue的设计来保存touch event，这会稍稍复杂一点，因为涉及到线程同步。</p> <p>　　所以基于以上，根据游戏特点，一般分成两类。</p> <p>　　1 被动更新画面的。比如棋类，这种用view就好了。因为画面的更新是依赖于 onTouch 来更新，可以直接使用 invalidate。 因为这种情况下，这一次Touch和下一次的Touch需要的时间比较长些，不会产生影响。</p> <p>　　2 主动更新。比如一个人在一直跑动。这就需要一个单独的thread不停的重绘人的状态，避免阻塞main UI thread。所以显然view不合适，需要surfaceView来控制。</p> </div></div></div><img src ="http://www.blogjava.net/zhaojianhua/aggbug/372555.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaojianhua/" target="_blank">建华</a> 2012-03-23 16:33 <a href="http://www.blogjava.net/zhaojianhua/archive/2012/03/23/372555.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>android多国语言文件夹</title><link>http://www.blogjava.net/zhaojianhua/archive/2012/02/09/369676.html</link><dc:creator>建华</dc:creator><author>建华</author><pubDate>Thu, 09 Feb 2012 07:21:00 GMT</pubDate><guid>http://www.blogjava.net/zhaojianhua/archive/2012/02/09/369676.html</guid><wfw:comment>http://www.blogjava.net/zhaojianhua/comments/369676.html</wfw:comment><comments>http://www.blogjava.net/zhaojianhua/archive/2012/02/09/369676.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaojianhua/comments/commentRss/369676.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaojianhua/services/trackbacks/369676.html</trackback:ping><description><![CDATA[<div><p>android多国语言文件夹文件汇总如下：</p> <p>中文（中国）：values-zh-rCN</p> <p>中文（台湾）：values-zh-rTW</p> <p>中文（香港）：values-zh-rHK</p> <p>英语（美国）：values-en-rUS</p> <p>英语（英国）：values-en-rGB</p> <p>英文（澳大利亚）：values-en-rAU</p> <p>英文（加拿大）：values-en-rCA</p> <p>英文（爱尔兰）：values-en-rIE</p> <p>英文（印度）：values-en-rIN</p> <p>英文（新西兰）：values-en-rNZ</p> <p>英文（新加坡）：values-en-rSG</p> <p>英文（南非）：values-en-rZA</p> <p>阿拉伯文（埃及）：values-ar-rEG</p> <p>阿拉伯文（以色列）：values-ar-rIL</p> <p>保加利亚文:&nbsp; values-bg-rBG</p> <p>加泰罗尼亚文：values-ca-rES</p> <p>捷克文：values-cs-rCZ</p> <p>丹麦文：values-da-rDK</p> <p>德文（奥地利）：values-de-rAT</p> <p>德文（瑞士）：values-de-rCH</p> <p>德文（德国）：values-de-rDE</p> <p>德文（列支敦士登）：values-de-rLI</p> <p>希腊文：values-el-rGR</p> <p>西班牙文（西班牙）：values-es-rES</p> <p>西班牙文（美国）：values-es-rUS</p> <p>芬兰文（芬兰）：values-fi-rFI</p> <p>法文（比利时）：values-fr-rBE</p> <p>法文（加拿大）：values-fr-rCA</p> <p>法文（瑞士）：values-fr-rCH</p> <p>法文（法国）：values-fr-rFR</p> <p>希伯来文：values-iw-rIL</p> <p>印地文：values-hi-rIN</p> <p>克罗里亚文：values-hr-rHR</p> <p>匈牙利文：values-hu-rHU</p> <p>印度尼西亚文：values-in-rID</p> <p>意大利文（瑞士）：values-it-rCH</p> <p>意大利文（意大利）：values-it-rIT</p> <p>日文：values-ja-rJP</p> <p>韩文：values-ko-rKR</p> <p>立陶宛文：valueslt-rLT</p> <p>拉脱维亚文：values-lv-rLV</p> <p>挪威博克马尔文：values-nb-rNO</p> <p>荷兰文(比利时)：values-nl-BE</p> <p>荷兰文（荷兰）：values-nl-rNL</p> <p>波兰文：values-pl-rPL</p> <p>葡萄牙文（巴西）：values-pt-rBR</p> <p>葡萄牙文（葡萄牙）：values-pt-rPT</p> <p>罗马尼亚文：values-ro-rRO</p> <p>俄文：values-ru-rRU</p> <p>斯洛伐克文：values-sk-rSK</p> <p>斯洛文尼亚文：values-sl-rSI</p> <p>塞尔维亚文：values-sr-rRS</p> <p>瑞典文：values-sv-rSE</p> <p>泰文：values-th-rTH</p> <p>塔加洛语：values-tl-rPH</p> <p>土耳其文：values--r-rTR</p> <p>乌克兰文：values-uk-rUA</p> <p>越南文：values-vi-rVN</p></div><img src ="http://www.blogjava.net/zhaojianhua/aggbug/369676.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaojianhua/" target="_blank">建华</a> 2012-02-09 15:21 <a href="http://www.blogjava.net/zhaojianhua/archive/2012/02/09/369676.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如果task中已经有这个activity A，那么就把A拿到task的最顶层，而不是创建一个新的activity</title><link>http://www.blogjava.net/zhaojianhua/archive/2011/12/20/366880.html</link><dc:creator>建华</dc:creator><author>建华</author><pubDate>Tue, 20 Dec 2011 11:31:00 GMT</pubDate><guid>http://www.blogjava.net/zhaojianhua/archive/2011/12/20/366880.html</guid><wfw:comment>http://www.blogjava.net/zhaojianhua/comments/366880.html</wfw:comment><comments>http://www.blogjava.net/zhaojianhua/archive/2011/12/20/366880.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaojianhua/comments/commentRss/366880.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaojianhua/services/trackbacks/366880.html</trackback:ping><description><![CDATA[<div>Intent.FLAG_ACTIVITY_REORDER_TO_FRONT的意思是，如果task中已经有这个activity A，那么就把A拿到task的最顶层，而不是创建一个新的activity。<br /><br />所以不加flag也不会影响界面的切过去，只是会影响task的顺序而已。</div><img src ="http://www.blogjava.net/zhaojianhua/aggbug/366880.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaojianhua/" target="_blank">建华</a> 2011-12-20 19:31 <a href="http://www.blogjava.net/zhaojianhua/archive/2011/12/20/366880.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android开发小知识 ListView几个比较特别的属性</title><link>http://www.blogjava.net/zhaojianhua/archive/2011/12/14/366371.html</link><dc:creator>建华</dc:creator><author>建华</author><pubDate>Wed, 14 Dec 2011 12:14:00 GMT</pubDate><guid>http://www.blogjava.net/zhaojianhua/archive/2011/12/14/366371.html</guid><wfw:comment>http://www.blogjava.net/zhaojianhua/comments/366371.html</wfw:comment><comments>http://www.blogjava.net/zhaojianhua/archive/2011/12/14/366371.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaojianhua/comments/commentRss/366371.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaojianhua/services/trackbacks/366371.html</trackback:ping><description><![CDATA[<div>Android:stackFromBottom="true"        设置该属性之后你做好的列表就会显示在列表的最下面，值为true和false <br />android:transcriptMode="alwaysScroll"   要用ListView或者其它显示大量Items的控件实时跟踪或者查看信息，并且希望最新的条目可以自动滚动到可视范围内。通过设置的控件 transcriptMode属性可以将Android平台的控件（支持ScrollBar）自动滑动到最底部。 c<br />acheColorHint属性，很多人希望能够改变一下它的背景，使他能够符合整体的UI设计，改变背景背很简单只需要准备一张图片然后指定属性  <br />android:background="@drawable/bg"，不过当你这么做以后，发现背景是变了，但是当你拖动，或者点击list空白位置的 时候发现ListItem都变成黑色的了，破坏了整体效果。 如果只是换背景的颜色的话，可以直接指定<br />android:cacheColorHint为你所要的颜色，如果你是用图片做背景的话，那也只要将 <br />android:cacheColorHint指定为透明（#00000000）就可以了 <br />android:divider="@drawable/list_driver"  其中  @drawable/list_driver  是一个图片资源，如果不想显示分割线则只要设置为android:divider="@drawable/@null" 就可以了 android:scrollbars="none"与setVerticalScrollBarEnabled(true);的效果是一样的，不活动的 时候隐藏，活动的时候也隐藏 android:fadeScrollbars="true"   配置ListView布局的时候，设置这个属性为true就可以实现滚动条的自动隐藏和显示。 fadingEdge属性，上边和下边有黑色的阴影 android:fadingEdge="none" 设置后没有阴影了<img src="http://woshao.com/articles/4dc780bc-ce7f-11e0-8585-000c2959fd2a/stats/reads.png" alt="" /></div><img src ="http://www.blogjava.net/zhaojianhua/aggbug/366371.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaojianhua/" target="_blank">建华</a> 2011-12-14 20:14 <a href="http://www.blogjava.net/zhaojianhua/archive/2011/12/14/366371.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>做一个透明的activity</title><link>http://www.blogjava.net/zhaojianhua/archive/2011/12/13/366230.html</link><dc:creator>建华</dc:creator><author>建华</author><pubDate>Tue, 13 Dec 2011 06:13:00 GMT</pubDate><guid>http://www.blogjava.net/zhaojianhua/archive/2011/12/13/366230.html</guid><wfw:comment>http://www.blogjava.net/zhaojianhua/comments/366230.html</wfw:comment><comments>http://www.blogjava.net/zhaojianhua/archive/2011/12/13/366230.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaojianhua/comments/commentRss/366230.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaojianhua/services/trackbacks/366230.html</trackback:ping><description><![CDATA[<div><div>&lt;activity android:name=".usual.activity.Declaration" android:theme="@android:style/Theme.Translucent.NoTitleBar" /&gt;</div></div><img src ="http://www.blogjava.net/zhaojianhua/aggbug/366230.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaojianhua/" target="_blank">建华</a> 2011-12-13 14:13 <a href="http://www.blogjava.net/zhaojianhua/archive/2011/12/13/366230.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>draw9patch不失真背景</title><link>http://www.blogjava.net/zhaojianhua/archive/2011/11/24/364729.html</link><dc:creator>建华</dc:creator><author>建华</author><pubDate>Thu, 24 Nov 2011 07:00:00 GMT</pubDate><guid>http://www.blogjava.net/zhaojianhua/archive/2011/11/24/364729.html</guid><wfw:comment>http://www.blogjava.net/zhaojianhua/comments/364729.html</wfw:comment><comments>http://www.blogjava.net/zhaojianhua/archive/2011/11/24/364729.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/zhaojianhua/comments/commentRss/364729.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/zhaojianhua/services/trackbacks/364729.html</trackback:ping><description><![CDATA[<div><p><strong>1.背景自适应且不失真问题的存在</strong><br />&nbsp;&nbsp; &nbsp; &nbsp;制作自适应背景图片是UI开发的一个广泛问题，也是界面设计师渴望解决的问题，我相信我们彼此都深有体会。<br />&nbsp;&nbsp; &nbsp; &nbsp;比如,列表的背景图一定，但是列表的高度随着列表数据项会发生变化；标题栏的背景，无论横屏还是竖屏，高分辨率还是低分辨率，都能自动填充满，而且不失真等等背景问题。<br />&nbsp;&nbsp; &nbsp; &nbsp;根据以往的经验，我们一般采用先切图后拼凑的做法，这种做法本来我想在这里和大家介绍一下，其实有的时候还是很有用的，但是说起来会比较麻烦，就不说这个非重点了，略去，如果大家真的要介绍，在回复中说明，我再考虑一下。<br />&nbsp;&nbsp; &nbsp; Android针对这种情况，专门制作了一种.9.PNG格式来解决这个问题。</p> <p><strong>2.9.PNG格式。</strong><br />&nbsp;&nbsp; &nbsp;  &nbsp;我不想在这里过多的讨论PNG格式的定义问题。但是.9.PNG确实是标准的PNG格式，只是在最外面一圈额外增加1px的边框，这个1px的边框就是 用来定义图片中可扩展的和静态不变的区域。特别说明，left和top边框中交叉部分是可拉伸部分，未选中部分是静态区域部分。right和bottom 边框中交叉部分则是内容部分（变相的相当于定义看一个内边距，神似padding功能，后面我会单独介绍一下），这个参数是可选的, 如下图。<br /><img style="display: block; margin-left: auto; margin-right: auto;" src="http://pic002.cnblogs.com/images/2011/31770/2011041623103426.png"  alt="" />&nbsp;&nbsp; &nbsp; 在Android中以9.PNG格式的图片未背景，则能够自定义拉伸而不失真，比如系统的Button就是一个典型的例子。&nbsp;<br />&nbsp;&nbsp; &nbsp; 其实呢，无论是left和top，还是right和bottom都是把图片分成9块 (边角四块是不能缩放的，其他的四块则是允许缩放的)，所以叫做9.PNG。</p> <p><strong>3. 使用Draw9Patch.jar制作9.PNG图片之定义拉伸区域。</strong><br />&nbsp;&nbsp; &nbsp; &nbsp;前面已经了解到9.PNG格式的工作方式，下面我们使用谷歌提供的Draw9Patch(运行android-sdk-windows\tools目录下的Draw9Patch.bat)来制作.9.PNG图片。<br />&nbsp;&nbsp; &nbsp; &nbsp;<strong><em>第一步：准备要拉伸的图片。</em></strong><br />&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<img src="http://pic002.cnblogs.com/images/2011/31770/2011041700115098.png" style="display: block; margin-left: auto; margin-right: auto;"  alt="" /><br />&nbsp;&nbsp; &nbsp; &nbsp;非常小的一张图片，我希望以此为背景，中间部分填充文章内容。<br />&nbsp;&nbsp; &nbsp; &nbsp;<strong><em>第二步：制作.9.PNG图片</em></strong>。<br />&nbsp;&nbsp; &nbsp; &nbsp;打开Draw9Patch,把图片拖进去，如下：<br /><img src="http://pic002.cnblogs.com/images/2011/31770/2011041700231231.png" style="display: block; margin-left: auto; margin-right: auto;"  alt="" /><br />&nbsp;&nbsp; &nbsp; &nbsp;默认的拉伸是整体拉伸，其实边框部分我们并不想拉伸，好，我们自己来定义拉伸区域，如下图：<br /><img src="http://pic002.cnblogs.com/images/2011/31770/2011041700343167.png" style="display: block; margin-left: auto; margin-right: auto;"  alt="" /><img src="http://pic002.cnblogs.com/images/2011/31770/2011041700393082.png" style="display: block; margin-left: auto; margin-right: auto;"  alt="" /></p> <p>&nbsp;&nbsp; &nbsp; &nbsp; 然后点击File,导出为content.9.png。<br />&nbsp;&nbsp; &nbsp; &nbsp; <em><strong>第三步：在layout文件中使用制作的 .9.PNG图片.</strong></em><br />&nbsp;&nbsp; &nbsp; &nbsp; 新建工程Draw9Patch，默认主Activity为Draw9PatchActivity.java:</p> <div> <div "="" id="highlighter_844734"><div><div alt1"=""><table><tbody><tr><td><code>1</code></td><td><code>@Override</code></td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>2</code></td><td><code>public</code> <code>void</code> <code>onCreate(Bundle savedInstanceState)</code></td></tr></tbody></table></div><div alt1"=""><table><tbody><tr><td><code>3</code></td><td><code>{</code></td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>4</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>super</code><code>.onCreate(savedInstanceState);</code></td></tr></tbody></table></div><div alt1"=""><table><tbody><tr><td><code>5</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>setContentView(R.layout.main);</code></td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>6</code></td><td><code>}</code></td></tr></tbody></table></div></div></div> </div> <p>&nbsp;&nbsp; &nbsp; &nbsp;我们把content.9.png文件拷贝到/res/drawable文件夹下，打开/res/layout目录下的main.xml，申明如下：</p> <div> <div "="" id="highlighter_86540"><div><div alt1"=""><table><tbody><tr><td><code>01</code></td><td><code>&lt;?</code><code>xml</code> <code>version</code><code>=</code><code>"1.0"</code> <code>encoding</code><code>=</code><code>"utf-8"</code><code>?&gt;</code></td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>02</code></td><td><code>&lt;</code><code>LinearLayout</code> <code>xmlns:android</code><code>=</code><code>"<a href="http://schemas.android.com/apk/res/android">http://schemas.android.com/apk/res/android</a>"</code></td></tr></tbody></table></div><div alt1"=""><table><tbody><tr><td><code>03</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>android:orientation</code><code>=</code><code>"vertical"</code></td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>04</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>android:layout_width</code><code>=</code><code>"fill_parent"</code></td></tr></tbody></table></div><div alt1"=""><table><tbody><tr><td><code>05</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>android:layout_height</code><code>=</code><code>"fill_parent"</code></td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>06</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>android:background</code><code>=</code><code>"#777"</code></td></tr></tbody></table></div><div alt1"=""><table><tbody><tr><td><code>07</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>android:padding</code><code>=</code><code>"8dip"</code></td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>08</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>&gt;</code></td></tr></tbody></table></div><div alt1"=""><table><tbody><tr><td><code>09</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>&lt;</code><code>TextView</code></td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>10</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>android:layout_width</code><code>=</code><code>"fill_parent"</code></td></tr></tbody></table></div><div alt1"=""><table><tbody><tr><td><code>11</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>android:layout_height</code><code>=</code><code>"wrap_content"</code></td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>12</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>android:text</code><code>=</code><code>"正文:A NinePatchDrawable graphic is a stretchable bitmap image."</code></td></tr></tbody></table></div><div alt1"=""><table><tbody><tr><td><code>13</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>android:background</code><code>=</code><code>"@drawable/content"</code></td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>14</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>android:textColor</code><code>=</code><code>"#000"</code></td></tr></tbody></table></div><div alt1"=""><table><tbody><tr><td><code>15</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>/&gt;</code></td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>16</code></td><td><code>&lt;/</code><code>LinearLayout</code><code>&gt;</code></td></tr></tbody></table></div></div></div> </div> <p>&nbsp;&nbsp; &nbsp; 如图，<br /><img src="http://pic002.cnblogs.com/images/2011/31770/2011041700574383.png" style="display: block; margin-left: auto; margin-right: auto;"  alt="" /><br />&nbsp;&nbsp; &nbsp; 我们修改text，</p> <div> <div "="" id="highlighter_190688"><div><div alt1"=""><table><tbody><tr><td><code>01</code></td><td><code>&lt;?</code><code>xml</code> <code>version</code><code>=</code><code>"1.0"</code> <code>encoding</code><code>=</code><code>"utf-8"</code><code>?&gt;</code></td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>02</code></td><td><code>&lt;</code><code>LinearLayout</code> <code>xmlns:android</code><code>=</code><code>"<a href="http://schemas.android.com/apk/res/android">http://schemas.android.com/apk/res/android</a>"</code></td></tr></tbody></table></div><div alt1"=""><table><tbody><tr><td><code>03</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>android:orientation</code><code>=</code><code>"vertical"</code></td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>04</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>android:layout_width</code><code>=</code><code>"fill_parent"</code></td></tr></tbody></table></div><div alt1"=""><table><tbody><tr><td><code>05</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>android:layout_height</code><code>=</code><code>"fill_parent"</code></td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>06</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>android:background</code><code>=</code><code>"#777"</code></td></tr></tbody></table></div><div alt1"=""><table><tbody><tr><td><code>07</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>android:padding</code><code>=</code><code>"8dip"</code></td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>08</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>&gt;</code></td></tr></tbody></table></div><div alt1"=""><table><tbody><tr><td><code>09</code></td><td><code>&lt;</code><code>TextView</code></td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>10</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>android:layout_width</code><code>=</code><code>"fill_parent"</code></td></tr></tbody></table></div><div alt1"=""><table><tbody><tr><td><code>11</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>android:layout_height</code><code>=</code><code>"wrap_content"</code></td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>12</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>android:text</code><code>=</code><code>" 正文:A NinePatchDrawable graphic is a stretchable bitmap image, which  Android will automatically resize to accommodate the contents of the  View in which you have placed it as the background. A NinePatch drawable  is a standard PNG image that includes an extra 1-pixel-wide border."</code></td></tr></tbody></table></div><div alt1"=""><table><tbody><tr><td><code>13</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>android:background</code><code>=</code><code>"@drawable/content"</code></td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>14</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>android:textColor</code><code>=</code><code>"#000"</code></td></tr></tbody></table></div><div alt1"=""><table><tbody><tr><td><code>15</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;</code><code>/&gt;</code></td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>16</code></td><td><code>&lt;/</code><code>LinearLayout</code><code>&gt;</code></td></tr></tbody></table></div></div></div> </div> <p>&nbsp;&nbsp; &nbsp; &nbsp;如图，<br /><img src="http://pic002.cnblogs.com/images/2011/31770/2011041700595145.png" style="display: block; margin-left: auto; margin-right: auto;"  alt="" /></p> <p>&nbsp;&nbsp; &nbsp; &nbsp;可以看出，边框非常的清晰。下图是未使用.9.PNG的对比图，而且也不是我们要的效果：</p> <p><img src="http://pic002.cnblogs.com/images/2011/31770/2011041701062374.png" style="display: block; margin-left: auto; margin-right: auto;"  alt="" />&nbsp;&nbsp; &nbsp; &nbsp;到这里为止，我们已经基本会制作.9.PNG图片了。为了知识体系的全面性和深入性，我们继续。</p> <p>4.<strong>使用Draw9Patch.jar制作9.PNG图片之定义内容区域。</strong><br />&nbsp;&nbsp; &nbsp; &nbsp;是不是觉得文字和边距挨的太近，好，我们使用right和bottom边的线来定义内容区域，来达到增大内边距的目的。<br /><img src="http://pic002.cnblogs.com/images/2011/31770/2011041701293991.png" style="display: block; margin-left: auto; margin-right: auto;"  alt="" /><br />&nbsp;&nbsp; &nbsp; &nbsp;我们定义了一个很小的内容区域，其他的地方则自动充当边框，从而使内边距显的很大，如下图，<br /><img src="http://pic002.cnblogs.com/images/2011/31770/2011041701364646.png" style="display: block; margin-left: auto; margin-right: auto;"  alt="" /><br />&nbsp;&nbsp;  &nbsp;  &nbsp;在这里，我要特别说明，一开始为了增大内边距，很容易惯性思维，在&lt;TextView&gt;中申明 android:padding="10dip"  之类的，我在这里劝告朋友们不要这么做，一是你将无法预知你的显示，二是这比较混淆，因为设置内容区域就是确定padding，所以我在前面部分说他们是 神似。我个人认为通过内容区域设定padding比在布局xml中定义padding更优雅，更简洁！<br />&nbsp;&nbsp; &nbsp; &nbsp;关于Draw9Patch工具的其他使用说明，我在次不再累述，因为要说的话太多，为了节省篇幅，请参考官方文档。</p> <p><strong>5.制作.9.PNG的高级技巧。</strong><br />&nbsp;&nbsp; &nbsp; &nbsp; 对于初学Draw9Patch的人来说，这可以算是高级技巧，那就是：<span style="text-decoration: underline;"><em>拉伸区域，可以不是连续的，可以不止一块，而且是和自定义的边框线的长度成正比。</em></span><br />&nbsp;&nbsp; &nbsp; &nbsp; 直接上图说明：<br /><img style="display: block; margin-left: auto; margin-right: auto;" src="http://pic002.cnblogs.com/images/2011/31770/2011041702021279.png"  alt="" />&nbsp;</p> <p><strong>6.SDK中如何处理9.PNG图片。</strong><br />&nbsp;&nbsp; &nbsp;  &nbsp;SDK专门针对9.PNG做了定义和处理，这里我们只是做个简单的流程分析，Bitmap在读取图像流数据的时候，会把判断图片的 NinePatchChunk(9Patch数据块)，如果NinePatchChunk不为空，则是 NinePatchDrawable，NinePatchDrawable则又会交给NinePatch处理：</p> <div> <div "="" id="highlighter_652929"><div><div alt1"=""><table><tbody><tr><td><code>1</code></td><td><code>setNinePatchState(</code><code>new</code> <code>NinePatchState(</code></td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>2</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code>new</code> <code>NinePatch(bitmap, bitmap.getNinePatchChunk(), </code><code>"XML 9-patch"</code><code>),</code></td></tr></tbody></table></div><div alt1"=""><table><tbody><tr><td><code>3</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code>padding, dither), r);</code></td></tr></tbody></table></div></div></div> </div> <p>&nbsp;&nbsp; &nbsp; &nbsp;NinePatch检验成功则调用本地方法，绘制出最终的图片：</p> <div> <div "="" id="highlighter_816842"><div><div alt1"=""><table><tbody><tr><td><code>1</code></td><td><code>nativeDraw(canvas.mNativeCanvas, location,</code></td></tr></tbody></table></div><div alt2"=""><table><tbody><tr><td><code>2</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code>mBitmap.ni(), mChunk, paint != </code><code>null</code> <code>? paint.mNativePaint : </code><code>0</code><code>,</code></td></tr></tbody></table></div><div alt1"=""><table><tbody><tr><td><code>3</code></td><td><code>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code>canvas.mDensity, mBitmap.mDensity);</code></td></tr></tbody></table></div></div></div> </div> <p><strong>7.android系统中大量应用了9.PNG图片。</strong><br />&nbsp;&nbsp; &nbsp; 通过解压随便一个rom，找到里面的framework_res.apk,里面有大量的9.PNG格式文件，被广泛的应用起来，比如常见的有：<br />&nbsp;&nbsp; &nbsp; 按钮：<img src="http://pic002.cnblogs.com/images/2011/31770/2011041702450222.png"  alt="" />&nbsp;<img src="http://pic002.cnblogs.com/images/2011/31770/2011041702453263.png"  alt="" />&nbsp;<img src="http://pic002.cnblogs.com/images/2011/31770/2011041702454963.png"  alt="" /><br />&nbsp;&nbsp; &nbsp; 解锁：<img src="http://pic002.cnblogs.com/images/2011/31770/2011041702484148.png"  alt="" />&nbsp;<img src="http://pic002.cnblogs.com/images/2011/31770/2011041702490242.png"  alt="" />&nbsp;<img src="http://pic002.cnblogs.com/images/2011/31770/2011041702491557.png"  alt="" /><br />&nbsp;&nbsp; &nbsp; 下拉框：<img src="http://pic002.cnblogs.com/images/2011/31770/2011041702465816.png"  alt="" />&nbsp;<img src="http://pic002.cnblogs.com/images/2011/31770/2011041702472347.png"  alt="" />&nbsp;<img src="http://pic002.cnblogs.com/images/2011/31770/2011041702473728.png"  alt="" /><br />&nbsp;&nbsp; &nbsp; 标题栏：<img src="http://pic002.cnblogs.com/images/2011/31770/2011041702424231.png"  alt="" /><br />&nbsp;&nbsp; &nbsp; Toast：<img src="http://pic002.cnblogs.com/images/2011/31770/2011041702520097.png"  alt="" /><br />&nbsp;&nbsp; &nbsp; &nbsp;还有搜索，键盘，放大缩小控件，时间加减等等，我就不一一列举。</p> <strong>8.最后送上一些图例，以飨读者，以做后鉴：</strong><br /><img src="http://pic002.cnblogs.com/images/2011/31770/2011041702054926.png"  alt="" />&nbsp;<br />赏图1 本人之作<br /><img src="http://pic002.cnblogs.com/images/2011/31770/2011041702115762.jpg"  alt="" /><br />&nbsp;赏图2 下拉按钮<br /><img src="http://pic002.cnblogs.com/images/2011/31770/2011041702134696.jpg"  alt="" />&nbsp;<br />赏图3 文章头部背景&nbsp;<br /><img src="http://pic002.cnblogs.com/images/2011/31770/2011041702154997.jpg"  alt="" />&nbsp;<br />赏图4 系统头部背景<br /><img src="http://pic002.cnblogs.com/images/2011/31770/2011041702164420.jpg"  alt="" /></div>转载于<div>http://www.cnblogs.com/qianxudetianxia/archive/2011/04/17/2017591.html</div><img src ="http://www.blogjava.net/zhaojianhua/aggbug/364729.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/zhaojianhua/" target="_blank">建华</a> 2011-11-24 15:00 <a href="http://www.blogjava.net/zhaojianhua/archive/2011/11/24/364729.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>