<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_Love in coding...</title><subtitle type="text">Free and Susan</subtitle><id>http://feed.cnblogs.com/blog/u/16722/rss</id><updated>2012-02-08T08:34:12Z</updated><author><name>freeliver54</name><uri>http://www.cnblogs.com/freeliver54/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/freeliver54/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/16722/rss"/><entry><id>http://www.cnblogs.com/freeliver54/archive/2012/02/08/2342904.html</id><title type="text">[转]html5之Canvas坐标变换应用-时钟实例</title><summary type="text">本文转自：http://www.cnblogs.com/whitewolf/archive/2011/03/02/1969398.html在上一篇中我们了解html5的Canvas ，在这一篇中不用多说，写一个html5的时钟应用程序试手。在这里主要设置了坐标变换的平移（translate）和旋转变换（ratate），以及html5 Canvas的路径绘图，beginPath，closePath，rect，arc等，还有就是html5 Canvas路径绘图重要的绘图状态的保存和恢复机制，save，restore。 多的也不说了，直接上代码，有不解的欢迎提问，以及对我的建议指教都可以，。ff下效</summary><published>2012-02-08T08:34:00Z</published><updated>2012-02-08T08:34:00Z</updated><author><name>freeliver54</name><uri>http://www.cnblogs.com/freeliver54/</uri></author><link rel="alternate" href="http://www.cnblogs.com/freeliver54/archive/2012/02/08/2342904.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/freeliver54/archive/2012/02/08/2342904.html"/><content type="html">&lt;p&gt;本文转自：&lt;a href="http://www.cnblogs.com/whitewolf/archive/2011/03/02/1969398.html" target="_blank"&gt;http://www.cnblogs.com/whitewolf/archive/2011/03/02/1969398.html&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在上一篇中我们了解&lt;a href="http://www.cnblogs.com/whitewolf/archive/2011/03/02/1968512.html"&gt;&lt;font color="#3d81ee"&gt;html5的Canvas&lt;/font&gt;&lt;/a&gt; ，在这一篇中不用多说，写一个html5的时钟应用程序试手。在这里主要设置了坐标变换的平移（translate）和旋转变换（ratate），以及html5 Canvas的路径绘图，beginPath，closePath，rect，arc等，还有就是html5 Canvas路径绘图重要的绘图状态的保存和恢复机制，save，restore。&lt;/p&gt;&#xD;
&lt;p&gt;多的也不说了，直接上代码，有不解的欢迎提问，以及对我的建议指教都可以，&lt;a href="http://images.cnblogs.com/cnblogs_com/whitewolf/201103/201103022317095203.gif"&gt;&lt;img style="display: inline" title="X@8}U9MLE}EBUE273)]9PGF" alt="X@8}U9MLE}EBUE273)]9PGF" src="http://images.cnblogs.com/cnblogs_com/whitewolf/201103/201103022317095726.gif" width="24" height="24" /&gt;&lt;/a&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;ff下效果图：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/whitewolf/201103/201103022317103742.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="51BU_~OA@BJ_FS{`)IO7T4P" border="0" alt="51BU_~OA@BJ_FS{`)IO7T4P" src="http://images.cnblogs.com/cnblogs_com/whitewolf/201103/201103022317108169.jpg" width="582" height="335" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;代码：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;" onclick="cnblogs_code_show('1254d600-6df4-4ef1-ae73-89119a9eaca7')"&gt;&lt;img id="code_img_opened_1254d600-6df4-4ef1-ae73-89119a9eaca7"  onclick="cnblogs_code_hide('1254d600-6df4-4ef1-ae73-89119a9eaca7',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt;&#xD;
&lt;div style="display: block" id="cnblogs_code_open_1254d600-6df4-4ef1-ae73-89119a9eaca7"  jquery17008552301114689653="1"&gt;&lt;textarea style="line-height: 1.5; width: 685px; font-family: Courier New; height: 1406px; font-size: 12px"&gt;&amp;lt;html&amp;gt; &#xD;
&amp;lt;head&amp;gt; &#xD;
&amp;lt;/head&amp;gt; &#xD;
&amp;lt;body&amp;gt; &#xD;
    &amp;lt;canvas id="myCanvas" width="600" height="300"&amp;gt;你的浏览器还不支持哦&amp;lt;/canvas&amp;gt; &#xD;
&#xD;
    &amp;lt;script type="text/javascript"&amp;gt; &#xD;
        var c = document.getElementById("myCanvas"); &#xD;
        var cxt = c.getContext("2d"); &#xD;
        var slen = 60; &#xD;
        var mlen = 50; &#xD;
        var hlen = 40; &#xD;
        cxt.strokeRect(0, 0, c.width, c.height); &#xD;
        cxt.beginPath(); &#xD;
        cxt.strokeStyle = "#00f"; &#xD;
        cxt.fillStyle = "#00f"; &#xD;
        cxt.arc(200, 150, 5, 0, 2 * Math.PI, true); &#xD;
        cxt.fill(); &#xD;
        cxt.closePath(); &#xD;
&#xD;
        cxt.beginPath(); &#xD;
        cxt.strokeStyle = "#00f"; &#xD;
        cxt.arc(200, 150, 100, 0, 2 * Math.PI, true); &#xD;
        cxt.stroke(); &#xD;
        cxt.closePath(); &#xD;
        cxt.beginPath(); &#xD;
        cxt.translate(200, 150); //平移原点； &#xD;
        cxt.rotate(-Math.PI / 2); &#xD;
        cxt.save();        &#xD;
        for (var i = 0; i &amp;lt; 60; i++) { &#xD;
            if (i % 5 == 0) { &#xD;
                //                cxt.fillStyle = "#ff0000"; &#xD;
                cxt.fillRect(80, 0, 20, 5); &#xD;
                cxt.fillText("" + (i / 5 == 0 ? 12 : i / 5), 70, 0); &#xD;
            } else { &#xD;
               // cxt.strokeStyle = "#00f"; &#xD;
                cxt.fillRect(90, 0, 10, 2); &#xD;
            } &#xD;
            //document.getElementById("div1").innerText += " " + i; &#xD;
            cxt.rotate(Math.PI / 30); &#xD;
        } &#xD;
        cxt.closePath(); &#xD;
&#xD;
        var ls = 0, lm = 0, lh = 0; &#xD;
function Refresh() { &#xD;
    cxt.restore(); &#xD;
    cxt.save(); &#xD;
    cxt.rotate(ls * Math.PI / 30); &#xD;
    cxt.clearRect(5, -1, slen+1, 2+2); &#xD;
    cxt.restore(); cxt.save(); &#xD;
&#xD;
    cxt.rotate(lm * Math.PI / 30); &#xD;
    cxt.clearRect(5, -1, mlen+1, 3+2); &#xD;
    cxt.restore(); cxt.save(); &#xD;
&#xD;
    cxt.rotate(lh * Math.PI / 6); &#xD;
    cxt.clearRect(5, -3, hlen+1, 4+2); &#xD;
&#xD;
    var time = new Date(); &#xD;
            var s = ls=time.getSeconds(); &#xD;
            var m = lm=time.getMinutes(); &#xD;
            var h = lh=time.getHours();            &#xD;
            cxt.restore(); &#xD;
            cxt.save(); &#xD;
            cxt.rotate(s * Math.PI / 30); &#xD;
            cxt.fillRect(5, 0, slen, 2); &#xD;
            cxt.restore(); cxt.save(); &#xD;
            cxt.rotate(m * Math.PI / 30); &#xD;
            cxt.fillRect(5, 0, mlen, 3); &#xD;
            cxt.restore(); cxt.save(); &#xD;
            cxt.rotate(h * Math.PI / 6); &#xD;
            cxt.fillRect(5, -2, hlen, 4); &#xD;
        } &#xD;
        var MyInterval = setInterval("Refresh();", 1000); &#xD;
    &amp;lt;/script&amp;gt; &#xD;
&amp;lt;div id="div1" style=" background:#00f;"&amp;gt;&amp;lt;/div&amp;gt; &#xD;
&amp;lt;/body&amp;gt; &#xD;
&amp;lt;/html&amp;gt;&lt;/textarea&gt; &#xD;
&lt;div&gt;按 Ctrl+C 复制代码&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我的html5系列：&lt;/p&gt;&#xD;
&lt;ol&gt;&#xD;
&lt;ol&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/whitewolf/archive/2011/02/28/1967456.html"&gt;&lt;font color="#669966"&gt;html5声频audio和视频video&lt;/font&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/whitewolf/archive/2011/03/02/1968512.html"&gt;&lt;font color="#669966"&gt;html5-Canvas绘图&lt;/font&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/whitewolf/archive/2011/03/02/1969398.html" target="_blank"&gt;&lt;font color="#669966"&gt;html5之Canvas坐标变换应用-时钟实例&lt;/font&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/whitewolf/archive/2011/03/04/1970457.html" target="_blank"&gt;&lt;font color="#669966"&gt;html5-web本地存储&lt;/font&gt;&lt;/a&gt; &lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div id="MySignature"&gt;&lt;!--polt--&gt;&#xD;
&#xD;
&lt;div id="AllanboltSignature"&gt;&#xD;
&lt;p style="border-bottom: #e0e0e0 1px dashed; border-left: #e0e0e0 1px dashed; padding-bottom: 1px; padding-left: 60px; width: 60%; padding-right: 10px;background: url(http://images.cnblogs.com/cnblogs_com/lloydsheng/239039/o_copyright.gif) #e5f1f4 no-repeat 1% 50%; margin-left: 30px; font-size: 12px; border-top: #e0e0e0 1px dashed; border-right: #e0e0e0 1px dashed; padding-top: 2px" id="PSignature"&gt;&lt;br /&gt;作者：&lt;a href="http://www.cnblogs.com/whitewolf/" target="_blank"&gt;&lt;font color="#3d81ee"&gt;破&amp;nbsp;&amp;nbsp;狼&lt;/font&gt;&lt;/a&gt; &lt;br /&gt;出处：&lt;a href="http://www.cnblogs.com/whitewolf/" target="_blank"&gt;&lt;font color="#3d81ee"&gt;http://www.cnblogs.com/whitewolf/&lt;/font&gt;&lt;/a&gt; &lt;br /&gt;本文版权归作者和博客园、CSDN共有，欢迎转载，但未经作者同意必须保留此段声明，且在文章页面明显位置给出原文连接，否则保留追究法律责任的权利。该文章也同时发布在我的独立博客中-&lt;a href="http://www.cnblogs.com/whitewolf/" target="_blank"&gt;&lt;font color="#3d81ee"&gt;博客园--破狼&lt;/font&gt;&lt;/a&gt;和&lt;a title="CSDN--野狼" href="http://blog.csdn.net/grzx2210" target="_blank"&gt;&lt;font color="#3d81ee"&gt;CSDN--野狼&lt;/font&gt;&lt;/a&gt;。 &lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/freeliver54/aggbug/2342904.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/freeliver54/archive/2012/02/08/2342904.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/freeliver54/archive/2012/02/08/2342671.html</id><title type="text">[转]利用 Ant 和 Eclipse 有效地提高部署工作效率</title><summary type="text">本文转自：http://www.ibm.com/developerworks/cn/java/j-lo-ant-eclipse/读者定位为具有 Java 和 Ant 使用经验的开发人员。读者可以学习到如何使用 Ant 解决一些多用户开发环境中，根据不同的目标环境编译成不同部署包的问题。工作场景现在有一个 web 项目，是多人进行开发的，通过 CVS 来管理。另外该项目还有一些测试人员，他们测试部署在测试服务器上的应用程序，发现 bug 后通过 bug 管理系统通知开发人员，在开发人员修复 bug 并经过本地测试后，由专门的人负责检出（check out）代码，编译打包后部署到测试服务器上。该项</summary><published>2012-02-08T06:34:00Z</published><updated>2012-02-08T06:34:00Z</updated><author><name>freeliver54</name><uri>http://www.cnblogs.com/freeliver54/</uri></author><link rel="alternate" href="http://www.cnblogs.com/freeliver54/archive/2012/02/08/2342671.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/freeliver54/archive/2012/02/08/2342671.html"/><content type="html">&lt;p&gt;本文转自：&lt;a href="http://www.ibm.com/developerworks/cn/java/j-lo-ant-eclipse/" target="_blank"&gt;http://www.ibm.com/developerworks/cn/java/j-lo-ant-eclipse/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;读者定位为具有 Java 和 Ant 使用经验的开发人员。&lt;/p&gt;&#xD;
&lt;p&gt;读者可以学习到如何使用 Ant 解决一些多用户开发环境中，根据不同的目标环境编译成不同部署包的问题。&lt;/p&gt;&#xD;
&lt;p sizset="87" sizcache="23"&gt;&lt;a name="N10074"&gt;&lt;span &gt;工作场景&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;现在有一个 web 项目，是多人进行开发的，通过 CVS 来管理。另外该项目还有一些测试人员，他们测试部署在测试服务器上的应用程序，发现 bug 后通过 bug 管理系统通知开发人员，在开发人员修复 bug 并经过本地测试后，由专门的人负责检出（check out）代码，编译打包后部署到测试服务器上。&lt;/p&gt;&#xD;
&lt;p&gt;该项目的成员小 A 就是负责检出代码、编译打包，并部署到服务器上的人。除了这个任务之外，他还是该项目的编程人员。在项目进入测试阶段后，小 A 在得到组中别的成员修复了 bug 并且检入（check in）了代码的消息后（也有可能是小 A 自己检入了代码），小 A 首先更新本地的代码，先在本地做测试，确认修复了 bug 后打成 WAR 包部署到测试服务器上，并通知测试人员已经修复了 bug，让测试人员继续进行测试。&lt;/p&gt;&#xD;
&lt;p sizset="88" sizcache="23"&gt;&lt;a name="N1007F"&gt;&lt;span &gt;小 A 的烦恼&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在该项目中，有一些为测试方便开发而写的代码和页面，比如跳过用户认证，但是在部署到测试机环境的时候，需要删除这些代码和页面；另外作为一个具有灵活性和扩展性的应用程序，又有一些配置文件，配置文件中的值会根据环境的改变而变动。例如，在项目中使用了 Log4j 记录日志，需要给 Log4j 指定日志文件的保存路径，本地程序员开发的时候用的是 Windows 系统，给 Log4j 指定的也是 Windows 的文件系统，在测试阶段的时候，需要部署到 Linux 系统中，那么日志的保存路径也需要做相应的改动。部署到测试服务器上的时候，除了 Log4j 需要改之外，还有很多别的配置项目也需要变动，并且分散在各个 package 中。小 A 的烦恼也随之而来，每次他在做完本地测之后，就根据测试机的需要逐个找配置文件，更改相应的值，并删除那些为测试方便写的代码和页面，每天可能根据需要做好几次这样的事情，最烦的是他在快做完对测试机环境更改的时候，某开发人员突然通知小 A 说：&amp;#8220;我又改了一点代码，刚检入，你再重打一个包吧。&amp;#8221;，小 A 又不得不从头开始做新一轮的检出代码、本地测试、更改配置文件、删除不需要的文件、打包部署的工作。另外小 A 在测试阶段的后期被通知要求除了每次生成一个测试环境的 WAR 包外还必须生成一个在产品环境下的 WAR 包，他做的事情就更多了。&lt;/p&gt;&#xD;
&lt;p&gt;从上面的场景可以看出，小 A 的工作效率低而且容易出错，甚至有可能导致整个项目的工作效率低下。其实可以通过 Ant 来帮助小 A 快速而且有效地完成这个工作。在 Ant 中，根据目标环境的需要，可以把所有要更改的配置文件的项目集中写到某个配置文件中。这样根据不同的目标环境得到不同的配置文件，Ant 在编译包时根据不同的目标环境切换不同的配置文件即可。比如小 A 现在碰到的有 3 中环境：开发环境、测试环境以及产品环境，根据这三种环境可以生成三个不同的配置文件：develop_deploy.property、test_deploy. property 和 product_deploy. property，当小 A 想生成不同的包时只需在这三个配置文件之间切换就可以了。&lt;/p&gt;&#xD;
&lt;p&gt;在正式开始编写脚本之前，我们需要下载安装相应的软件。&lt;/p&gt;&#xD;
&lt;ul sizset="89" sizcache="23"&gt;&lt;li sizset="89" sizcache="23"&gt;Eclipse：为了使 Ant 的开发更加简单，我们选择了 Eclipse3.1 作为开发环境。当然你可以使用任何你喜欢的文本编辑工具来开发你的 Ant。Eclipse 的最新版本可以在 http://eclipse.org/上下载。&lt;/li&gt;&lt;li sizset="90" sizcache="23"&gt;Ant：Ant 是基于 Java 的编译工具，它就像 C/C++ 中的 make，但是没有 make 那样难用。Ant 的最新版本可以在 http://ant.apache.org/bindownload.cgi上下载。如果你用 Eclipse 来开发 Ant，则不用去单独下载 Ant，因为在 Eclipse 中已经集成了 Ant。&lt;/li&gt;&lt;li sizset="91" sizcache="23"&gt;CVS 客户端（cvs.exe）：CVS 可以在 http://www.nongnu.org/cvs/上下载 &lt;/li&gt;&lt;/ul&gt;&#xD;
&lt;div &gt;&#xD;
&lt;hr /&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p sizset="93" sizcache="23"&gt;&lt;a name="N100A5"&gt;&lt;span &gt;用 Eclipse3.1 来创建 Ant 脚本&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;如果你使用 Eclipse 来编写 Ant，建议使用 Eclipse 3.1 以后的版本。除了以前 Ant 编辑器提供的语法高亮，提示语法错误等功能外，Eclipse3.1 版本增加了许多新的功能。比如：脚本代码的折叠；快速定位某属性或者目标（target）段的定义；在同一 builder 文件中重构属性名和目标名（快捷方式 Alt + Shift +R）；调试 Ant 脚本等。&lt;/p&gt;&#xD;
&lt;p&gt;下面我们就来看看 Eclipse 3.1 中对 Ant 的支持&lt;/p&gt;&#xD;
&lt;ul&gt;&lt;li&gt;&#xD;
&lt;p&gt;打开&amp;#8220;File&amp;#8221;－&amp;#8220;New&amp;#8221;－&amp;#8220;Project&amp;#8221;－&amp;#8220;Simple&amp;#8221;－&amp;#8220;Project&amp;#8221;，点击&amp;#8220;Next&amp;#8221;，输入工程名&amp;#8220;Ant&amp;#8221;，然后点击直到&amp;#8220;Finish&amp;#8221;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&#xD;
&lt;p&gt;在新建的 Ant 工程中，新建 Test.xml，并且拷贝下面的脚本。该段脚本的内容就不做介绍了，我们主要看 Eclipse 提供了哪些功能。注意这时候打开的并不是 Ant 编辑器，将内容拷贝进去之后，关掉打开的&amp;#8220;Test.xml&amp;#8221;，然后再重新打开它，这样 Eclipse 就会用 Ant 编辑器打开它，并且也语法高亮了。&lt;/p&gt;&#xD;
&lt;table border="0" cellspacing="0" cellpadding="0" width="100%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;pre &gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt; &#xD;
 &amp;lt;project name="Test" default="init" basedir="."&amp;gt; &#xD;
 &amp;lt;property name="test" value="test"/&amp;gt; &#xD;
 &amp;lt;target name="init"&amp;gt; &#xD;
	 &amp;lt;echo&amp;gt;${test}&amp;lt;/echo&amp;gt; &#xD;
 &amp;lt;/target&amp;gt; &#xD;
 &amp;lt;/project&amp;gt; &#xD;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&#xD;
&lt;p&gt;自动提示和代码折叠功能。如果是 Ant 内置的命令或者前面已经定义的变量，编辑器会自动提示；编辑器右边的加 / 减号可以代码折叠。如下所示：&lt;/p&gt;&lt;img alt="图 1：编辑器右边的加 / 减号可以代码折叠" src="http://www.ibm.com/developerworks/cn/java/j-lo-ant-eclipse/image001.jpg" width="576" height="181" /&gt;&lt;/li&gt;&lt;li&gt;&#xD;
&lt;p&gt;快速定位目标（target）或者定义变量处。在上图中，将鼠标移至 default=&amp;#8221;init&amp;#8221; 中的 init 上之后，按下 ctrl 键，鼠标变成手状，单击就可以定位到定义该目标的地方&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&#xD;
&lt;p&gt;快速重构目标名或者属性名。选中目标 / 属性名，按下 Alt + Shift + R，然后键入你要修改后的值，所有引用到的地方都会随之改动。如下图所示，选中 init 后，按下快捷键，改成 initial：&lt;/p&gt;&lt;img alt="图 2：改成 initial" src="http://www.ibm.com/developerworks/cn/java/j-lo-ant-eclipse/image002.jpg" width="423" height="121" /&gt;&lt;/li&gt;&lt;li&gt;&#xD;
&lt;p&gt;调试 Ant 脚本。在标签&amp;#8220;&amp;lt;target name=..&amp;#8221;的左边设置一断点，然后在编辑器中右击，出现的菜单中选&amp;#8220;Debug As&amp;#8221;－&amp;#8220;Ant Build&amp;#8221;，出现后的窗口与调试 Java 程序的界面差不多。&lt;/p&gt;&#xD;
&lt;p&gt;这是调试窗口，这里可以选择单步跟进、跳出等：&lt;/p&gt;&lt;img alt="图 3：选择单步跟进、跳出等" src="http://www.ibm.com/developerworks/cn/java/j-lo-ant-eclipse/image003.jpg" width="414" height="121" /&gt; &#xD;
&lt;p&gt;下面是运行时变量窗口。可以看到 test 变量的值是&amp;#8220;test&amp;#8221;：&lt;/p&gt;&lt;img alt="图 4：test 变量的值是 test" src="http://www.ibm.com/developerworks/cn/java/j-lo-ant-eclipse/image004.jpg" width="367" height="152" /&gt; &#xD;
&lt;p&gt;运行结果窗口：&lt;/p&gt;&lt;img alt="图 5：运行结果窗口" src="http://www.ibm.com/developerworks/cn/java/j-lo-ant-eclipse/image005.jpg" width="542" height="153" /&gt; &lt;/li&gt;&lt;/ul&gt;&#xD;
&lt;p&gt;由此可见，如果使用好 Eclipse Ant 编辑器所提供强大的功能的话能大大提高写 Ant 脚本的效率。&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;hr /&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p sizset="95" sizcache="23"&gt;&lt;a name="N1010F"&gt;&lt;span &gt;Ant 中使用 property（属性）文件&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;刚开始写 Ant 的初学者可能会把所有的信息都放在 build.xml 中，下面就是这样的一个例子。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;table border="0" cellspacing="0" cellpadding="0" width="100%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;pre &gt;&amp;lt;project name="testBuild" default="compile" basedir="."&amp;gt; &#xD;
 &amp;lt;target name="init"&amp;gt; &#xD;
	 &amp;lt;mkdir dir="c:/temp/dest/testProj" /&amp;gt; &#xD;
 &amp;lt;/target&amp;gt; &#xD;
 &amp;lt;target name="compile" depends="init"&amp;gt; &#xD;
	 &amp;lt;javac srcdir="c:/temp/src/testProj" destdir="c:/temp/dest/testProj "/&amp;gt; &#xD;
 &amp;lt;echo&amp;gt;Build into c:/temp/dest/testProj, successfully.&amp;lt;/echo&amp;gt; &#xD;
 &amp;lt;/target&amp;gt; &#xD;
 &amp;lt;/project&amp;gt; &#xD;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在上面的例子中，所有的路径信息都是写在 build.xml 中。但是 Ant 脚本可能在不同的机器或者不同的系统上运行，也有可能一些值需要根据环境的不同而变化，在 Ant 中可以把所有这些可能变化的地方都放到一个配置文件中，然后在 Ant 脚本中引用这个配置文件就可以了，针对上面的例子，如下所示：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;table border="0" cellspacing="0" cellpadding="0" width="100%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;pre &gt;&amp;lt;project name="testBuild" default="compile" basedir="."&amp;gt; &#xD;
	 &amp;lt;property file="build.properties"/&amp;gt; &#xD;
	 &amp;lt;target name="init"&amp;gt; &#xD;
		 &amp;lt;mkdir dir="${dest.dir}" /&amp;gt; &#xD;
	 &amp;lt;/target&amp;gt; &#xD;
	 &amp;lt;target name="compile" depends="init"&amp;gt; &#xD;
		 &amp;lt;javac srcdir="${src.dir}" destdir="${dest.dir}"/&amp;gt; &#xD;
		 &amp;lt;echo&amp;gt;Build into ${dest.dir}, successfully.&amp;lt;/echo&amp;gt; &#xD;
	 &amp;lt;/target&amp;gt; &#xD;
 &amp;lt;/project&amp;gt; &#xD;
 build.properties 的内容：&#xD;
 dest.dir=c:/temp/dest/testProj &#xD;
 src.dir=c:/temp/src/testProj &#xD;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;如果想在 Ant 脚本中引用值的话，只需用 $ 符号开头，在一对"{}"中写入要引用的键值。如上例中，需要引用编译的目标路径用"${dest.dir}"。&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;hr /&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p sizset="97" sizcache="23"&gt;&lt;a name="N10125"&gt;&lt;span &gt;使用 Ant 任务从 CVS 中检出（check out）源代码，并编译打包&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Ant 中提供了 cvs 任务（Task）可以从 CVS 服务器中检出资源（注意：在使用 Ant 的 cvs 任务之前，请先将 cvs.exe 下载到你的机器，并且将它添加到你本地的 PATH 环境变量中，然后重新启动 Eclipse。否则在执行下面脚本的时候就会得到 error=2 的错误）。cvs 的可选用属性很多，在这里介绍经常使用到的几个属性。从 CVS 中检出资源一般需要指定：&lt;/p&gt;&#xD;
&lt;ul&gt;&lt;li&gt;CVS 所在的服务器地址：目标 CVS 服务器地址&lt;/li&gt;&lt;li&gt;用户名：登录该 CVS 服务器你指定的用户名&lt;/li&gt;&lt;li&gt;密码：登录该 CVS 服务器需要的密码&lt;/li&gt;&lt;li&gt;库路径（Repository Path）：服务器中的库路径&lt;/li&gt;&lt;li&gt;模块名：当前需要检出的模块名，一般都是以工程的名字作为模块名&lt;/li&gt;&lt;li&gt;标签名：需要从 CVS 中检出哪个标签 &lt;/li&gt;&lt;/ul&gt;&#xD;
&lt;p&gt;在介绍使用 Ant 的 cvs 之前，先说一下本地的目录结构。在 C 盘的 temp 目录下，分别有四个目录，如下所示：&lt;/p&gt;&#xD;
&lt;ul&gt;&lt;li&gt;build 目录：放编译后的类以及资源文件&lt;/li&gt;&lt;li&gt;dist 目录：放生成的 jar 文件或者 war 文件&lt;/li&gt;&lt;li&gt;lib 目录：放在编译过程中需要用到的 jar 文件&lt;/li&gt;&lt;li&gt;src 目录：放从 cvs 中检出的源文件（包括 JSP 等）&lt;br /&gt;&lt;img alt="图 6：src 目录" src="http://www.ibm.com/developerworks/cn/java/j-lo-ant-eclipse/image006.jpg" width="99" height="86" /&gt; &lt;/li&gt;&lt;/ul&gt;&#xD;
&lt;p&gt;在 Ant 中这样写就可以从中检出资源：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;table border="0" cellspacing="0" cellpadding="0" width="100%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;pre &gt;&amp;lt;cvs cvsRoot=":pserver:username:pwd@cvs.server:/home/testPath" &#xD;
 package="TestProj" dest=" c:/temp/src/testProj " failonerror="true" /&amp;gt; &#xD;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这段脚本片断的意思就是从叫"cvs.server"的服务器中，用用户名是 username、密码为 pwd 的用户检出在库路径是 /home/testPath 下的 TestProj 模块（项目），检出后的资源放入本地目录 c:/temp/src/testProj 中。在上面这段脚本中，可以看到有很多值可能会根据不同的环境或者用户随之改变的，比如用户名和密码等；而且从脚本的重复可利用性来说，需要把有些值抽出来放到配置文件中，如服务器的地址和库路径等。因此把这些可能需要更改的地方放到 property 文件中，效果会更好。改完后的完整 Ant 脚本如下所示：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;table border="0" cellspacing="0" cellpadding="0" width="100%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;pre &gt;&amp;lt;?xml version="1.0"?&amp;gt; &#xD;
 &amp;lt;project name="testWeb" default="checkout" basedir="."&amp;gt; &#xD;
	 &amp;lt;target name="checkout"&amp;gt; &#xD;
		 &amp;lt;property file="TestWeb.properties" /&amp;gt; &#xD;
		 &amp;lt;cvs cvsRoot="${cvs.root}" package="${cvs.projectName}" &#xD;
 tag="${cvs.tag}" dest="${src.dir}" failonerror="true" /&amp;gt; &#xD;
	 &amp;lt;/target&amp;gt; &#xD;
 &amp;lt;/project&amp;gt; &#xD;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;对应的 TestWeb.properties 文件内容如下所示：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;table border="0" cellspacing="0" cellpadding="0" width="100%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;pre &gt;base.dir=c:/temp/ &#xD;
 src.dir=${base.dir}/src &#xD;
&#xD;
 cvs.server=cvs.server &#xD;
 cvs.user=username &#xD;
 cvs.pw=pwd &#xD;
 cvs.repositoryPath=/home/testPath &#xD;
 cvs.projectName=TestProj &#xD;
 cvs.root=:pserver:${cvs.user}:${cvs.pw}@${cvs.server}:${cvs.repositoryPath} &#xD;
 cvs.tag= &#xD;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在检出了资源后，需要对其进行编译打包。为了使 Ant 脚本更加具有可读性和灵活性，我们需要对上面的 Ant 脚本进行一些改动。首先将 Ant 脚本中进行分段，如下所示：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;table border="0" cellspacing="0" cellpadding="0" width="100%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;pre &gt;&amp;lt;?xml version="1.0"?&amp;gt; &#xD;
 &amp;lt;project name="testWeb" default="all" basedir="."&amp;gt; &#xD;
	 &amp;lt;target name="all" depends="init,clean,checkout,build"&amp;gt; &#xD;
    &amp;lt;!-- 脚本的入口点 --&amp;gt; &#xD;
	 &amp;lt;/target&amp;gt; &#xD;
	 &amp;lt;target name="init"&amp;gt; &#xD;
    &amp;lt;!-- 做初始化属性文件和设置 classpath 等设置初始条件 --&amp;gt; &#xD;
	 &amp;lt;/target&amp;gt; &#xD;
	 &amp;lt;target name="clean"&amp;gt; &#xD;
     &amp;lt;!-- 删除上一次留下的没用的目录和文件 --&amp;gt; &#xD;
	 &amp;lt;/target&amp;gt; &#xD;
	 &amp;lt;target name="checkout"&amp;gt; 	&#xD;
     &amp;lt;!-- 从 CVS 中检出资源 --&amp;gt; &#xD;
	 &amp;lt;/target&amp;gt; &#xD;
	 &amp;lt;target name="build"&amp;gt; &#xD;
     &amp;lt;!-- 编译源文件并打包到指定的目录 --&amp;gt; &#xD;
	 &amp;lt;/target&amp;gt; &#xD;
 &amp;lt;/project&amp;gt; &#xD;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;上面的脚本中，总共分成了 5 个目标（target），脚本的入口点是"all"，all 按顺序调用 init，clean，checkout，build。其中：&lt;/p&gt;&#xD;
&lt;ul&gt;&lt;li&gt;init 是用来做初始化属性文件和设置 classpath 等设置初始条件的事情&lt;/li&gt;&lt;li&gt;clean 用来删除上一次留下的没用的目录和文件&lt;/li&gt;&lt;li&gt;checkout 已经介绍过了，是用来从 CVS 中检出资源&lt;/li&gt;&lt;li&gt;build 用来编译源文件并打 WAR 包到指定的目录 &lt;/li&gt;&lt;/ul&gt;&#xD;
&lt;p&gt;详细的 Ant 脚本可以参见随本文所附的 TestWeb.xml 和 TestWeb.properties。&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;hr /&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p sizset="99" sizcache="23"&gt;&lt;a name="N1018F"&gt;&lt;span &gt;编译过程与产生不同目标环境的脚本分开执行&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在前面介绍的 Ant 脚本中，根据从 CVS 服务器中检出的资源打成了一个默认的 war 包，并没有考虑根据不同的目标环境来生成不同的包，从下一节开始介绍如何根据不同的环境来生成不同的部署包。&lt;/p&gt;&#xD;
&lt;p&gt;还有一个问题是：为什么需要把从 CVS 中检出资源、编译的过程跟根据目标环境打包的过程分开？&lt;/p&gt;&#xD;
&lt;p&gt;这是因为本身 CVS 检出资源是需要花一定的时间，如果资源比较多这个过程就会花费挺长时间；另外，在多人开发的情况下必须保证在生成不同的部署包的时候是用的是同一套代码生成的，否则会出现各个服务器上运行的版本不一致，如果检出资源、编译的过程跟生成包的脚本一起执行的话就会出现这个问题（比如小 A 在测试服务器测试通过的时候之后，再生成一个在产品环境下的部署包，如果分两次从 CVS 服务器中检出资源的话，在此期间可能会有开发人员往 CVS 服务器中检入代码，导致生成的版本不一致），因此，必须将这两个过程分开执行。现在我们开始建立另外一个 Ant 脚本文件，叫 deploy.xml，专门用来生成包；另外与 deploy.xml 相对应的还有一个 deploy.properties 文件。在 deploy.xml 中会引用 deploy.properties 文件。另外根据在前面的场景中碰到的环境，创建三个不同的属性文件 , develop_deploy.property、test_deploy. property 和 product_deploy. Property，在打包的时候，根据不同的目标环境，将相应属性文件中的内容拷贝至 deploy.properties 文件中（或者也可以直接在 deploy.xml 中直接切换不同的属性文件），然后在 Eclipse 中直接执行 deploy.xml；如果在命令行中，可以用下面的命令来执行：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;table border="0" cellspacing="0" cellpadding="0" width="100%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;pre &gt;ant &amp;#8211; f deploy.xml &#xD;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;hr /&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p sizset="101" sizcache="23"&gt;&lt;a name="N101A1"&gt;&lt;span &gt;解开 WAR 包&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我们首先得建立一个目录（这里是 unpack）用来存放解压后的文件。Ant 中提供了 unzip 命令用来解压 ear/war/jar 包。除了这个目录外，根据不同的目标环境，在运行目录下建立一个与目标环境相对应的目录，重新打好的 war 包就放在这个目录下，比如针对场景中的情况，如果需要创建一个产品环境下的部署包，我们可以建立一个 TestWebProduct 目录，目录名写在配置文件中（${pack.base.dir}）。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;table border="0" cellspacing="0" cellpadding="0" width="100%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;pre &gt;&amp;lt;target name="init"&amp;gt; &#xD;
    &amp;lt;echo&amp;gt;init in deploy&amp;lt;/echo&amp;gt; &#xD;
    &amp;lt;property file="deploy.properties" /&amp;gt; &#xD;
    &amp;lt;delete dir="${unpack.base.dir}" failonerror="false" /&amp;gt; &#xD;
    &amp;lt;delete dir="${pack.base.dir}" failonerror="false" /&amp;gt; &#xD;
    &amp;lt;mkdir dir="${unpack.base.dir}" /&amp;gt; &#xD;
    &amp;lt;mkdir dir="${pack.base.dir}" /&amp;gt; &#xD;
&amp;lt;/target&amp;gt; &#xD;
&#xD;
&amp;lt;target name="unpack"&amp;gt; &#xD;
    &amp;lt;echo&amp;gt;unpack the ${war.name}&amp;lt;/echo&amp;gt; &#xD;
    &amp;lt;copy file="${dest.dir}/${war.name}" todir="${unpack.base.dir}" /&amp;gt;&#xD;
    &amp;lt;unzip src="${unpack.base.dir}/${war.name}" &#xD;
        dest="${unpack.base.dir}/${projectName}" /&amp;gt; &#xD;
    &amp;lt;delete file="${unpack.base.dir}/${war.name}" /&amp;gt; &#xD;
&amp;lt;/target&amp;gt; &#xD;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在 init 段中首先删除掉上次解压的目录和目标打包目录，然后重新建立目录；在 unpack 中，首先将编译好的默认 war 包拷贝至 unpack 定义的目录，解压之后把 unpack 下的 war 包删除。下面是这时候对应的属性文件。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;table border="0" cellspacing="0" cellpadding="0" width="100%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;pre &gt;projectName=MTSWeb &#xD;
 war.name=MTSWeb.war &#xD;
&#xD;
 # 根目录&#xD;
 base.dir=c:/temp &#xD;
 # 默认的 war 包所在的目录&#xD;
 dest.dir=${base.dir}/dist &#xD;
 # 解压后的目录&#xD;
 unpack.base.dir=${base.dir}/unpack &#xD;
 # 目标环境相对应的目录&#xD;
 pack.base.dir=${base.dir}/TestWebProduct &#xD;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;hr /&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p sizset="103" sizcache="23"&gt;&lt;a name="N101B4"&gt;&lt;span &gt;利用 Ant 提供的 filter 任务替换属性值&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;现在根据不同环境的需要，对某些配置文件的值做一些替换。在 Ant 中，提供了 filter 任务，使得替换值很方便。当然也可以使用下面介绍的正则表达式来替换属性值。filter 主要用来在同一行内容中的替换，而正则表达式一下子可以替换多行内容。filter 的使用例子：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;table border="0" cellspacing="0" cellpadding="0" width="100%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;pre &gt;&amp;lt;filter token=" log4j.logger" value="INFO"/&amp;gt; &#xD;
  &amp;lt;copy todir="${dest.dir}" filtering="true"&amp;gt; &#xD;
    &amp;lt;fileset dir="${src.dir}"/&amp;gt; &#xD;
  &amp;lt;/copy&amp;gt; &#xD;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这段脚本的意思就是在 src.dir 目录下的所有文件中，如果有预先定义好的"@log4j.logger@"占位符的话，在拷贝到 dest.dir 目录后，所有的占位符都被替换成了"INFO"。&lt;/p&gt;&#xD;
&lt;p&gt;你也可以将所有被替换的值放到某个属性文件中，filter 任务将属性文件中的每一个条目读出来并且设置成一个 Filter。如下所示：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;table border="0" cellspacing="0" cellpadding="0" width="100%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;pre &gt;&amp;lt;filter filtersfile="deploy_env.properties"/&amp;gt; &#xD;
  &amp;lt;copy todir="${dest.dir}" filtering="true"&amp;gt; &#xD;
    &amp;lt;fileset dir="${src.dir}"/&amp;gt; &#xD;
  &amp;lt;/copy&amp;gt; &#xD;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;上面的脚本表示所有在 deploy_env 中出现的条目将被作为一个 filter，在拷贝到 dest.dir 目录后，所有 src.dir 目录中存在的占位符将被替换成 deploy_env 中的值。具体的例子可以参见随本文附带的 deploy.xml， deploy_env.properties 和 Test.properties。&lt;/p&gt;&#xD;
&lt;p&gt;其中 deploy.xml 是 ant 脚本，deploy_env.properties 中包含所有要替换的值，在 Test.properties 中是包含有占位符的资源文件。&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;hr /&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p sizset="105" sizcache="23"&gt;&lt;a name="N101D0"&gt;&lt;span &gt;利用正则表达式替换属性值&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Ant 中支持多种正则表达式，在运行 Ant 的时候用哪种正则表达式可以通过设置 ant.regexp.regexpimpl 的值来切换，Ant 支持的的正则表达式有：&lt;/p&gt;&#xD;
&lt;ul&gt;&lt;li&gt;java.util.regex package of JDK 1.4&lt;/li&gt;&lt;li&gt;jakarta-regexp&lt;/li&gt;&lt;li&gt;installation dependencies &lt;/li&gt;&lt;/ul&gt;&#xD;
&lt;p&gt;正则表达式的例子：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;table border="0" cellspacing="0" cellpadding="0" width="100%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;pre &gt;&amp;lt;replaceregexp byline="true"&amp;gt; &#xD;
 &amp;lt;regexp pattern="正则表达式"/&amp;gt; &#xD;
 &amp;lt;substitution expression="将要替换的值"/&amp;gt; &#xD;
 &amp;lt;fileset dir="${unpack.war.dir}/WEB-INF" includes="web.xml"/&amp;gt; &#xD;
 &amp;lt;/replaceregexp&amp;gt; &#xD;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;byline 属性用来确认被替换的时候是一次替换一行还是多行；pattern 属性用来指明正则表达式；substitution expression 中是替换的值，替换的值都定义在相对应的配置文件中；fileset 属性中的 dir 用来指定被替换文件所在的目录，includes 用来指定要替换哪个文件。需要注意的是，如果在正则表达式或者替换的值中出现"&amp;lt;"的话，需要用转义符"&amp;lt;"。&lt;/p&gt;&#xD;
&lt;p&gt;在 Eclipse3.1 中已经内置了对正则表达式的支持；但是如果你在命令行中运行需要正则表达式支持的脚本的话，则需要自己将正则表达式的包下载下来加到 classpath 中。在随文章的 deploy.xml 中提供了一个简单的替换属性文件的值的例子。正则表达式的例子可以在本文所带的 deploy.xml 中找到。&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;hr /&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p sizset="107" sizcache="23"&gt;&lt;a name="N101F1"&gt;&lt;span &gt;Ant 使用条件表达式，根据属性值删除不需要的文件&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在生成部署包的时候，还有可能会根据目标环境的不同，删除一些不同的文件。比如在产品环境中那些作为测试需要的代码往往需要删除，但是测试环境中并不需要。因此就需要条件表达式来做判断。如下所示：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;table border="0" cellspacing="0" cellpadding="0" width="100%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;pre &gt;&amp;lt;target name="checkTestEnv"&amp;gt; &#xD;
	 &amp;lt;condition property="isTestEnv"&amp;gt; &#xD;
		 &amp;lt;istrue value="${deploy.isTestEnv}" /&amp;gt; &#xD;
	 &amp;lt;/condition&amp;gt; &#xD;
	 &amp;lt;antcall target="trueCondition" /&amp;gt; &#xD;
	 &amp;lt;antcall target="falseCondition" /&amp;gt; &#xD;
 &amp;lt;/target&amp;gt; &#xD;
 &amp;lt;target name="trueCondition" if="isTestEnv"&amp;gt; &#xD;
	 &amp;lt;echo message="true condition in ${projectName}" /&amp;gt; &#xD;
 &amp;lt;/target&amp;gt; &#xD;
 &amp;lt;target name="falseCondition" unless="isTestEnv"&amp;gt; &#xD;
	 &amp;lt;echo message="false condition in ${projectName}" /&amp;gt; &#xD;
 &amp;lt;/target&amp;gt; &#xD;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p sizset="108" sizcache="23"&gt;在上面的例子中，先读出 ${deploy.isTestEnv} 的值（在配置文件 deloy.properties 中），根据读出的值对属性 isTestEnv 设值，如果 ${deploy.isTestEnv} 的值是 true，isTestEnv 的值也是 true；否则是 false。然后分别调用目标段 trueCondition 和 falseCondition。在这里，表达式值的判断是用"istrue"，在 Ant 中还提供了很多别的表达式，比如 not/and/or，equals 等等，具体关于条件表达式的信息可以参考：http://ant.apache.org/manual/CoreTasks/condition.html，该页也可以在随下载下来的文档中找到。&lt;/p&gt;&#xD;
&lt;p&gt;在段 trueCondition 中，判断 isTestEnv，如果是真的话就运行，否则不运行；在段 falseCondition 中，也判断 isTestEnv，如果是假就运行，否则不运行，在段中可以根据情况做相应的事情。条件判断式的例子可以在本文的 deploy.xml 中找到。&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;hr /&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p sizset="110" sizcache="23"&gt;&lt;a name="N10208"&gt;&lt;span &gt;重新打包，并拷贝到不同的目录&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在上面的替换过程完成后，调用 war 将 unpack 目录下的内容重新打包。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;table border="0" cellspacing="0" cellpadding="0" width="100%"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;pre &gt;&amp;lt;target name="repack"&amp;gt; &#xD;
	 &amp;lt;war destfile="${pack.base.dir}/${projectName}.war" &#xD;
		 basedir="${unpack.base.dir}/${projectName}"&#xD;
		 webxml="${unpack.base.dir}/${projectName}/WEB-INF/web.xml" &#xD;
		 manifest="${unpack.base.dir}/${projectName}/META-INF/MANIFEST.MF"&amp;gt; &#xD;
	 &amp;lt;/war&amp;gt; &#xD;
 &amp;lt;/target&amp;gt; &#xD;
&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;详细的例子可以参见随本文的附件 deploy.xml 和 deploy.properties。&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;hr /&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p sizset="112" sizcache="23"&gt;&lt;a name="N10217"&gt;&lt;span &gt;结论&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;通过本文可以看出编写好有效的 Ant 脚本能很好的解决在编译部署包的时候出现的问题，将那些变化的内容放到配置文件中，在部署的时候切换不同的配置文件就可以实现生成不同的部署包。文中也介绍了如何使用 Eclipse 来提高你编写 / 调试 Ant 脚本的效率。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;!-- CMA ID: 125193 --&gt;&lt;!-- Site ID: 10 --&gt;&lt;!-- XSLT stylesheet used to transform this file: dw-document-html-6.0.xsl --&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/freeliver54/aggbug/2342671.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/freeliver54/archive/2012/02/08/2342671.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/freeliver54/archive/2012/02/08/2342605.html</id><title type="text">[转]Eclipse之ANT使用</title><summary type="text">本文转自：http://abc.zxj-001.blog.163.com/blog/static/25693412010101611444230/Ant是Java平台下非常棒的批处理命令执行程序，能非常方便地自动完成编译，测试，打包，部署等等一系列任务，大大提高开发效率。如果你现在还没有开始使用Ant，那就要赶快开始学习使用，使自己的开发水平上一个新台阶。 Eclipse中已经集成了Ant，我们可以直接在Eclipse中运行Ant。 以前面建立的Hello工程为例，创建以下目录结构： 新建一个build.xml，放在工程根目录下。build.xml定义了Ant要执行的批处理命令。虽然An...</summary><published>2012-02-08T05:57:00Z</published><updated>2012-02-08T05:57:00Z</updated><author><name>freeliver54</name><uri>http://www.cnblogs.com/freeliver54/</uri></author><link rel="alternate" href="http://www.cnblogs.com/freeliver54/archive/2012/02/08/2342605.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/freeliver54/archive/2012/02/08/2342605.html"/><content type="html">&lt;p&gt;本文转自：&lt;a href="http://abc.zxj-001.blog.163.com/blog/static/25693412010101611444230/" target="_blank"&gt;http://abc.zxj-001.blog.163.com/blog/static/25693412010101611444230/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Ant是Java平台下非常棒的批处理命令执行程序，能非常方便地自动完成编译，测试，打包，部署等等一系列任务，大大提高开发效率。如果你现在还没有开始使用Ant，那就要赶快开始学习使用，使自己的开发水平上一个新台阶。&lt;br /&gt;&lt;br /&gt;　　Eclipse中已经集成了Ant，我们可以直接在Eclipse中运行Ant。&lt;br /&gt;&lt;br /&gt;　　以前面建立的Hello工程为例，创建以下目录结构：&lt;br /&gt;&lt;br /&gt;&#xD;
&lt;table border="0" width="90%" align="center"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;&#xD;
&lt;div align="center"&gt;&lt;img border="1" hspace="3" alt="Eclipse之ANT使用 - 小jar - 旭日耀阳" vspace="1" align="middle" src="http://www.yesky.com/image20010518/208897.jpg" __1328680381923__="ev_9674144139" /&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;　　新建一个build.xml，放在工程根目录下。build.xml定义了Ant要执行的批处理命令。虽然Ant也可以使用其它文件名，但是遵循标准能更使开发更规范，同时易于与别人交流。&lt;br /&gt;&lt;br /&gt;　　通常，src存放Java源文件，classes存放编译后的class文件，lib存放编译和运行用到的所有jar文件，web存放JSP等web文件，dist存放打包后的jar文件，doc存放API文档。&lt;br /&gt;&lt;br /&gt;　　然后在根目录下创建build.xml文件，输入以下内容： &lt;br /&gt;&lt;br /&gt;&#xD;
&lt;table style="width: 541px; height: 1452px" border="1" bordercolor="#ffcc66" width="541" bgcolor="#d9ecee" align="center"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;＜?xml version="1.0"?＞&lt;br /&gt;＜project name="Hello world" default="doc"＞&lt;br /&gt;&lt;br /&gt;＜!-- properies --＞&lt;br /&gt;＜property name="src.dir" value="src" /＞&lt;br /&gt;＜property name="report.dir" value="report" /＞&lt;br /&gt;＜property name="classes.dir" value="classes" /＞&lt;br /&gt;＜property name="lib.dir" value="lib" /＞&lt;br /&gt;＜property name="dist.dir" value="dist" /＞&lt;br /&gt;＜property name="doc.dir" value="doc"/＞&lt;br /&gt;&lt;br /&gt;＜!-- 定义classpath --＞&lt;br /&gt;＜path id="master-classpath"＞&lt;br /&gt;＜fileset file="${lib.dir}/*.jar" /＞&lt;br /&gt;＜pathelement path="${classes.dir}"/＞&lt;br /&gt;＜/path＞&lt;br /&gt;&lt;br /&gt;＜!-- 初始化任务 --＞&lt;br /&gt;＜target name="init"＞&lt;br /&gt;＜/target＞&lt;br /&gt;&lt;br /&gt;＜!-- 编译 --＞&lt;br /&gt;＜target name="compile" depends="init" description="compile the source files"＞&lt;br /&gt;＜mkdir dir="${classes.dir}"/＞&lt;br /&gt;＜javac srcdir="${src.dir}" destdir="${classes.dir}" target="1.4"＞&lt;br /&gt;＜classpath refid="master-classpath"/＞&lt;br /&gt;＜/javac＞&lt;br /&gt;＜/target＞&lt;br /&gt;&lt;br /&gt;＜!-- 测试 --＞&lt;br /&gt;＜target name="test" depends="compile" description="run junit test"＞&lt;br /&gt;＜mkdir dir="${report.dir}"/＞&lt;br /&gt;＜junit printsummary="on"&lt;br /&gt;haltonfailure="false"&lt;br /&gt;failureproperty="tests.failed"&lt;br /&gt;showoutput="true"＞&lt;br /&gt;＜classpath refid="master-classpath" /＞&lt;br /&gt;＜formatter type="plain"/＞&lt;br /&gt;＜batchtest todir="${report.dir}"＞&lt;br /&gt;＜fileset dir="${classes.dir}"＞&lt;br /&gt;＜include name="**/*Test.*"/＞&lt;br /&gt;＜/fileset＞&lt;br /&gt;＜/batchtest＞&lt;br /&gt;＜/junit＞&lt;br /&gt;＜fail if="tests.failed"＞&lt;br /&gt;***********************************************************&lt;br /&gt;**** One or more tests failed! Check the output ... ****&lt;br /&gt;***********************************************************&lt;br /&gt;＜/fail＞&lt;br /&gt;＜/target＞&lt;br /&gt;&lt;br /&gt;＜!-- 打包成jar --＞&lt;br /&gt;＜target name="pack" depends="test" description="make .jar file"＞&lt;br /&gt;＜mkdir dir="${dist.dir}" /＞&lt;br /&gt;＜jar destfile="${dist.dir}/hello.jar" basedir="${classes.dir}"＞&lt;br /&gt;＜exclude name="**/*Test.*" /＞&lt;br /&gt;＜exclude name="**/Test*.*" /＞&lt;br /&gt;＜/jar＞&lt;br /&gt;＜/target＞&lt;br /&gt;&lt;br /&gt;＜!-- 输出api文档 --＞&lt;br /&gt;＜target name="doc" depends="pack" description="create api doc"＞&lt;br /&gt;＜mkdir dir="${doc.dir}" /＞&lt;br /&gt;＜javadoc destdir="${doc.dir}"&lt;br /&gt;author="true"&lt;br /&gt;version="true"&lt;br /&gt;use="true"&lt;br /&gt;windowtitle="Test API"＞&lt;br /&gt;＜packageset dir="${src.dir}" defaultexcludes="yes"＞&lt;br /&gt;＜include name="example/**" /＞&lt;br /&gt;＜/packageset＞&lt;br /&gt;＜doctitle＞＜![CDATA[＜h1＞Hello, test＜/h1＞]]＞＜/doctitle＞&lt;br /&gt;＜bottom＞＜![CDATA[＜i＞All Rights Reserved.＜/i＞]]＞＜/bottom＞&lt;br /&gt;＜tag name="todo" scope="all" description="To do:" /＞&lt;br /&gt;＜/javadoc＞&lt;br /&gt;＜/target＞&lt;br /&gt;＜/project＞&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;　　以上xml依次定义了init（初始化），compile（编译），test（测试），doc（生成文档），pack（打包）任务，可以作为模板。&lt;br /&gt;&lt;br /&gt;　　选中Hello工程，然后选择&amp;#8220;Project&amp;#8221;，&amp;#8220;Properties&amp;#8221;，&amp;#8220;Builders&amp;#8221;，&amp;#8220;New&amp;#8230;&amp;#8221;，选择&amp;#8220;Ant Build&amp;#8221;：&lt;br /&gt;&lt;br /&gt;&#xD;
&lt;table border="0" width="90%" align="center"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;&#xD;
&lt;div align="center"&gt;&lt;img style="width: 564px; height: 533px" border="1" hspace="3" alt="Eclipse之ANT使用 - 小jar - 旭日耀阳" vspace="1" align="middle" src="http://www.yesky.com/image20010518/208898.jpg" width="602" height="546" __1328680381923__="ev_1671769444" /&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;　　填入Name：Ant_Builder；Buildfile：build.xml；Base Directory：${workspace_loc:/Hello}（按&amp;#8220;Browse Workspace&amp;#8221;选择工程根目录），由于用到了junit.jar包，搜索Eclipse目录，找到junit.jar，把它复制到Hello/lib目录下，并添加到Ant的Classpath中：&lt;br /&gt;&lt;br /&gt;&#xD;
&lt;table border="0" width="90%" align="center"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;&#xD;
&lt;div align="center"&gt;&lt;img border="1" hspace="3" alt="Eclipse之ANT使用 - 小jar - 旭日耀阳" vspace="1" align="middle" src="http://www.yesky.com/image20010518/208899.jpg" __1328680381923__="ev_8770255358" /&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;　　然后在Builder面板中钩上Ant_Build，去掉Java Builder：&lt;br /&gt;&lt;br /&gt;&#xD;
&lt;table border="0" width="90%" align="center"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;&#xD;
&lt;div align="center"&gt;&lt;img border="1" hspace="3" alt="Eclipse之ANT使用 - 小jar - 旭日耀阳" vspace="1" align="middle" src="http://www.yesky.com/image20010518/208900.jpg" __1328680381923__="ev_5404637906" /&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;　　再次编译，即可在控制台看到Ant的输出：&lt;br /&gt;&lt;br /&gt;&#xD;
&lt;table style="width: 571px; height: 644px" border="1" bordercolor="#ffcc66" width="571" bgcolor="#d9ecee" align="center"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td&gt;Buildfile: F:\eclipse-projects\Hello\build.xml&lt;br /&gt;&lt;br /&gt;init:&lt;br /&gt;&lt;br /&gt;compile:&lt;br /&gt;[mkdir] Created dir: F:\eclipse-projects\Hello\classes&lt;br /&gt;[javac] Compiling 2 source files to F:\eclipse-projects\Hello\classes&lt;br /&gt;&lt;br /&gt;test:&lt;br /&gt;[mkdir] Created dir: F:\eclipse-projects\Hello\report&lt;br /&gt;[junit] Running example.HelloTest&lt;br /&gt;[junit] Tests run: 1, Failures: 0, Errors: 0, Time elapsed: 0.02 sec&lt;br /&gt;&lt;br /&gt;pack:&lt;br /&gt;[mkdir] Created dir: F:\eclipse-projects\Hello\dist&lt;br /&gt;[jar] Building jar: F:\eclipse-projects\Hello\dist\hello.jar&lt;br /&gt;&lt;br /&gt;doc:&lt;br /&gt;[mkdir] Created dir: F:\eclipse-projects\Hello\doc&lt;br /&gt;[javadoc] Generating Javadoc&lt;br /&gt;[javadoc] Javadoc execution&lt;br /&gt;[javadoc] Loading source files for package example...&lt;br /&gt;[javadoc] Constructing Javadoc information...&lt;br /&gt;[javadoc] Standard Doclet version 1.4.2_04&lt;br /&gt;[javadoc] Building tree for all the packages and classes...&lt;br /&gt;[javadoc] Building index for all the packages and classes...&lt;br /&gt;[javadoc] Building index for all classes...&lt;br /&gt;[javadoc] Generating F:\eclipse-projects\Hello\doc\stylesheet.css...&lt;br /&gt;[javadoc] Note: Custom tags that could override future standard tags: @todo. To avoid potential overrides, use at least one period character (.) in custom tag names.&lt;br /&gt;[javadoc] Note: Custom tags that were not seen: @todo&lt;br /&gt;BUILD SUCCESSFUL&lt;br /&gt;Total time: 11 seconds&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;　　Ant依次执行初始化，编译，测试，打包，生成API文档一系列任务，极大地提高了开发效率。将来开发J2EE项目时，还可加入部署等任务。并且，即使脱离了Eclipse环境，只要正确安装了Ant，配置好环境变量ANT_HOME=＜Ant解压目录＞，Path=&amp;#8230;;%ANT_HOME%\bin，在命令行提示符下切换到Hello目录，简单地键入ant即可&lt;/p&gt;&lt;img src="http://www.cnblogs.com/freeliver54/aggbug/2342605.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/freeliver54/archive/2012/02/08/2342605.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/freeliver54/archive/2012/02/08/2342405.html</id><title type="text">[转]搭建Windows下Java Web开发环境</title><summary type="text">本文转自：http://hi.baidu.com/surgeon/blog/item/26e4e2fee117a2365c60082e.html概要 1．SSH开发相关软件及开发包下载2．软件安装及相关设置3．最简单的Web程序1.软件下载 在Ｄ盘建一个目录JavaTools，用来存放下载的软件和开发包。（本教程将使用D盘，你也可以使用C盘或E盘）。下载软件的原则，有Zip版的不下载exe版的。1）JDK：JDK 6 Update 7 Windows版 下载页面：http://java.sun.com/javase/downloads/index.jsp 下载链接：https://cds.su</summary><published>2012-02-08T03:19:00Z</published><updated>2012-02-08T03:19:00Z</updated><author><name>freeliver54</name><uri>http://www.cnblogs.com/freeliver54/</uri></author><link rel="alternate" href="http://www.cnblogs.com/freeliver54/archive/2012/02/08/2342405.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/freeliver54/archive/2012/02/08/2342405.html"/><content type="html">&lt;p&gt;&lt;font style="background-color: #c7edcc"&gt;本文转自：&lt;a href="http://hi.baidu.com/surgeon/blog/item/26e4e2fee117a2365c60082e.html" target="_blank"&gt;http://hi.baidu.com/surgeon/blog/item/26e4e2fee117a2365c60082e.html&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font style="background-color: #c7edcc"&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;div id="blog_text" &gt;&lt;span style="font-weight: bold"&gt;概要&lt;/span&gt; &lt;br /&gt;1．SSH开发相关软件及开发包下载&lt;br /&gt;2．软件安装及相关设置&lt;br /&gt;3．最简单的Web程序&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold"&gt;1.软件下载&lt;/span&gt; &lt;br /&gt;在Ｄ盘建一个目录JavaTools，用来存放下载的软件和开发包。（本教程将使用D盘，你也可以使用C盘或E盘）。下载软件的原则，有Zip版的不下载exe版的。&lt;br /&gt;1）&lt;span style="font-weight: bold"&gt;JDK：JDK 6 Update 7 Windows版&lt;/span&gt; &lt;br /&gt;下载页面：&lt;a href="http://java.sun.com/javase/downloads/index.jsp"&gt;&lt;font color="#703f3a"&gt;http://java.sun.com/javase/downloads/index.jsp&lt;/font&gt;&lt;/a&gt; &lt;br /&gt;下载链接：&lt;br /&gt;&lt;a href="https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/ViewFilteredProducts-SingleVariationTypeFilter;pgid=yYdgaHqkkjVSR0EUPIQsoQ3D0000o_tQgoGy;sid=AeftgEasIkTtgQ4qZlGlhakFzl2YCYvpVAUiQVuyc5IGAw=="&gt;&lt;font color="#703f3a"&gt;https://cds.sun.com/is-bin/INTERSHOP.enfinity/WFS/CDS-CDS_Developer-Site/en_US/-/USD/ViewFilteredProducts-SingleVariationTypeFilter;pgid=yYdgaHqkkjVSR0EUPIQsoQ3D0000o_tQgoGy;sid=AeftgEasIkTtgQ4qZlGlhakFzl2YCYvpVAUiQVuyc5IGAw==&lt;/font&gt;&lt;/a&gt; &lt;br /&gt;更多信息：http://java.sun.com&lt;br /&gt;2）IDE：&lt;span style="font-weight: bold"&gt;Eclipse IDE for Java EE Developers&lt;/span&gt; &lt;br /&gt;下载页面：&lt;br /&gt;&lt;a href="http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/ganymede/R/eclipse-jee-ganymede-win32.zip"&gt;&lt;font color="#703f3a"&gt;http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/ganymede/R/eclipse-jee-ganymede-win32.zip&lt;/font&gt;&lt;/a&gt; &lt;br /&gt;下载链接：&lt;br /&gt;&lt;a href="http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/ganymede/R/eclipse-jee-ganymede-win32.zip&amp;amp;url=http://download.actuatechina.com/eclipse/technology/epp/downloads/release/ganymede/R/eclipse-jee-ganymede-win32.zip&amp;amp;mirror_id=385"&gt;&lt;font color="#703f3a"&gt;http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/ganymede/R/eclipse-jee-ganymede-win32.zip&amp;amp;url=http://download.actuatechina.com/eclipse/technology/epp/downloads/release/ganymede/R/eclipse-jee-ganymede-win32.zip&amp;amp;mirror_id=385&lt;/font&gt;&lt;/a&gt; &lt;br /&gt;更多信息：http://www.eclipse.org/&lt;br /&gt;3）Web Server：&lt;span style="font-weight: bold"&gt;Tomcat 6.0.16&lt;/span&gt; &lt;br /&gt;下载页面：&lt;br /&gt;&lt;a href="http://tomcat.apache.org/download-60.cgi"&gt;&lt;font color="#703f3a"&gt;http://tomcat.apache.org/download-60.cgi&lt;/font&gt;&lt;/a&gt; &lt;br /&gt;下载链接：&lt;br /&gt;&lt;a href="http://www.meisei-u.ac.jp/mirror/apache/dist/tomcat/tomcat-6/v6.0.16/bin/apache-tomcat-6.0.16.zip"&gt;&lt;font color="#703f3a"&gt;http://www.meisei-u.ac.jp/mirror/apache/dist/tomcat/tomcat-6/v6.0.16/bin/apache-tomcat-6.0.16.zip&lt;/font&gt;&lt;/a&gt; &lt;br /&gt;更多信息：&lt;br /&gt;&lt;a href="http://tomcat.apache.org/" target="_blank"&gt;&lt;font color="#703f3a"&gt;http://tomcat.apache.org/&lt;/font&gt;&lt;/a&gt;&lt;br /&gt;4）Database：&lt;span style="font-weight: bold"&gt;MySQL-5.0 Without installer&lt;/span&gt; &lt;br /&gt;下载页面：&lt;br /&gt;&lt;a href="http://dev.mysql.com/downloads/mysql/5.0.html#win32"&gt;&lt;font color="#703f3a"&gt;http://dev.mysql.com/downloads/mysql/5.0.html#win32&lt;/font&gt;&lt;/a&gt; &lt;br /&gt;下载链接：&lt;br /&gt;&lt;a href="http://dev.mysql.com/get/Downloads/MySQL-5.0/mysql-noinstall-5.0.51b-win32.zip/from/pick#mirrors"&gt;&lt;font color="#703f3a"&gt;http://dev.mysql.com/get/Downloads/MySQL-5.0/mysql-noinstall-5.0.51b-win32.zip/from/pick#mirrors&lt;/font&gt;&lt;/a&gt; &lt;br /&gt;更多信息：&lt;br /&gt;&lt;a href="http://dev.mysql.com/" target="_blank"&gt;&lt;font color="#703f3a"&gt;http://dev.mysql.com/&lt;/font&gt;&lt;/a&gt;&lt;br /&gt;5）&lt;span style="font-weight: bold"&gt;Database GUI客户端&lt;/span&gt; &lt;br /&gt;下载页面：&lt;br /&gt;&lt;a href="http://dev.mysql.com/downloads/gui-tools/5.0.html"&gt;&lt;font color="#703f3a"&gt;http://dev.mysql.com/downloads/gui-tools/5.0.html&lt;/font&gt;&lt;/a&gt; &lt;br /&gt;下载链接：&lt;br /&gt;&lt;a href="http://dev.mysql.com/get/Downloads/MySQLGUITools/mysql-gui-tools-noinstall-5.0-r12-win32.zip/from/pick#mirrors"&gt;&lt;font color="#703f3a"&gt;http://dev.mysql.com/get/Downloads/MySQLGUITools/mysql-gui-tools-noinstall-5.0-r12-win32.zip/from/pick#mirrors&lt;/font&gt;&lt;/a&gt; &lt;br /&gt;6）Eclipse插件&lt;br /&gt;6.1) &lt;span style="font-weight: bold"&gt;Sysdeo Eclipse Tomcat Launcher plugin&lt;/span&gt; &lt;br /&gt;下载链接：&lt;br /&gt;&lt;a href="http://www.eclipsetotale.com/tomcatPlugin/tomcatPluginV321.zip"&gt;&lt;font color="#703f3a"&gt;http://www.eclipsetotale.com/tomcatPlugin/tomcatPluginV321.zip&lt;/font&gt;&lt;/a&gt; &lt;br /&gt;更多信息：&lt;br /&gt;&lt;a href="http://www.eclipsetotale.com/tomcatPlugin.html" target="_blank"&gt;&lt;font color="#703f3a"&gt;http://www.eclipsetotale.com/tomcatPlugin.html&lt;/font&gt;&lt;/a&gt;&lt;br /&gt;7）&lt;span style="font-weight: bold"&gt;开发包&lt;/span&gt; &lt;br /&gt;7.1）&lt;span style="font-weight: bold"&gt;Struts 2.1.2&lt;/span&gt; &lt;br /&gt;下载链接：&lt;br /&gt;&lt;a href="http://www.meisei-u.ac.jp/mirror/apache/dist/struts/binaries/struts-2.1.2-all.zip"&gt;&lt;font color="#703f3a"&gt;http://www.meisei-u.ac.jp/mirror/apache/dist/struts/binaries/struts-2.1.2-all.zip&lt;/font&gt;&lt;/a&gt; &lt;br /&gt;下载页面：&lt;br /&gt;&lt;a href="http://struts.apache.org/download.cgi#struts212"&gt;&lt;font color="#703f3a"&gt;http://struts.apache.org/download.cgi#struts212&lt;/font&gt;&lt;/a&gt; &lt;br /&gt;更多信息：&lt;br /&gt;&lt;a href="http://struts.apache.org/" target="_blank"&gt;&lt;font color="#703f3a"&gt;http://struts.apache.org/&lt;/font&gt;&lt;/a&gt;&lt;br /&gt;7.2）&lt;span style="font-weight: bold"&gt;Spring Framework 2.5.5&lt;/span&gt; &lt;br /&gt;下载链接：&lt;br /&gt;&lt;a href="http://downloads.sourceforge.net/springframework/spring-framework-2.5.5-with-dependencies.zip?modtime=1214221252&amp;amp;big_mirror=0"&gt;&lt;font color="#703f3a"&gt;http://downloads.sourceforge.net/springframework/spring-framework-2.5.5-with-dependencies.zip?modtime=1214221252&amp;amp;big_mirror=0&lt;/font&gt;&lt;/a&gt; &lt;br /&gt;下载页面：&lt;br /&gt;&lt;a href="http://www.springframework.org/download"&gt;&lt;font color="#703f3a"&gt;http://www.springframework.org/download&lt;/font&gt;&lt;/a&gt; &lt;br /&gt;更多信息：&lt;br /&gt;&lt;a href="http://www.springframework.org/" target="_blank"&gt;&lt;font color="#703f3a"&gt;http://www.springframework.org/&lt;/font&gt;&lt;/a&gt;&lt;br /&gt;7.3) &lt;span style="font-weight: bold"&gt;Hibernate&lt;/span&gt; &lt;br /&gt;下载页面：http://www.hibernate.org/6.html&lt;br /&gt;Hibernate Core 3.2.6 GA&lt;br /&gt;下载链接：&lt;br /&gt;&lt;a href="http://sourceforge.net/project/showfiles.php?group_id=40712&amp;amp;package_id=127784&amp;amp;release_id=574498"&gt;&lt;font color="#703f3a"&gt;http://sourceforge.net/project/showfiles.php?group_id=40712&amp;amp;package_id=127784&amp;amp;release_id=574498&lt;/font&gt;&lt;/a&gt; &lt;br /&gt;Hibernate Annotations 3.3.1 GA&lt;br /&gt;下载链接：&lt;br /&gt;&lt;a href="http://sourceforge.net/project/showfiles.php?group_id=40712&amp;amp;package_id=139933"&gt;&lt;font color="#703f3a"&gt;http://sourceforge.net/project/showfiles.php?group_id=40712&amp;amp;package_id=139933&lt;/font&gt;&lt;/a&gt; &lt;br /&gt;Hibernate Tools3.2.2 Beta&lt;br /&gt;下载链接：&lt;br /&gt;&lt;a href="http://sourceforge.net/project/downloading.php?groupname=jboss&amp;amp;filename=HibernateTools-3.2.2.Beta1.zip&amp;amp;use_mirror=osdn"&gt;&lt;font color="#703f3a"&gt;http://sourceforge.net/project/downloading.php?groupname=jboss&amp;amp;filename=HibernateTools-3.2.2.Beta1.zip&amp;amp;use_mirror=osdn&lt;/font&gt;&lt;/a&gt; &lt;br /&gt;Hibernate Validator 3.0.0 GA&lt;br /&gt;下载链接：&lt;br /&gt;&lt;a href="http://sourceforge.net/project/showfiles.php?group_id=40712&amp;amp;package_id=225206"&gt;&lt;font color="#703f3a"&gt;http://sourceforge.net/project/showfiles.php?group_id=40712&amp;amp;package_id=225206&lt;/font&gt;&lt;/a&gt; &lt;br /&gt;7.4) &lt;span style="font-weight: bold"&gt;FreeMarker 2.3.13&lt;/span&gt; &lt;br /&gt;下载链接：&lt;br /&gt;&lt;a href="http://prdownloads.sourceforge.net/freemarker/freemarker-2.3.13.tar.gz"&gt;&lt;font color="#703f3a"&gt;http://prdownloads.sourceforge.net/freemarker/freemarker-2.3.13.tar.gz&lt;/font&gt;&lt;/a&gt; &lt;br /&gt;更多信息：&lt;br /&gt;&lt;a href="http://www.freemarker.org/" target="_blank"&gt;&lt;font color="#703f3a"&gt;http://www.freemarker.org/&lt;/font&gt;&lt;/a&gt;&lt;br /&gt;下载后的JavaTools的内容如下：&lt;br /&gt;D:\JavaTools\apache-tomcat-6.0.16.zip&lt;br /&gt;D:\JavaTools\eclipse-jee-ganymede-win32.zip&lt;br /&gt;D:\JavaTools\freemarker-2.3.13.tar.gz&lt;br /&gt;D:\JavaTools\hibernate-3.2.6.ga.zip&lt;br /&gt;D:\JavaTools\hibernate-annotations-3.3.1.GA.zip&lt;br /&gt;D:\JavaTools\HibernateTools-3.2.2.Beta1.zip&lt;br /&gt;D:\JavaTools\hibernate-validator-3.0.0.GA.zip&lt;br /&gt;D:\JavaTools\jdk-6u7-windows-i586-p.exe&lt;br /&gt;D:\JavaTools\mysql-gui-tools-noinstall-5.0-r12-win32.zip&lt;br /&gt;D:\JavaTools\mysql-noinstall-5.0.51b-win32.zip&lt;br /&gt;D:\JavaTools\spring-framework-2.5.5-with-dependencies.zip&lt;br /&gt;D:\JavaTools\struts-2.1.2-all.zip&lt;br /&gt;D:\JavaTools\tomcatPluginV321.zip&lt;br /&gt;（注：其它的软件和开发包在开发中用到时再下载，如jQuery）&lt;br /&gt;&lt;span style="font-weight: bold"&gt;2.安装设置&lt;/span&gt; &lt;br /&gt;1）&lt;span style="font-weight: bold"&gt;安装JDK&lt;/span&gt; &lt;br /&gt;双击jdk-6u7-windows-i586-p.exe安装JDK&lt;br /&gt;不安装公共JRE和JavaDB，安装到D:\，如图示。&lt;br /&gt;&lt;img alt="open_img('attachments/200807/7569184466.png')" src="http://www.albertsong.com/attachments/200807/7569184466.png" width="500" height="382" /&gt; &lt;br /&gt;安装完成后，在Window环境变量的系统变量中添加JAVA_HOME，其值为D:\jdk1.6.0_07，在Path环境变量的前面加上%JAVA_HOME%\bin;（分号不要掉了）。&lt;br /&gt;2）&lt;span style="font-weight: bold"&gt;安装Eclipse&lt;/span&gt; &lt;br /&gt;将D:\JavaTools\eclipse-jee-ganymede-win32.zip解压到D:\eclipse，改名为D:\eclipse3.4.0。&lt;br /&gt;右键单击D:\eclipse3.4.0\eclipse.exe，发送到桌面一个快捷方式，将快捷方式改名为eclipse3.4.0.exe。&lt;br /&gt;将D: \JavaTools\tomcatPluginV321.zip解压到D:\JavaTools\tomcatPluginV321\，将里面的 com.sysdeo.eclipse.tomcat_3.2.1目录及内容复制到D:\eclipse3.4.0\dropins目录下。&lt;br /&gt;启动Eclipse，注意将workspace设置到eclipse3.4.0目录下，并设为默认。见下图。&lt;br /&gt;&lt;img alt="open_img('attachments/200807/1311829220.png')" src="http://www.albertsong.com/attachments/200807/1311829220.png" width="500" height="182" /&gt; &lt;br /&gt;&lt;img alt="open_img('attachments/200807/3999560475.png')" src="http://www.albertsong.com/attachments/200807/3999560475.png" width="500" height="182" /&gt; &lt;br /&gt;&lt;br /&gt;如果正常，进去后在工具条上会看到&lt;br /&gt;&lt;img alt="open_img('attachments/200807/0967659776.png')" src="http://www.albertsong.com/attachments/200807/0967659776.png" width="69" height="22" /&gt; &lt;br /&gt;退出Eclipse。&lt;br /&gt;3）&lt;span style="font-weight: bold"&gt;安装Tomcat&lt;/span&gt; &lt;br /&gt;将D:\JavaTools\apache-tomcat-6.0.16.zip解压到D:\apache-tomcat-6.0.16，改名为D:\tomcat-6.0.16。&lt;br /&gt;执行D:\tomcat-6.0.16\bin\startup.bat启动Tomcat。&lt;br /&gt;在浏览器中查看http://localhost:8080/&lt;br /&gt;正常的话可以看到Tomcat的页面。&lt;br /&gt;关闭浏览器窗口，关闭Tomcat控制台窗口。&lt;br /&gt;4）&lt;span style="font-weight: bold"&gt;安装MySQL&lt;/span&gt; &lt;br /&gt;将D:\JavaTools\mysql-noinstall-5.0.51b-win32.zip解压到D:\mysql-5.0.51b-win32，改名为&lt;br /&gt;D:\mysql-5.0.51b。&lt;br /&gt;执行D:\mysql-5.0.51b\bin\mysqld-nt.exe启动mysql。&lt;br /&gt;将D:\JavaTools\mysql-gui-tools-noinstall-5.0-r12-win32.zip解压到D:\MySQL GUI Tools 5.0\。&lt;br /&gt;执行D:\MySQL GUI Tools 5.0\MySQLQueryBrowser.exe启动客户端。&lt;br /&gt;正常情况下OK进去以后，可以访问数据库。&lt;br /&gt;（注：为了访问方便，可以建立以上可执行文件的快捷方式）&lt;br /&gt;&lt;span style="font-weight: bold"&gt;3.Hello Java Web&lt;/span&gt; &lt;br /&gt;1）&lt;span style="font-weight: bold"&gt;建立Web工程&lt;/span&gt; &lt;br /&gt;建立目录D:\Project用来放工程。&lt;br /&gt;启动Eclipse。&lt;br /&gt;菜单Window--&amp;gt;Preferences--&amp;gt;Tomcat。&lt;br /&gt;Tomcat version，Tomcat home和Context declaration mode的选择如下图所示 。&lt;br /&gt;&lt;img alt="open_img('attachments/200807/3890579454.png')" src="http://www.albertsong.com/attachments/200807/3890579454.png" width="500" height="433" /&gt; &lt;br /&gt;OK保存。&lt;br /&gt;菜单File--&amp;gt;New--&amp;gt;Project&amp;#8230;--&amp;gt;Java--&amp;gt;Tomcat Project，下一步，Project name填Bitrac。&lt;br /&gt;Use default location取消，然后选择D:\Project如下图所示&lt;br /&gt;&lt;img alt="open_img('attachments/200807/1457145286.png')" src="http://www.albertsong.com/attachments/200807/1457145286.png" width="500" height="436" /&gt; &lt;br /&gt;Location后面要加上\Bitrac。&lt;br /&gt;下一步，设置WebRoot，见下图&lt;br /&gt;&lt;img alt="open_img('attachments/200807/2027305000.png')" src="http://www.albertsong.com/attachments/200807/2027305000.png" width="500" height="436" /&gt; &lt;br /&gt;Finish完成工程创建。&lt;br /&gt;正常的话会转到Java视图，可以在Eclipse中看到如下图所示的工程结构。&lt;br /&gt;&lt;img alt="open_img('attachments/200807/4952027448.png')" src="http://www.albertsong.com/attachments/200807/4952027448.png" width="500" height="323" /&gt; &lt;br /&gt;在Eclipse中右键单击WebRoot/WEB-INF/src，delete删除这个目录。&lt;br /&gt;在Bitrac 上点右键，快捷菜单中选择Tomcat project--&amp;gt;Update context definition，成功后，会看到D:\tomcat-6.0.16\conf\Catalina\localhost下面有个Bitrac.xml 文件。&lt;br /&gt;在Bitrac上点右键，快捷菜单中选择Properties--&amp;gt;Tomcat--&amp;gt;Context name，将Bitrac改成bitrac，再重复上面的步骤Update context definition。&lt;br /&gt;在Bitrac上点右键，快捷菜单中选择Properties--&amp;gt;Resource--&amp;gt;Text file encoding--&amp;gt;Other，选择UTF-8，OK保存。（上述操作实际是打开了工程属性对话框，后面将用这一说法代替）&lt;br /&gt;2）&lt;span style="font-weight: bold"&gt;新增文件&lt;/span&gt; &lt;br /&gt;选择WebRoot，快捷键Ctrl+N打开新建文件对话框，Web--&amp;gt;Jsp，下一步，文件名填index.jsp，finish完成新建文件。&lt;br /&gt;在新文件的&amp;lt;body&amp;gt;&amp;lt;/body&amp;gt;之间写上Hello Java Web。&lt;br /&gt;3）&lt;span style="font-weight: bold"&gt;运行&lt;/span&gt; &lt;br /&gt;点工具条上Tomcat插件按钮 中的第一个按钮启动Tomcat。&lt;br /&gt;在浏览器中查看http://localhost:8080/bitrac/&lt;br /&gt;正常的话会看到Hello Java Web，最简单的Java Web程序完成。&lt;br /&gt;4）&lt;span style="font-weight: bold"&gt;为复杂的Java Web程序做准备&lt;/span&gt; &lt;br /&gt;点Tomcat插件工具条的第二个按钮停止Tomcat。&lt;br /&gt;4.1）将D:\JavaTools\struts-2.1.2-all.zip解压到D:\JavaTools\struts-2.1.2&lt;br /&gt;将下列文件&lt;br /&gt;D:\JavaTools\struts-2.1.2\lib\struts2-core-2.1.2.jar&lt;br /&gt;D:\JavaTools\struts-2.1.2\lib\xwork-2.1.1.jar&lt;br /&gt;D:\JavaTools\struts-2.1.2\lib\commons-fileupload-1.2.1.jar&lt;br /&gt;D:\JavaTools\struts-2.1.2\lib\commons-io-1.3.2.jar&lt;br /&gt;D:\JavaTools\struts-2.1.2\lib\commons-logging-api-1.1.jar&lt;br /&gt;D:\JavaTools\struts-2.1.2\lib\ognl-2.6.11.jar&lt;br /&gt;复制到D:\Project\Bitrac\WebRoot\WEB-INF\lib&lt;br /&gt;4.2）将D:\JavaTools\freemarker-2.3.13.tar.gz解压到D:\JavaTools\freemarker-2.3.13&lt;br /&gt;将D:\JavaTools\freemarker-2.3.13\lib\freemarker.jar复制到&lt;br /&gt;D:\Project\Bitrac\WebRoot\WEB-INF\lib，改名为freemarker-2.3.13.jar&lt;br /&gt;4.3）将D:\JavaTools\spring-framework-2.5.5-with-dependencies.zip解压到&lt;br /&gt;D:\JavaTools\spring-framework-2.5.5&lt;br /&gt;将D:\JavaTools\spring-framework-2.5.5\dist\spring.jar复制到&lt;br /&gt;D:\Project\Bitrac\WebRoot\WEB-INF\lib，改名为spring-2.5.5.jar&lt;br /&gt;4.4）将D:\JavaTools\hibernate-3.2.6.ga.zip解压到D:\JavaTools\hibernate-3.2\&lt;br /&gt;将D:\JavaTools\hibernate-3.2\hibernate3.jar复制到&lt;br /&gt;D:\Project\Bitrac\WebRoot\WEB-INF\lib，改名为hibernate-3.2.6.jar&lt;br /&gt;4.5）将D:\JavaTools\hibernate-annotations-3.3.1.GA.zip解压到&lt;br /&gt;D:\JavaTools\hibernate-annotations-3.3.1.GA\&lt;br /&gt;将D:\JavaTools\hibernate-annotations-3.3.1.GA\hibernate-annotations.jar复制到&lt;br /&gt;D:\Project\Bitrac\WebRoot\WEB-INF\lib，改名为hibernate-annotations-3.3.1.jar&lt;br /&gt;4.6）将D:\JavaTools\hibernate-validator-3.0.0.GA.zip解压到&lt;br /&gt;D:\JavaTools\hibernate-validator-3.0.0.GA&lt;br /&gt;将D:\JavaTools\hibernate-validator-3.0.0.GA\hibernate-validator.jar复制到&lt;br /&gt;D:\Project\Bitrac\WebRoot\WEB-INF\lib，改名为hibernate-validator-3.0.0.jar&lt;br /&gt;打开Bitrac工程属性对话框&lt;br /&gt;Java Build Path--&amp;gt;Libraries--&amp;gt;Add Jars&amp;#8230;，将lib下的jar都添加到当前Libraries中。&lt;br /&gt;将D:\JavaTools\struts-2.1.2\apps\struts2-blank-2.1.2.war中的web.xml用winrar解压出来，复制到D:\Project\Bitrac\WebRoot\WEB-INF下。&lt;br /&gt;打开D:\Project\Bitrac\WebRoot\WEB-INF\web.xml&lt;br /&gt;将index.html改为index.jsp，保存。&lt;br /&gt;启动tomcat。&lt;/div&gt;&lt;/font&gt;&lt;img src="http://www.cnblogs.com/freeliver54/aggbug/2342405.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/freeliver54/archive/2012/02/08/2342405.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/freeliver54/archive/2012/02/08/2342334.html</id><title type="text">[转]修改visual studio 2010 HelpLibrary（MSDN）的路径</title><summary type="text">本文转自：http://blog.csdn.net/lwj2099/article/details/5727636今天装了Microsoft Visual Studio 2010,这次的VS2010没有所谓的MSDN,取代的就是HelpLibrary.安装vs2010时没有把HelpLibrary装上，现在想装上，于是打开Help Library管理器，点击“设置”，选择“我要使用本地帮助”，发现库位置为默认C:/ProgramData/Microsoft/HelpLibrary，不能更改，于是只有先按照默认路径安装，点击“确定”。然后点击“从磁盘安装内容”，再点击“浏览”，选择cn_visu</summary><published>2012-02-08T02:39:00Z</published><updated>2012-02-08T02:39:00Z</updated><author><name>freeliver54</name><uri>http://www.cnblogs.com/freeliver54/</uri></author><link rel="alternate" href="http://www.cnblogs.com/freeliver54/archive/2012/02/08/2342334.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/freeliver54/archive/2012/02/08/2342334.html"/><content type="html">&lt;p&gt;本文转自：&lt;a href="http://blog.csdn.net/lwj2099/article/details/5727636" target="_blank"&gt;http://blog.csdn.net/lwj2099/article/details/5727636&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div id="article_content" &gt;&#xD;
&lt;p&gt;今天装了Microsoft Visual Studio 2010,这次的VS2010没有所谓的MSDN,取代的就是HelpLibrary.安装vs2010时没有把HelpLibrary装上，现在想装上，于是打开Help Library管理器，点击&amp;#8220;设置&amp;#8221;，选择&amp;#8220;我要使用本地帮助&amp;#8221;，发现库位置为默认C:/ProgramData/Microsoft/HelpLibrary，不能更改，于是只有先按照默认路径安装，点击&amp;#8220;确定&amp;#8221;。&lt;/p&gt;&#xD;
&lt;p&gt;然后点击&amp;#8220;从磁盘安装内容&amp;#8221;，再点击&amp;#8220;浏览&amp;#8221;，选择cn_visual_studio_2010_ultimate_x86_dvd_532347.iso里面ProductDocumentation文件夹里的HelpContentSetup.msha文件，后面选项简单，自己看着点就是了。到此，Help Library按照默认路径安装完成了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;这个文档很大，要想移到其他地方，可以按照下面步骤，比如要移到D:/Program Files/HelpLibrary下：&lt;br /&gt;1、找到C:/ProgramData/Microsoft/HelpLibrary，把HelpLibrary文件夹复制到D:/Program Files/HelpLibrary&lt;br /&gt;2、打开注册表，找到HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Help/v1.0，此处有一个LocalStore的值 .数据就是之前默认保存的路径了.先备份一下,然后替换成自己想要的文件夹路径D:/Program Files/HelpLibrary.&lt;br /&gt;3、找到文件D:/Program Files/HelpLibrary/manifest/queryManifest.3.xml，进行编辑：找到下面两行：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;catalogPath&amp;gt;C:/ProgramData/Microsoft/HelpLibrary/catalogs/VS/100/EN-US&amp;lt;/catalogPath&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;contentPath&amp;gt;C:/ProgramData/Microsoft/HelpLibrary/content&amp;lt;/contentPath&amp;gt; &lt;/p&gt;&#xD;
&lt;p&gt;将C:/ProgramData/Microsoft改为D:/Program Files即可。&lt;/p&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/freeliver54/aggbug/2342334.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/freeliver54/archive/2012/02/08/2342334.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/freeliver54/archive/2012/02/03/2336635.html</id><title type="text">[转]Android.mk的用法和基础</title><summary type="text">本文转自：http://www.cnblogs.com/lilactutu/archive/2010/12/06/1897696.html一个Android.mk file用来向编译系统描述你的源代码。具体来说：该文件是GNU Makefile的一小部分，会被编译系统解析一次或多次。你可以在每一个Android.mk file中定义一个或多个模块，你也可以在几个模块中使用同一个源代码文件。编译系统为你处理许多细节问题。例如，你不需要在你的Android.mk中 列出头文件和依赖文件。NDK编译系统将会为你自动处理这些问题。这也意味着，在升级NDK后，你应该得到新的toolchain/platf</summary><published>2012-02-03T02:27:00Z</published><updated>2012-02-03T02:27:00Z</updated><author><name>freeliver54</name><uri>http://www.cnblogs.com/freeliver54/</uri></author><link rel="alternate" href="http://www.cnblogs.com/freeliver54/archive/2012/02/03/2336635.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/freeliver54/archive/2012/02/03/2336635.html"/><content type="html">&lt;p&gt;本文转自：&lt;a href="http://www.cnblogs.com/lilactutu/archive/2010/12/06/1897696.html" target="_blank"&gt;http://www.cnblogs.com/lilactutu/archive/2010/12/06/1897696.html&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;一个Android.mk file用来向编译系统描述你的源代码。具体来说：该文件是GNU Makefile的一小部分，会被编译系统解析一次或多次。你可以在每一个Android.mk file中定义一个或多个模块，你也可以在几个模块中使用同一个源代码文件。编译系统为你处理许多细节问题。例如，你不需要在你的Android.mk中 列出头文件和依赖文件。NDK编译系统将会为你自动处理这些问题。这也意味着，在升级NDK后，你应该得到新的toolchain/platform支 持，而且不需要改变你的Android.mk文件。 &lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div&gt;先看一个简单的例子：一个简单的"hello world"，比如下面的文件：&lt;/div&gt;&#xD;
&lt;div&gt;sources/helloworld/helloworld.c&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;sources/helloworld/Android.mk&lt;/div&gt;&#xD;
&lt;div&gt;相应的Android.mk文件会象下面这样：&lt;/div&gt;&#xD;
&lt;div&gt;---------- cut here ------------------&lt;/div&gt;&#xD;
&lt;div&gt;LOCAL_PATH := $(call my-dir)&lt;/div&gt;&#xD;
&lt;div&gt;include $(CLEAR_VARS)&lt;/div&gt;&#xD;
&lt;div&gt;LOCAL_MODULE&lt;/div&gt;&#xD;
&lt;div&gt;:= helloworld&lt;/div&gt;&#xD;
&lt;div&gt;LOCAL_SRC_FILES := helloworld.c&lt;/div&gt;&#xD;
&lt;div&gt;include $(BUILD_SHARED_LIBRARY)&lt;/div&gt;&#xD;
&lt;div&gt;---------- cut here ------------------&lt;/div&gt;&#xD;
&lt;div&gt;我们来解释一下这几行代码：&lt;/div&gt;&#xD;
&lt;div&gt;LOCAL_PATH := $(call my-dir)&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;一个Android.mk file首先必须定义好LOCAL_PATH变量。它用于在开发树中查找源文件。在这个例子中，宏函数&amp;#8217;my-dir&amp;#8217;, 由编译系统提供，用于返回当前路径（即包含Android.mk file文件的目录）。&lt;/div&gt;&#xD;
&lt;div&gt;include $( CLEAR_VARS)&lt;/div&gt;&#xD;
&lt;div&gt;CLEAR_VARS 由编译系统提供，指定让GNU MAKEFILE为你清除许多LOCAL_XXX变量（例如 LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES, 等等...),除LOCAL_PATH 。这是必要的，因为所有的编译控制文件都在同一个GNU MAKE执行环境中，所有的变量都是全局的。&lt;/div&gt;&#xD;
&lt;div&gt;LOCAL_MODULE := helloworld&lt;/div&gt;&#xD;
&lt;div&gt;LOCAL_MODULE变量必须定义，以标识你在Android.mk文件中描述的每个模块。名称必须是唯一的，而且不包 含任何空格。注意编译系统会自动产生合适的前缀和后缀，换句话说，一个被命名为'foo'的共享库模块，将会生成'libfoo.so'文件。&lt;/div&gt;&#xD;
&lt;div&gt;LOCAL_SRC_FILES := helloworld.c&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;LOCAL_SRC_FILES变量必须包含将要编译打包进模块中的C或C++源代码文件。注意，你不用在这 里列出头文件和包含文件，因为编译系统将会自动为你找出依赖型的文件；仅仅列出直接传递给编译器的源代码文件就好。&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div&gt;在Android中增加本地程序或者库，这些程序和库与其所载路径没有任何关系，只和它们的Android.mk文件有关系。Android.mk和普通 的Makefile有所不同，它具有统一的写法，主要包含一些系统公共的宏。&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div&gt;在一个Android.mk中可以生成多个可执行程序、动态库和静态库。&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div&gt;1，编译应用程序的模板：&lt;/div&gt;&#xD;
&lt;div&gt;#Test Exe&lt;/div&gt;&#xD;
&lt;div&gt;LOCAL_PATH := $(call my-dir)&lt;/div&gt;&#xD;
&lt;div&gt;#include $(CLEAR_VARS)&lt;/div&gt;&#xD;
&lt;div&gt;LOCAL_SRC_FILES:= main.c&lt;/div&gt;&#xD;
&lt;div&gt;LOCAL_MODULE:= test_exe&lt;/div&gt;&#xD;
&lt;div&gt;#LOCAL_C_INCLUDES :=&lt;/div&gt;&#xD;
&lt;div&gt;#LOCAL_STATIC_LIBRARIES :=&lt;/div&gt;&#xD;
&lt;div&gt;#LOCAL_SHARED_LIBRARIES :=&lt;/div&gt;&#xD;
&lt;div&gt;include $(BUILD_EXECUTABLE)&lt;/div&gt;&#xD;
&lt;div&gt;（菜鸟级别解 释：:=是赋值的意思，$是引用某变量的值）LOCAL_SRC_FILES中加入源文件路径，LOCAL_C_INCLUDES 中加入所需要包含的头文件路径，LOCAL_STATIC_LIBRARIES加入所需要链接的静态库（*.a）的名 称，LOCAL_SHARED_LIBRARIES中加入所需要链接的动态库（*.so）的名称，LOCAL_MODULE表示模块最终的名 称，BUILD_EXECUTABLE表示以一个可执行程序的方式进行编译。&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div&gt;2，编译静态库的模板：&lt;/div&gt;&#xD;
&lt;div&gt;#Test Static Lib&lt;/div&gt;&#xD;
&lt;div&gt;LOCAL_PATH := $(call my-dir)&lt;/div&gt;&#xD;
&lt;div&gt;include $(CLEAR_VARS)&lt;/div&gt;&#xD;
&lt;div&gt;LOCAL_SRC_FILES:= \&lt;/div&gt;&#xD;
&lt;div&gt;helloworld.c&lt;/div&gt;&#xD;
&lt;div&gt;LOCAL_MODULE:= libtest_static&lt;/div&gt;&#xD;
&lt;div&gt;#LOCAL_C_INCLUDES :=&lt;/div&gt;&#xD;
&lt;div&gt;#LOCAL_STATIC_LIBRARIES :=&lt;/div&gt;&#xD;
&lt;div&gt;#LOCAL_SHARED_LIBRARIES :=&lt;/div&gt;&#xD;
&lt;div&gt;include $(BUILD_STATIC_LIBRARY)&amp;nbsp;&lt;/div&gt;&#xD;
&lt;p&gt;一般的和上面相似，BUILD_STATIC_LIBRARY表示编译一个静态库。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div&gt;3，编译动态库的模板：&lt;/div&gt;&#xD;
&lt;div&gt;#Test Shared Lib&lt;/div&gt;&#xD;
&lt;div&gt;LOCAL_PATH := $(call my-dir)&lt;/div&gt;&#xD;
&lt;div&gt;include $(CLEAR_VARS)&lt;/div&gt;&#xD;
&lt;div&gt;LOCAL_SRC_FILES:= \&lt;/div&gt;&#xD;
&lt;div&gt;helloworld.c&lt;/div&gt;&#xD;
&lt;div&gt;LOCAL_MODULE:= libtest_shared&lt;/div&gt;&#xD;
&lt;div&gt;TARGET_PRELINK_MODULES := false&lt;/div&gt;&#xD;
&lt;div&gt;#LOCAL_C_INCLUDES :=&lt;/div&gt;&#xD;
&lt;div&gt;#LOCAL_STATIC_LIBRARIES :=&lt;/div&gt;&#xD;
&lt;div&gt;#LOCAL_SHARED_LIBRARIES :=&lt;/div&gt;&#xD;
&lt;div&gt;include $(BUILD_SHARED_LIBRARY)&lt;/div&gt;&#xD;
&lt;div&gt;一般的和上面相似，BUILD_SHARED_LIBRARY表示编译一个静态库。&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div&gt;以上三者的生成结果分别在如下，generic依具体target会变：&lt;/div&gt;&#xD;
&lt;div&gt;out/target/product/generic/obj/EXECUTABLE&lt;/div&gt;&#xD;
&lt;div&gt;out/target/product/generic/obj/STATIC_LIBRARY&lt;/div&gt;&#xD;
&lt;div&gt;out/target/product/generic/obj/SHARED_LIBRARY&lt;/div&gt;&#xD;
&lt;div&gt;每个模块的目标文件夹分别为：&lt;/div&gt;&#xD;
&lt;div&gt;可执行程序：XXX_intermediates&lt;/div&gt;&#xD;
&lt;div&gt;静态库： &amp;nbsp; &amp;nbsp; &amp;nbsp;XXX_static_intermediates&lt;/div&gt;&#xD;
&lt;div&gt;动态库： &amp;nbsp; &amp;nbsp; &amp;nbsp;XXX_shared_intermediates&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div&gt;另外，在Android.mk文件中，还可以指定最后的目标安装路径，用LOCAL_MODULE_PATH和 LOCAL_UNSTRIPPED_PATH来指定。不同的文件系统路径用以下的宏进行选择：&lt;/div&gt;&#xD;
&lt;div&gt;TARGET_ROOT_OUT：表示根文件系统。&lt;/div&gt;&#xD;
&lt;div&gt;TARGET_OUT： 表示system文件系统。&lt;/div&gt;&#xD;
&lt;div&gt;TARGET_OUT_DATA：表示data文件系统。&lt;/div&gt;&#xD;
&lt;div&gt;用法如：&lt;/div&gt;&#xD;
&lt;div&gt;CAL_MODULE_PATH:=$(TARGET_ROOT_OUT)&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/freeliver54/aggbug/2336635.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/freeliver54/archive/2012/02/03/2336635.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/freeliver54/archive/2012/02/03/2336621.html</id><title type="text">[转]Android JNI使用方法</title><summary type="text">本文转自：http://www.open-open.com/lib/view/open1324909652374.html经过几天的努力终于搞定了android JNI部分，下面将我的这个小程序和大家分享一下。android JNI是连接android Java部分和C/C++部分的纽带，完整使用JNI需要Java代码和C/C++代码。其中C/C++代码用于生成库文件，Java代码用于引用C /C++库文件以及调用C/C++方法。android Java部分代码： 01jnitest.java 0203package com.hello.jnitest; 04050607import andr</summary><published>2012-02-03T02:18:00Z</published><updated>2012-02-03T02:18:00Z</updated><author><name>freeliver54</name><uri>http://www.cnblogs.com/freeliver54/</uri></author><link rel="alternate" href="http://www.cnblogs.com/freeliver54/archive/2012/02/03/2336621.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/freeliver54/archive/2012/02/03/2336621.html"/><content type="html">&lt;p&gt;&lt;font style="background-color: #c7edcc"&gt;本文转自：&lt;a href="http://www.open-open.com/lib/view/open1324909652374.html" target="_blank"&gt;http://www.open-open.com/lib/view/open1324909652374.html&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;font style="background-color: #c7edcc"&gt;&lt;/font&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;经过几天的努力终于搞定了android JNI部分，下面将我的这个小程序和大家分享一下。android JNI是连接android Java部分和C/C++部分的纽带，完整使用JNI需要Java代码和C/C++代码。其中C/C++代码用于生成库文件，Java代码用于引用C /C++库文件以及调用C/C++方法。&lt;/p&gt;&#xD;
&lt;p&gt;android Java部分代码：&lt;/p&gt;&#xD;
&lt;div id="highlighter_739571" &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt; &#xD;
&lt;div &gt;&#xD;
&lt;object id="highlighter_739571_clipboard" title="copy to clipboard" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="16" height="16" type="application/x-shockwave-flash"&gt;&#xD;
&lt;param name="_cx" value="423" /&gt;&lt;param name="_cy" value="423" /&gt;&lt;param name="FlashVars" value="highlighterId=highlighter_739571" /&gt;&lt;param name="Movie" value="/lib/syntaxhighlighter_2.1.382/scripts/clipboard.swf" /&gt;&lt;param name="Src" value="/lib/syntaxhighlighter_2.1.382/scripts/clipboard.swf" /&gt;&lt;param name="WMode" value="Transparent" /&gt;&lt;param name="Play" value="0" /&gt;&lt;param name="Loop" value="-1" /&gt;&lt;param name="Quality" value="High" /&gt;&lt;param name="SAlign" value="" /&gt;&lt;param name="Menu" value="0" /&gt;&lt;param name="Base" value="" /&gt;&lt;param name="AllowScriptAccess" value="always" /&gt;&lt;param name="Scale" value="ShowAll" /&gt;&lt;param name="DeviceFont" value="0" /&gt;&lt;param name="EmbedMovie" value="0" /&gt;&lt;param name="BGColor" value="" /&gt;&lt;param name="SWRemote" value="" /&gt;&lt;param name="MovieData" value="" /&gt;&lt;param name="SeamlessTabbing" value="1" /&gt;&lt;param name="Profile" value="0" /&gt;&lt;param name="ProfileAddress" value="" /&gt;&lt;param name="ProfilePort" value="0" /&gt;&lt;param name="AllowNetworking" value="all" /&gt;&lt;param name="AllowFullScreen" value="false" /&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;01&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;jnitest.java &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;02&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;03&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;package&lt;/code&gt; &lt;code &gt;com.hello.jnitest; &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;04&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;05&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;06&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;07&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;import&lt;/code&gt; &lt;code &gt;android.app.Activity; &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;08&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;09&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;import&lt;/code&gt; &lt;code &gt;android.os.Bundle; &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;10&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;11&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;12&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;13&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;public&lt;/code&gt; &lt;code &gt;class&lt;/code&gt; &lt;code &gt;jnitest &lt;/code&gt;&lt;code &gt;extends&lt;/code&gt; &lt;code &gt;Activity { &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;14&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;15&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;/** Called when the activity is first created. */&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;16&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;17&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;@Override&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;18&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;19&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;public&lt;/code&gt; &lt;code &gt;void&lt;/code&gt; &lt;code &gt;onCreate(Bundle savedInstanceState) { &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;20&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;21&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;super&lt;/code&gt;&lt;code &gt;.onCreate(savedInstanceState); &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;22&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;23&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;setContentView(R.layout.main); &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;24&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;25&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;Nadd test = &lt;/code&gt;&lt;code &gt;new&lt;/code&gt; &lt;code &gt;Nadd(); &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;26&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;27&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;setTitle(&lt;/code&gt;&lt;code &gt;"The Native Add Result is "&lt;/code&gt;&lt;code &gt;+String.valueOf(test.nadd(&lt;/code&gt;&lt;code &gt;10&lt;/code&gt;&lt;code &gt;, &lt;/code&gt;&lt;code &gt;20&lt;/code&gt;&lt;code &gt;))); &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;28&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;29&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&lt;code &gt;}&amp;nbsp; &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;30&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;31&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;} &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;32&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;33&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;Nadd.java &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;34&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;35&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;package&lt;/code&gt; &lt;code &gt;com.hello.jnitest; &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;36&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;37&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;38&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;39&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;public&lt;/code&gt; &lt;code &gt;class&lt;/code&gt; &lt;code &gt;Nadd { &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;40&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;41&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;static&lt;/code&gt; &lt;code &gt;{ &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;42&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;43&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;System.loadLibrary(&lt;/code&gt;&lt;code &gt;"hello_jni"&lt;/code&gt;&lt;code &gt;); &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;44&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;45&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;} &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;46&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;47&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;&amp;nbsp;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;48&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;49&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;public&lt;/code&gt; &lt;code &gt;native&lt;/code&gt; &lt;code &gt;int&lt;/code&gt; &lt;code &gt;nadd(&lt;/code&gt;&lt;code &gt;int&lt;/code&gt; &lt;code &gt;a, &lt;/code&gt;&lt;code &gt;int&lt;/code&gt; &lt;code &gt;b); &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;50&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;&amp;nbsp;&lt;/code&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;51&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;}&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;div&gt;Java代码说明：&lt;/div&gt;&#xD;
&lt;div&gt;1）jnitest.java是一个activity的类对象，在该类对象中生成调用JNI函数的类对象，同时调用JNI方法，最后将JNI方法的结果显示到标题栏上；&lt;/div&gt;&#xD;
&lt;div&gt;2）Nadd.java是一个引用和声明JNI库和函数的类，其中System.loadLibrary();函数用来引用JNI库，默认JNI库放在 android系统的/system/lib/目录下；public nadd int nadd(int a, int b);为声明需要在java程序中使用的JNI库中的函数；&lt;/div&gt;&#xD;
&lt;div&gt;JNI中java部分的代码到此就结束了，总结一下在java代码中需要做两件事：&lt;/div&gt;&#xD;
&lt;div&gt;1）使用System.loadLibrary()函数来引用JNI库；&lt;/div&gt;&#xD;
&lt;div&gt;2）声明调用JNI库的函数且前面添加native关键字；&lt;/div&gt;&#xD;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&#xD;
&lt;div&gt;android C/C++部分代码：&lt;/div&gt;&#xD;
&lt;div id="highlighter_525419" &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt; &#xD;
&lt;div &gt;&#xD;
&lt;object id="highlighter_525419_clipboard" title="copy to clipboard" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="16" height="16" type="application/x-shockwave-flash"&gt;&#xD;
&lt;param name="_cx" value="423" /&gt;&lt;param name="_cy" value="423" /&gt;&lt;param name="FlashVars" value="highlighterId=highlighter_525419" /&gt;&lt;param name="Movie" value="/lib/syntaxhighlighter_2.1.382/scripts/clipboard.swf" /&gt;&lt;param name="Src" value="/lib/syntaxhighlighter_2.1.382/scripts/clipboard.swf" /&gt;&lt;param name="WMode" value="Transparent" /&gt;&lt;param name="Play" value="0" /&gt;&lt;param name="Loop" value="-1" /&gt;&lt;param name="Quality" value="High" /&gt;&lt;param name="SAlign" value="" /&gt;&lt;param name="Menu" value="0" /&gt;&lt;param name="Base" value="" /&gt;&lt;param name="AllowScriptAccess" value="always" /&gt;&lt;param name="Scale" value="ShowAll" /&gt;&lt;param name="DeviceFont" value="0" /&gt;&lt;param name="EmbedMovie" value="0" /&gt;&lt;param name="BGColor" value="" /&gt;&lt;param name="SWRemote" value="" /&gt;&lt;param name="MovieData" value="" /&gt;&lt;param name="SeamlessTabbing" value="1" /&gt;&lt;param name="Profile" value="0" /&gt;&lt;param name="ProfileAddress" value="" /&gt;&lt;param name="ProfilePort" value="0" /&gt;&lt;param name="AllowNetworking" value="all" /&gt;&lt;param name="AllowFullScreen" value="false" /&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;01&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;#define LOG_TAG "hello-JNI" &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;02&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;#include &amp;lt;stdio.h&amp;gt; &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;03&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;#include &amp;lt;stdlib.h&amp;gt; &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;04&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;#include &amp;lt;unistd.h&amp;gt; &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;05&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;#include &amp;lt;sys/types.h&amp;gt; &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;06&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;#include &amp;lt;sys/stat.h&amp;gt; &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;07&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;#include &amp;lt;fcntl.h&amp;gt; &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;08&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;#include &amp;lt;assert.h&amp;gt; &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;09&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;#include "jni.h" &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;10&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;#include "JNIHelp.h" &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;11&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;#include "android_runtime/AndroidRuntime.h" &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;12&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;static&lt;/code&gt; &lt;code &gt;jint com_hello_jnitest_jnitest_nadd(JNIEnv *env, jobject obj, jint a, jint b) &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;13&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;{ &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;14&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;return&lt;/code&gt; &lt;code &gt;(a * b); &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;15&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;} &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;16&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;static&lt;/code&gt; &lt;code &gt;JNINativeMethod gMethods[] = { &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;17&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;{&lt;/code&gt;&lt;code &gt;"nadd"&lt;/code&gt;&lt;code &gt;, &lt;/code&gt;&lt;code &gt;"(II)I"&lt;/code&gt;&lt;code &gt;, (&lt;/code&gt;&lt;code &gt;void&lt;/code&gt; &lt;code &gt;*)com_hello_jnitest_jnitest_nadd}, &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;18&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;}; &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;19&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;static&lt;/code&gt; &lt;code &gt;int&lt;/code&gt; &lt;code &gt;register_android_test_hello(JNIEnv *env) &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;20&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;{ &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;21&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;return&lt;/code&gt; &lt;code &gt;android::AndroidRuntime::registerNativeMethods(env, &lt;/code&gt;&lt;code &gt;"com/hello/jnitest/Nadd"&lt;/code&gt;&lt;code &gt;, gMethods, NELEM(gMethods)); &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;22&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;} &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;23&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;jint JNI_OnLoad(JavaVM *vm, &lt;/code&gt;&lt;code &gt;void&lt;/code&gt; &lt;code &gt;*reserved) &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;24&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;{ &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;25&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;JNIEnv *env = NULL; &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;26&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;if&lt;/code&gt; &lt;code &gt;(vm-&amp;gt;GetEnv((&lt;/code&gt;&lt;code &gt;void&lt;/code&gt; &lt;code &gt;**)&amp;amp;env, JNI_VERSION_1_4) != JNI_OK) { &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;27&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;printf&lt;/code&gt;&lt;code &gt;(&lt;/code&gt;&lt;code &gt;"Error GetEnv\n"&lt;/code&gt;&lt;code &gt;); &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;28&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;return&lt;/code&gt; &lt;code &gt;-1; &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;29&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;} &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;30&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;assert&lt;/code&gt;&lt;code &gt;(env != NULL); &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;31&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;if&lt;/code&gt; &lt;code &gt;(register_android_test_hello(env) &amp;lt; 0) { &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;32&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;printf&lt;/code&gt;&lt;code &gt;(&lt;/code&gt;&lt;code &gt;"register_android_test_hello error.\n"&lt;/code&gt;&lt;code &gt;); &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;33&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;return&lt;/code&gt; &lt;code &gt;-1; &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;34&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;} &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;35&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;return&lt;/code&gt; &lt;code &gt;JNI_VERSION_1_4; &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;36&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;}&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;div&gt;JNI C/C++代码说明：&lt;/div&gt;&#xD;
&lt;div&gt;1）JNI_OnLoad()函数。该函数在Java程序调用System.loadLibrary()时，被调用执行，用于向JavaVM注册JNI函数等。在本例中首先通过参数JavaVM（Java虚拟机指针）获取当前应用程序所在的线程，即：JNIEnv。再通过调用 android::AndroidRuntime::registerNativeMethods()注册native实现的函数指针。&lt;/div&gt;&#xD;
&lt;div&gt;2）JNI函数和Java调用函数的映射关系。使用JNINativeMethod将java调用的函数名与JNI实现的函数名联系在一起；&lt;/div&gt;&#xD;
&lt;div&gt;3）JNI函数实现；&lt;/div&gt;&#xD;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&#xD;
&lt;div&gt;Android.mk代码：&lt;/div&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div id="highlighter_428789" &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt; &#xD;
&lt;div &gt;&#xD;
&lt;object id="highlighter_428789_clipboard" title="copy to clipboard" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="16" height="16" type="application/x-shockwave-flash"&gt;&#xD;
&lt;param name="_cx" value="423" /&gt;&lt;param name="_cy" value="423" /&gt;&lt;param name="FlashVars" value="highlighterId=highlighter_428789" /&gt;&lt;param name="Movie" value="/lib/syntaxhighlighter_2.1.382/scripts/clipboard.swf" /&gt;&lt;param name="Src" value="/lib/syntaxhighlighter_2.1.382/scripts/clipboard.swf" /&gt;&lt;param name="WMode" value="Transparent" /&gt;&lt;param name="Play" value="0" /&gt;&lt;param name="Loop" value="-1" /&gt;&lt;param name="Quality" value="High" /&gt;&lt;param name="SAlign" value="" /&gt;&lt;param name="Menu" value="0" /&gt;&lt;param name="Base" value="" /&gt;&lt;param name="AllowScriptAccess" value="always" /&gt;&lt;param name="Scale" value="ShowAll" /&gt;&lt;param name="DeviceFont" value="0" /&gt;&lt;param name="EmbedMovie" value="0" /&gt;&lt;param name="BGColor" value="" /&gt;&lt;param name="SWRemote" value="" /&gt;&lt;param name="MovieData" value="" /&gt;&lt;param name="SeamlessTabbing" value="1" /&gt;&lt;param name="Profile" value="0" /&gt;&lt;param name="ProfileAddress" value="" /&gt;&lt;param name="ProfilePort" value="0" /&gt;&lt;param name="AllowNetworking" value="all" /&gt;&lt;param name="AllowFullScreen" value="false" /&gt;&lt;/object&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;LOCAL_PATH := $(call my-dir) &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;2&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;include $(CLEAR_VARS) &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;3&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;LOCAL_PRELINK_MODULE := &lt;/code&gt;&lt;code &gt;false&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;4&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;LOCAL_SRC_FILES := \ &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;5&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;com_hello_jnitest.cpp &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;6&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;LOCAL_SHARED_LIBRARIES := \ &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;7&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;libandroid_runtime &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;8&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;LOCAL_MODULE := libhello_jni &lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;table&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&lt;code&gt;9&lt;/code&gt;&lt;/td&gt;&#xD;
&lt;td &gt;&lt;code &gt;include $(BUILD_SHARED_LIBRARY)&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&#xD;
&lt;div&gt;需要注意的是：&lt;/div&gt;&#xD;
&lt;div&gt;1）JNI C/C++部分的代码需要在android源代码树上进行编译，编译完成后我的做法是直接将生成的.so通过adb push方法上传到android虚拟机的/system/lib/目录下；&lt;/div&gt;&#xD;
&lt;div&gt;2）java代码可以在eclipse下直接编译且在虚拟机上执行；&lt;/div&gt;&#xD;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&#xD;
&lt;div&gt;编译JNI C/C++部分代码（在android内核源代码根目录下）：&lt;/div&gt;&#xD;
&lt;div&gt;#make libhello_jni&lt;/div&gt;&#xD;
&lt;div&gt;之后在out/target/product/generic/system/lib/目录下生成libhello_jni.so&lt;/div&gt;&#xD;
&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&#xD;
&lt;div&gt;上传libhello_jni.so到android虚拟机：&lt;/div&gt;&#xD;
&lt;div&gt;#adb push out/target/product/generic/system/lib/libhello_jni.so /system/lib&lt;/div&gt;&#xD;
&lt;div&gt;注意：此时有可能出现Out of Memory的错误提示。当出现如上错误提示时，需要使用#adb remount重新加载一下就可以了。&lt;/div&gt;&#xD;
&lt;div&gt;另外，也有可能直接使用eclipse启动android虚拟机时出现上述错误且使用#adb remount也出现的情况，此时需要手动启动android虚拟机，如：#emulator -avd xxx -partition-size 128，之后在使用#adb push就可以了。&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/freeliver54/aggbug/2336621.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/freeliver54/archive/2012/02/03/2336621.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/freeliver54/archive/2012/02/03/2336586.html</id><title type="text">[转]Android中的Frame动画</title><summary type="text">本文转自：http://vlinux.iteye.com/blog/472855相信有Android手机的人都玩过一款Kuba的游戏（没玩过的我推荐去玩一下），里面用手指接触到屏幕后产生的爆炸效果确实增加了游戏的不少色彩。那么这个是怎么做出来的呢？很明显，这个效果应该是一个动画序列图实现的，即Frame-by-Frame动画。Android实现Frame-by-Frame动画我会的有两种方法：1、animation-list配置，预先将一个动画按照每帧分解成的多个图片所组成的序列。然后再在Android的配置文件中将这些图片配置到动画里面。Xml代码 &amp;lt;animation-listxml</summary><published>2012-02-03T01:58:00Z</published><updated>2012-02-03T01:58:00Z</updated><author><name>freeliver54</name><uri>http://www.cnblogs.com/freeliver54/</uri></author><link rel="alternate" href="http://www.cnblogs.com/freeliver54/archive/2012/02/03/2336586.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/freeliver54/archive/2012/02/03/2336586.html"/><content type="html">&lt;p&gt;本文转自：&lt;a href="http://vlinux.iteye.com/blog/472855" target="_blank"&gt;http://vlinux.iteye.com/blog/472855&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div id="blog_content" &gt;&#xD;
&lt;p&gt;相信有Android手机的人都玩过一款Kuba的游戏（没玩过的我推荐去玩一下），里面用手指接触到屏幕后产生的爆炸效果确实增加了游戏的不少色彩。那么这个是怎么做出来的呢？&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;很明显，这个效果应该是一个动画序列图实现的，即Frame-by-Frame动画。Android实现Frame-by-Frame动画我会的有两种方法：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;1、animation-list配置，预先将一个动画按照每帧分解成的多个图片所组成的序列。然后再在Android的配置文件中将这些图片配置到动画里面。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;Xml代码 &lt;a title="复制代码" href="http://vlinux.iteye.com/blog/472855#"&gt;&lt;img alt="复制代码" src="http://vlinux.iteye.com/images/icon_copy.gif" /&gt;&lt;/a&gt;&amp;nbsp;&lt;a title="收藏这段代码" href="http://www.cnblogs.com/freeliver54/admin/javascript:void()"&gt;&lt;img  alt="收藏代码" src="http://vlinux.iteye.com/images/icon_star.png" /&gt;&lt;img style="display: none"  alt="" src="http://vlinux.iteye.com/images/spinner.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;ol &gt;&lt;li&gt;&lt;span&gt;&lt;strong&gt;&lt;font color="#006699"&gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;animation-list&lt;/span&gt;&lt;/font&gt;&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;&lt;font color="#ff0000"&gt;xmlns:android&lt;/font&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span &gt;&lt;font color="#0000ff"&gt;"http://schemas.android.com/apk/res/android"&lt;/font&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;&lt;font color="#ff0000"&gt;android:oneshot&lt;/font&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span &gt;&lt;font color="#0000ff"&gt;"false"&lt;/font&gt;&lt;/span&gt;&lt;span &gt;&lt;strong&gt;&lt;font color="#006699"&gt;&amp;gt;&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;&lt;font color="#006699"&gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;item&lt;/span&gt;&lt;/font&gt;&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;&lt;font color="#ff0000"&gt;android:drawable&lt;/font&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span &gt;&lt;font color="#0000ff"&gt;"@drawable/explode1"&lt;/font&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;&lt;font color="#ff0000"&gt;android:duration&lt;/font&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span &gt;&lt;font color="#0000ff"&gt;"50"&lt;/font&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;&lt;strong&gt;&lt;font color="#006699"&gt;/&amp;gt;&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;&lt;font color="#006699"&gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;item&lt;/span&gt;&lt;/font&gt;&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;&lt;font color="#ff0000"&gt;android:drawable&lt;/font&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span &gt;&lt;font color="#0000ff"&gt;"@drawable/explode2"&lt;/font&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;&lt;font color="#ff0000"&gt;android:duration&lt;/font&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span &gt;&lt;font color="#0000ff"&gt;"50"&lt;/font&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;&lt;strong&gt;&lt;font color="#006699"&gt;/&amp;gt;&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;&lt;font color="#006699"&gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;item&lt;/span&gt;&lt;/font&gt;&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;&lt;font color="#ff0000"&gt;android:drawable&lt;/font&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span &gt;&lt;font color="#0000ff"&gt;"@drawable/explode3"&lt;/font&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;&lt;font color="#ff0000"&gt;android:duration&lt;/font&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span &gt;&lt;font color="#0000ff"&gt;"50"&lt;/font&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;&lt;strong&gt;&lt;font color="#006699"&gt;/&amp;gt;&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;strong&gt;&lt;font color="#006699"&gt;&lt;span &gt;&amp;lt;&lt;/span&gt;&lt;span &gt;item&lt;/span&gt;&lt;/font&gt;&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;&lt;font color="#ff0000"&gt;android:drawable&lt;/font&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span &gt;&lt;font color="#0000ff"&gt;"@drawable/explode4"&lt;/font&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;&lt;font color="#ff0000"&gt;android:duration&lt;/font&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span &gt;&lt;font color="#0000ff"&gt;"50"&lt;/font&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;&lt;strong&gt;&lt;font color="#006699"&gt;/&amp;gt;&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;/span&gt;&lt;strong&gt;&lt;font color="#006699"&gt;&lt;span &gt;&amp;lt;/&lt;/span&gt;&lt;span &gt;animation-list&lt;/span&gt;&lt;span &gt;&amp;gt;&lt;/span&gt;&lt;/font&gt;&lt;/strong&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;pre style="display: none"  title="Android中的Frame动画" name="code" codeable_id="472855" codeable_type="Blog" source_url="http://vlinux.iteye.com/blog/472855" pre_index="0"&gt;&amp;lt;animation-list xmlns:android="http://schemas.android.com/apk/res/android"&#xD;
    android:oneshot="false"&amp;gt;&#xD;
    &amp;lt;item android:drawable="@drawable/explode1" android:duration="50" /&amp;gt;&#xD;
    &amp;lt;item android:drawable="@drawable/explode2" android:duration="50" /&amp;gt;&#xD;
    &amp;lt;item android:drawable="@drawable/explode3" android:duration="50" /&amp;gt;&#xD;
    &amp;lt;item android:drawable="@drawable/explode4" android:duration="50" /&amp;gt;&#xD;
&amp;lt;/animation-list&amp;gt;&#xD;
&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;但是由此带来的不便也是显而易见的：drawable目录下拥挤了过多的动画帧文件。如果游戏大起来，动画效果丰富，那么drawable目录下将拥有数量庞大的图片文件，这将是开发人员的灾难(见下图)。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2、AnimationDrawable动画。其实我们发现，我们完全可以将同一动画序列的每帧图片都合并到一个大的图片中去，然后读取图片的时候按照约定好的宽、高去读就能准确的将该帧图片精确的读出来了。下图是小雪行走序列图。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;将序列图读出并且转化为动画的核心代码为&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;Java代码 &lt;a title="复制代码" href="http://vlinux.iteye.com/blog/472855#"&gt;&lt;img alt="复制代码" src="http://vlinux.iteye.com/images/icon_copy.gif" /&gt;&lt;/a&gt;&amp;nbsp;&lt;a title="收藏这段代码" href="http://www.cnblogs.com/freeliver54/admin/javascript:void()"&gt;&lt;img  alt="收藏代码" src="http://vlinux.iteye.com/images/icon_star.png" /&gt;&lt;img style="display: none"  alt="" src="http://vlinux.iteye.com/images/spinner.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;ol &gt;&lt;li&gt;&lt;span&gt;animationDrawable&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;AnimationDrawable(); &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Bitmap[]&amp;nbsp;bitmaps&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;Bitmap[PlayerConst.PLAYER_XIAOXUE_WALK_FRAME]; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;/span&gt;&lt;span &gt;for&lt;/span&gt;&lt;span&gt;&amp;nbsp;(&lt;/span&gt;&lt;span &gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;frame&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;&lt;font color="#c00000"&gt;0&lt;/font&gt;&lt;/span&gt;&lt;span&gt;;&amp;nbsp;frame&amp;nbsp;&amp;lt;&amp;nbsp;bitmaps.length;&amp;nbsp;frame++)&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Bitmap&amp;nbsp;bitmap&amp;nbsp;=&amp;nbsp;Bitmap.createBitmap(xiaoxueWalkSerBitmap,&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;frame*PlayerConst.PLAYER_XIAOXUE_WALK_WIDTH,&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lay*PlayerConst.PLAYER_XIAOXUE_WALK_HEIGHT,&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PlayerConst.PLAYER_XIAOXUE_WALK_WIDTH, &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PlayerConst.PLAYER_XIAOXUE_WALK_HEIGHT); &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;animationDrawable.addFrame(&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;BitmapDrawable(bitmap),&lt;/span&gt;&lt;span &gt;&lt;font color="#c00000"&gt;100&lt;/font&gt;&lt;/span&gt;&lt;span&gt;); &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;}&lt;/span&gt;&lt;span &gt;//&amp;nbsp;for,每层有&amp;nbsp;PLAYER_XIAOXUE_WALK_FRAME&amp;nbsp;帧 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;animationDrawable.setOneShot(&lt;/span&gt;&lt;span &gt;false&lt;/span&gt;&lt;span&gt;); &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;setBackgroundDrawable(animationDrawable);&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;pre style="display: none"  title="Android中的Frame动画" name="code" codeable_id="472855" codeable_type="Blog" source_url="http://vlinux.iteye.com/blog/472855" pre_index="1"&gt;animationDrawable = new AnimationDrawable();&#xD;
Bitmap[] bitmaps = new Bitmap[PlayerConst.PLAYER_XIAOXUE_WALK_FRAME];&#xD;
for (int frame = 0; frame &amp;lt; bitmaps.length; frame++) {&#xD;
	Bitmap bitmap = Bitmap.createBitmap(xiaoxueWalkSerBitmap, &#xD;
			frame*PlayerConst.PLAYER_XIAOXUE_WALK_WIDTH, &#xD;
			lay*PlayerConst.PLAYER_XIAOXUE_WALK_HEIGHT, &#xD;
			PlayerConst.PLAYER_XIAOXUE_WALK_WIDTH,&#xD;
			PlayerConst.PLAYER_XIAOXUE_WALK_HEIGHT);&#xD;
	animationDrawable.addFrame(new BitmapDrawable(bitmap),100);&#xD;
}// for,每层有 PLAYER_XIAOXUE_WALK_FRAME 帧&#xD;
animationDrawable.setOneShot(false);&#xD;
setBackgroundDrawable(animationDrawable);&lt;/pre&gt;&#xD;
&lt;p&gt;具体例子可以从附件中找到。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;3、SurfaceView动画。也许你很快就发现，前两个动画都必须依赖View才能展示，并且每个View只能展示一个动画。而在游戏中不可能只有一动画，更恐怖的是很多动画都是随机产生的，并不是事先约定好的，而动态创建／删除View的代价非常高，并不适合做高性能的游戏。这个时候你需要的是SurfaceView。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在SurfaceView中的动画有一点是和前边两种动画有区别的：那就是画布上所有的一切都必须自己亲自打理。在前边几个基于Animation的动画你只需关心当前动画的序列即可，其他都由系统帮你处理完毕。而在SurfaceView中，你就是那个处理程序，所有的一切包括背景都必须有你来亲自打理。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;为此我写了一个框架专门来处理这个琐事，框架只有两个类：AnimationDraw和DrawRunning。其中AnimationDraw则是一个动画类，它负责描述当前动画元素的位置、当前播放到第几帧、每帧的延时是多少、是否重复播放等。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;Java代码 &lt;a title="复制代码" href="http://vlinux.iteye.com/blog/472855#"&gt;&lt;img alt="复制代码" src="http://vlinux.iteye.com/images/icon_copy.gif" /&gt;&lt;/a&gt;&amp;nbsp;&lt;a title="收藏这段代码" href="http://www.cnblogs.com/freeliver54/admin/javascript:void()"&gt;&lt;img  alt="收藏代码" src="http://vlinux.iteye.com/images/icon_star.png" /&gt;&lt;img style="display: none"  alt="" src="http://vlinux.iteye.com/images/spinner.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;ol &gt;&lt;li&gt;&lt;span &gt;import&lt;/span&gt;&lt;span&gt;&amp;nbsp;java.util.Date; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;/span&gt;&lt;span &gt;import&lt;/span&gt;&lt;span&gt;&amp;nbsp;android.graphics.Bitmap; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;/span&gt;&lt;span &gt;/** &lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span &gt;&amp;nbsp;*&amp;nbsp;动画绘画元素 &lt;/span&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;span &gt;&amp;nbsp;*&amp;nbsp;@author&amp;nbsp;vlinux &lt;/span&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;span &gt;&amp;nbsp;* &lt;/span&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;span &gt;&amp;nbsp;*/&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;/span&gt;&lt;span &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;class&lt;/span&gt;&lt;span&gt;&amp;nbsp;AnimationDraw&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;protected&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;float&lt;/span&gt;&lt;span&gt;&amp;nbsp;x; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;protected&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;float&lt;/span&gt;&lt;span&gt;&amp;nbsp;y; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;protected&lt;/span&gt;&lt;span&gt;&amp;nbsp;Bitmap[]&amp;nbsp;bitmaps; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;protected&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;long&lt;/span&gt;&lt;span&gt;&amp;nbsp;duration; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;protected&lt;/span&gt;&lt;span&gt;&amp;nbsp;Long&amp;nbsp;lastBitmapTime; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;protected&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;int&lt;/span&gt;&lt;span&gt;&amp;nbsp;step; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;protected&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;boolean&lt;/span&gt;&lt;span&gt;&amp;nbsp;repeat; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;/** &lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;动画构造函数-for静态图片 &lt;/span&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;x:X坐标&amp;lt;br/&amp;gt; &lt;/span&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;y:Y坐标&amp;lt;br/&amp;gt; &lt;/span&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;bitmap:显示的图片&amp;lt;br/&amp;gt; &lt;/span&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;duration:图片显示的时间&amp;lt;br/&amp;gt; &lt;/span&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;AnimationDraw(&lt;/span&gt;&lt;span &gt;float&lt;/span&gt;&lt;span&gt;&amp;nbsp;x,&amp;nbsp;&lt;/span&gt;&lt;span &gt;float&lt;/span&gt;&lt;span&gt;&amp;nbsp;y,&amp;nbsp;Bitmap&amp;nbsp;bitmap,&amp;nbsp;&lt;/span&gt;&lt;span &gt;long&lt;/span&gt;&lt;span&gt;&amp;nbsp;duration)&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Bitmap[]&amp;nbsp;bitmaps&amp;nbsp;=&amp;nbsp;{bitmap}; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;this&lt;/span&gt;&lt;span&gt;.x&amp;nbsp;=&amp;nbsp;x; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;this&lt;/span&gt;&lt;span&gt;.y&amp;nbsp;=&amp;nbsp;y; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;this&lt;/span&gt;&lt;span&gt;.bitmaps&amp;nbsp;=&amp;nbsp;bitmaps; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;this&lt;/span&gt;&lt;span&gt;.duration&amp;nbsp;=&amp;nbsp;duration; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;this&lt;/span&gt;&lt;span&gt;.repeat&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;true&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lastBitmapTime&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;null&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;step&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;&lt;font color="#c00000"&gt;0&lt;/font&gt;&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;/** &lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;动画构造函数 &lt;/span&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;x:X坐标&amp;lt;br/&amp;gt; &lt;/span&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;y:Y坐标&amp;lt;br/&amp;gt; &lt;/span&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;bitmap:显示的图片&amp;lt;br/&amp;gt; &lt;/span&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;duration:图片显示的时间&amp;lt;br/&amp;gt; &lt;/span&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;@param&amp;nbsp;repeat:是否重复动画过程&amp;lt;br/&amp;gt; &lt;/span&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;span &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*/&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;AnimationDraw(&lt;/span&gt;&lt;span &gt;float&lt;/span&gt;&lt;span&gt;&amp;nbsp;x,&amp;nbsp;&lt;/span&gt;&lt;span &gt;float&lt;/span&gt;&lt;span&gt;&amp;nbsp;y,&amp;nbsp;Bitmap[]&amp;nbsp;bitmaps,&amp;nbsp;&lt;/span&gt;&lt;span &gt;long&lt;/span&gt;&lt;span&gt;&amp;nbsp;duration,&amp;nbsp;&lt;/span&gt;&lt;span &gt;boolean&lt;/span&gt;&lt;span&gt;&amp;nbsp;repeat)&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;this&lt;/span&gt;&lt;span&gt;.x&amp;nbsp;=&amp;nbsp;x; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;this&lt;/span&gt;&lt;span&gt;.y&amp;nbsp;=&amp;nbsp;y; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;this&lt;/span&gt;&lt;span&gt;.bitmaps&amp;nbsp;=&amp;nbsp;bitmaps; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;this&lt;/span&gt;&lt;span&gt;.duration&amp;nbsp;=&amp;nbsp;duration; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;this&lt;/span&gt;&lt;span&gt;.repeat&amp;nbsp;=&amp;nbsp;repeat; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lastBitmapTime&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;null&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;step&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;&lt;font color="#c00000"&gt;0&lt;/font&gt;&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;Bitmap&amp;nbsp;nextFrame()&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(step&amp;nbsp;&amp;gt;=&amp;nbsp;bitmaps.length)&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;//&amp;nbsp;判断step是否越界 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;if&lt;/span&gt;&lt;span&gt;(&amp;nbsp;!repeat&amp;nbsp;)&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;null&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;span &gt;else&lt;/span&gt;&lt;span&gt;&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lastBitmapTime&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;null&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;span &gt;//if &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;span &gt;//&amp;nbsp;if &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(&lt;/span&gt;&lt;span &gt;null&lt;/span&gt;&lt;span&gt;&amp;nbsp;==&amp;nbsp;lastBitmapTime)&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;//&amp;nbsp;第一次执行 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lastBitmapTime&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;Date().getTime(); &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;bitmaps[step&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;&lt;font color="#c00000"&gt;0&lt;/font&gt;&lt;/span&gt;&lt;span&gt;]; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;span &gt;//&amp;nbsp;if &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;//&amp;nbsp;第X次执行 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;long&lt;/span&gt;&lt;span&gt;&amp;nbsp;nowTime&amp;nbsp;=&amp;nbsp;System.currentTimeMillis(); &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(nowTime&amp;nbsp;-&amp;nbsp;lastBitmapTime&amp;nbsp;&amp;lt;=&amp;nbsp;duration)&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;//&amp;nbsp;如果还在duration的时间段内,则继续返回当前Bitmap &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;//&amp;nbsp;如果duration的值小于0,则表明永远不失效,一般用于背景 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;bitmaps[step]; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;span &gt;//&amp;nbsp;if &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;lastBitmapTime&amp;nbsp;=&amp;nbsp;nowTime; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;bitmaps[step++];&lt;/span&gt;&lt;span &gt;//&amp;nbsp;返回下一Bitmap &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;float&lt;/span&gt;&lt;span&gt;&amp;nbsp;getX()&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;x; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;float&lt;/span&gt;&lt;span&gt;&amp;nbsp;getY()&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;return&lt;/span&gt;&lt;span&gt;&amp;nbsp;y; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;pre style="display: none"  title="Android中的Frame动画" name="code" codeable_id="472855" codeable_type="Blog" source_url="http://vlinux.iteye.com/blog/472855" pre_index="2"&gt;import java.util.Date;&#xD;
&#xD;
import android.graphics.Bitmap;&#xD;
&#xD;
/**&#xD;
 * 动画绘画元素&#xD;
 * @author vlinux&#xD;
 *&#xD;
 */&#xD;
public class AnimationDraw {&#xD;
&#xD;
	protected float x;&#xD;
	protected float y;&#xD;
	protected Bitmap[] bitmaps;&#xD;
	protected long duration;&#xD;
	&#xD;
	protected Long lastBitmapTime;&#xD;
	protected int step;&#xD;
	protected boolean repeat;&#xD;
	&#xD;
	/**&#xD;
	 * 动画构造函数-for静态图片&#xD;
	 * @param x:X坐标&amp;lt;br/&amp;gt;&#xD;
	 * @param y:Y坐标&amp;lt;br/&amp;gt;&#xD;
	 * @param bitmap:显示的图片&amp;lt;br/&amp;gt;&#xD;
	 * @param duration:图片显示的时间&amp;lt;br/&amp;gt;&#xD;
	 */&#xD;
	public AnimationDraw(float x, float y, Bitmap bitmap, long duration) {&#xD;
		Bitmap[] bitmaps = {bitmap};&#xD;
		this.x = x;&#xD;
		this.y = y;&#xD;
		this.bitmaps = bitmaps;&#xD;
		this.duration = duration;&#xD;
		this.repeat = true;&#xD;
		lastBitmapTime = null;&#xD;
		step = 0;&#xD;
	}&#xD;
	&#xD;
	/**&#xD;
	 * 动画构造函数&#xD;
	 * @param x:X坐标&amp;lt;br/&amp;gt;&#xD;
	 * @param y:Y坐标&amp;lt;br/&amp;gt;&#xD;
	 * @param bitmap:显示的图片&amp;lt;br/&amp;gt;&#xD;
	 * @param duration:图片显示的时间&amp;lt;br/&amp;gt;&#xD;
	 * @param repeat:是否重复动画过程&amp;lt;br/&amp;gt;&#xD;
	 */&#xD;
	public AnimationDraw(float x, float y, Bitmap[] bitmaps, long duration, boolean repeat) {&#xD;
		this.x = x;&#xD;
		this.y = y;&#xD;
		this.bitmaps = bitmaps;&#xD;
		this.duration = duration;&#xD;
		this.repeat = repeat;&#xD;
		lastBitmapTime = null;&#xD;
		step = 0;&#xD;
	}&#xD;
	&#xD;
	&#xD;
	public Bitmap nextFrame() {&#xD;
&#xD;
		if (step &amp;gt;= bitmaps.length) {&#xD;
			// 判断step是否越界&#xD;
			if( !repeat ) {&#xD;
				return null;&#xD;
			} else {&#xD;
				lastBitmapTime = null;&#xD;
			}//if&#xD;
		}// if&#xD;
&#xD;
		if (null == lastBitmapTime) {&#xD;
			// 第一次执行&#xD;
			lastBitmapTime = new Date().getTime();&#xD;
			return bitmaps[step = 0];&#xD;
		}// if&#xD;
&#xD;
		// 第X次执行&#xD;
		long nowTime = System.currentTimeMillis();&#xD;
		if (nowTime - lastBitmapTime &amp;lt;= duration) {&#xD;
			// 如果还在duration的时间段内,则继续返回当前Bitmap&#xD;
			// 如果duration的值小于0,则表明永远不失效,一般用于背景&#xD;
			return bitmaps[step];&#xD;
		}// if&#xD;
		lastBitmapTime = nowTime;&#xD;
		return bitmaps[step++];// 返回下一Bitmap&#xD;
	}&#xD;
	&#xD;
	public float getX() {&#xD;
		return x;&#xD;
	}&#xD;
&#xD;
	public float getY() {&#xD;
		return y;&#xD;
	}&#xD;
	&#xD;
}&lt;/pre&gt;&amp;nbsp; &#xD;
&lt;p&gt;DrawRunning则是一个负责画图的线程，它是程序的核心。&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;Java代码 &lt;a title="复制代码" href="http://vlinux.iteye.com/blog/472855#"&gt;&lt;img alt="复制代码" src="http://vlinux.iteye.com/images/icon_copy.gif" /&gt;&lt;/a&gt;&amp;nbsp;&lt;a title="收藏这段代码" href="http://www.cnblogs.com/freeliver54/admin/javascript:void()"&gt;&lt;img  alt="收藏代码" src="http://vlinux.iteye.com/images/icon_star.png" /&gt;&lt;img style="display: none"  alt="" src="http://vlinux.iteye.com/images/spinner.gif" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;ol &gt;&lt;li&gt;&lt;span &gt;import&lt;/span&gt;&lt;span&gt;&amp;nbsp;java.util.ArrayList; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;/span&gt;&lt;span &gt;import&lt;/span&gt;&lt;span&gt;&amp;nbsp;java.util.Iterator; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;/span&gt;&lt;span &gt;import&lt;/span&gt;&lt;span&gt;&amp;nbsp;java.util.List; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;/span&gt;&lt;span &gt;import&lt;/span&gt;&lt;span&gt;&amp;nbsp;android.graphics.Bitmap; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;/span&gt;&lt;span &gt;import&lt;/span&gt;&lt;span&gt;&amp;nbsp;android.graphics.Canvas; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;/span&gt;&lt;span &gt;import&lt;/span&gt;&lt;span&gt;&amp;nbsp;android.view.SurfaceHolder; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;/span&gt;&lt;span &gt;/** &lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span &gt;&amp;nbsp;*&amp;nbsp;绘画线程 &lt;/span&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;span &gt;&amp;nbsp;*&amp;nbsp; &lt;/span&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;span &gt;&amp;nbsp;*&amp;nbsp;@author&amp;nbsp;vlinux &lt;/span&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;span &gt;&amp;nbsp;*&amp;nbsp; &lt;/span&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;span &gt;&amp;nbsp;*/&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&lt;/span&gt;&lt;span &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;class&lt;/span&gt;&lt;span&gt;&amp;nbsp;DrawRunning&amp;nbsp;&lt;/span&gt;&lt;span &gt;implements&lt;/span&gt;&lt;span&gt;&amp;nbsp;Runnable&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;private&lt;/span&gt;&lt;span&gt;&amp;nbsp;List&amp;lt;AnimationDraw&amp;gt;&amp;nbsp;animationDraws;&lt;/span&gt;&lt;span &gt;//所有需要画动画的集合 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;private&lt;/span&gt;&lt;span&gt;&amp;nbsp;List&amp;lt;AnimationDraw&amp;gt;&amp;nbsp;buffers;&lt;/span&gt;&lt;span &gt;//缓存前台传入需要展示的动画 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;private&lt;/span&gt;&lt;span&gt;&amp;nbsp;SurfaceHolder&amp;nbsp;surfaceHolder; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;private&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;boolean&lt;/span&gt;&lt;span&gt;&amp;nbsp;running; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;DrawRunning(SurfaceHolder&amp;nbsp;surfaceHolder)&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;this&lt;/span&gt;&lt;span&gt;.surfaceHolder&amp;nbsp;=&amp;nbsp;surfaceHolder; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;animationDraws&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;ArrayList&amp;lt;AnimationDraw&amp;gt;(); &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buffers&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;new&lt;/span&gt;&lt;span&gt;&amp;nbsp;ArrayList&amp;lt;AnimationDraw&amp;gt;(); &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;running&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;true&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;&lt;font color="#646464"&gt;@Override&lt;/font&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;run()&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;//&amp;nbsp;TODO&amp;nbsp;Auto-generated&amp;nbsp;method&amp;nbsp;stub &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;while&lt;/span&gt;&lt;span&gt;&amp;nbsp;(running)&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;synchronized&lt;/span&gt;&lt;span&gt;&amp;nbsp;(surfaceHolder)&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Canvas&amp;nbsp;canvas&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;null&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;try&lt;/span&gt;&lt;span&gt;&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;canvas&amp;nbsp;=&amp;nbsp;surfaceHolder.lockCanvas(&lt;/span&gt;&lt;span &gt;null&lt;/span&gt;&lt;span&gt;); &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;doDraw(canvas); &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;span &gt;finally&lt;/span&gt;&lt;span&gt;&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(&lt;/span&gt;&lt;span &gt;null&lt;/span&gt;&lt;span&gt;&amp;nbsp;!=&amp;nbsp;canvas)&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;surfaceHolder.unlockCanvasAndPost(canvas); &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;span &gt;//&amp;nbsp;if &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;span &gt;//&amp;nbsp;try &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;span &gt;//&amp;nbsp;syn &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;span &gt;//&amp;nbsp;while &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;private&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;doDraw(Canvas&amp;nbsp;canvas)&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;synchronized&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span &gt;this&lt;/span&gt;&lt;span&gt;)&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;//检查缓存中是否有需要加入的动画 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;if&lt;/span&gt;&lt;span&gt;(&amp;nbsp;!buffers.isEmpty()&amp;nbsp;)&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;animationDraws.addAll(buffers);&lt;/span&gt;&lt;span &gt;//加入animationDraws &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buffers.clear();&lt;/span&gt;&lt;span &gt;//清空缓存 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;span &gt;//if &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;span &gt;//syn &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;if&lt;/span&gt;&lt;span&gt;(&amp;nbsp;animationDraws.isEmpty()&amp;nbsp;)&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;return&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span &gt;//如果animationDraws里面是空的那就不用画了 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;span &gt;//if &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;//---这里开始绘画 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Iterator&amp;lt;AnimationDraw&amp;gt;&amp;nbsp;bombIt&amp;nbsp;=&amp;nbsp;animationDraws.iterator(); &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;while&lt;/span&gt;&lt;span&gt;&amp;nbsp;(bombIt.hasNext())&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AnimationDraw&amp;nbsp;bomb&amp;nbsp;=&amp;nbsp;bombIt.next(); &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Bitmap&amp;nbsp;nextFrame&amp;nbsp;=&amp;nbsp;bomb.nextFrame(); &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;if&lt;/span&gt;&lt;span&gt;&amp;nbsp;(&lt;/span&gt;&lt;span &gt;null&lt;/span&gt;&lt;span&gt;&amp;nbsp;==&amp;nbsp;nextFrame)&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;//下一Frame为null，说明动画序列已经结束 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;//该动画已经完成，从动画集合中删除 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bombIt.remove(); &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;continue&lt;/span&gt;&lt;span&gt;;&lt;/span&gt;&lt;span &gt;//while &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;span &gt;//&amp;nbsp;if &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;canvas.drawBitmap(nextFrame,&amp;nbsp;bomb.getX(),&amp;nbsp;bomb.getY(),&amp;nbsp;&lt;/span&gt;&lt;span &gt;null&lt;/span&gt;&lt;span&gt;); &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;span &gt;//&amp;nbsp;while &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;addAnimationDraw(AnimationDraw&amp;nbsp;bomb)&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;synchronized&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span &gt;this&lt;/span&gt;&lt;span&gt;)&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;//尽量减少这个的同步响应时间，因为这个方法是前台响应的 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;//多0.1秒都会直接反应到用户感知 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buffers.add(bomb);&lt;/span&gt;&lt;span &gt;//将需要显示动画的内容加入到缓存 &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;span &gt;//syn &lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span &gt;public&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span &gt;void&lt;/span&gt;&lt;span&gt;&amp;nbsp;stopDrawing()&amp;nbsp;{ &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;running&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span &gt;false&lt;/span&gt;&lt;span&gt;; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;}&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;pre style="display: none"  title="Android中的Frame动画" name="code" codeable_id="472855" codeable_type="Blog" source_url="http://vlinux.iteye.com/blog/472855" pre_index="3"&gt;import java.util.ArrayList;&#xD;
import java.util.Iterator;&#xD;
import java.util.List;&#xD;
&#xD;
import android.graphics.Bitmap;&#xD;
import android.graphics.Canvas;&#xD;
import android.view.SurfaceHolder;&#xD;
&#xD;
/**&#xD;
 * 绘画线程&#xD;
 * &#xD;
 * @author vlinux&#xD;
 * &#xD;
 */&#xD;
public class DrawRunning implements Runnable {&#xD;
&#xD;
	private List&amp;lt;AnimationDraw&amp;gt; animationDraws;//所有需要画动画的集合&#xD;
	private List&amp;lt;AnimationDraw&amp;gt; buffers;//缓存前台传入需要展示的动画&#xD;
	private SurfaceHolder surfaceHolder;&#xD;
	private boolean running;&#xD;
&#xD;
	public DrawRunning(SurfaceHolder surfaceHolder) {&#xD;
		this.surfaceHolder = surfaceHolder;&#xD;
		animationDraws = new ArrayList&amp;lt;AnimationDraw&amp;gt;();&#xD;
		buffers = new ArrayList&amp;lt;AnimationDraw&amp;gt;();&#xD;
		running = true;&#xD;
	}&#xD;
&#xD;
	@Override&#xD;
	public void run() {&#xD;
		// TODO Auto-generated method stub&#xD;
		while (running) {&#xD;
			synchronized (surfaceHolder) {&#xD;
				Canvas canvas = null;&#xD;
				try {&#xD;
					canvas = surfaceHolder.lockCanvas(null);&#xD;
					doDraw(canvas);&#xD;
				} finally {&#xD;
					if (null != canvas) {&#xD;
						surfaceHolder.unlockCanvasAndPost(canvas);&#xD;
					}// if&#xD;
				}// try&#xD;
			}// syn&#xD;
		}// while&#xD;
	}&#xD;
&#xD;
	private void doDraw(Canvas canvas) {&#xD;
		synchronized(this) {&#xD;
			//检查缓存中是否有需要加入的动画&#xD;
			if( !buffers.isEmpty() ) {&#xD;
				animationDraws.addAll(buffers);//加入animationDraws&#xD;
				buffers.clear();//清空缓存&#xD;
			}//if&#xD;
		}//syn&#xD;
		if( animationDraws.isEmpty() ) {&#xD;
			return;//如果animationDraws里面是空的那就不用画了&#xD;
		}//if&#xD;
		//---这里开始绘画&#xD;
		Iterator&amp;lt;AnimationDraw&amp;gt; bombIt = animationDraws.iterator();&#xD;
		while (bombIt.hasNext()) {&#xD;
			AnimationDraw bomb = bombIt.next();&#xD;
			Bitmap nextFrame = bomb.nextFrame();&#xD;
			if (null == nextFrame) {&#xD;
				//下一Frame为null，说明动画序列已经结束&#xD;
				//该动画已经完成，从动画集合中删除&#xD;
				bombIt.remove();&#xD;
				continue;//while&#xD;
			}// if&#xD;
			canvas.drawBitmap(nextFrame, bomb.getX(), bomb.getY(), null);&#xD;
		}// while&#xD;
	}&#xD;
&#xD;
	public void addAnimationDraw(AnimationDraw bomb) {&#xD;
		synchronized(this) {&#xD;
			//尽量减少这个的同步响应时间，因为这个方法是前台响应的&#xD;
			//多0.1秒都会直接反应到用户感知&#xD;
			buffers.add(bomb);//将需要显示动画的内容加入到缓存&#xD;
		}//syn&#xD;
	}&#xD;
&#xD;
	public void stopDrawing() {&#xD;
		running = false;&#xD;
	}&#xD;
&#xD;
}&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;值得注意的是，我用了一个缓存和两个synchronized来提高前台的响应以及确保对集合类、SurfaceHolder的正确操作。&lt;/p&gt;&#xD;
&lt;p&gt;例子可以见附件。&lt;/p&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&#xD;
&lt;ul style="display: none"&gt;&lt;li&gt;&lt;a href="http://dl.iteye.com/upload/attachment/0014/8761/b16aec32-2891-3fdf-9823-bc51d849ae44.png" target="_blank"&gt;&lt;img  title="点击查看原始大小图片" alt="" src="http://dl.iteye.com/upload/attachment/0014/8761/b16aec32-2891-3fdf-9823-bc51d849ae44-thumb.png" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;大小: 8 KB &lt;/li&gt;&lt;/ul&gt;&#xD;
&lt;ul style="display: none"&gt;&lt;li&gt;&lt;a href="http://dl.iteye.com/upload/attachment/0014/8763/b4638746-9278-3b8d-bcd5-f1b10f24895a.png" target="_blank"&gt;&lt;img  title="点击查看原始大小图片" alt="" src="http://dl.iteye.com/upload/attachment/0014/8763/b4638746-9278-3b8d-bcd5-f1b10f24895a-thumb.png" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;描述: 小雪行走序列图&lt;/li&gt;&lt;li&gt;大小: 38 KB &lt;/li&gt;&lt;/ul&gt;&#xD;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://dl.iteye.com/topics/download/6be2a3c2-ff00-3b58-b715-8fbf386176eb"&gt;PlayerDemo.tar.gz&lt;/a&gt; (57.8 KB)&lt;/li&gt;&lt;li&gt;描述: 例子2&lt;/li&gt;&lt;li&gt;下载次数: 425 &lt;/li&gt;&lt;/ul&gt;&#xD;
&lt;ul&gt;&lt;li&gt;&lt;a href="http://dl.iteye.com/topics/download/204923de-30e0-35dc-a7b4-edf0db76e032"&gt;TouchBombDemo.tar.gz&lt;/a&gt; (680.9 KB)&lt;/li&gt;&lt;li&gt;描述: 例子3&lt;/li&gt;&lt;li&gt;下载次数: 490 &lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/freeliver54/aggbug/2336586.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/freeliver54/archive/2012/02/03/2336586.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/freeliver54/archive/2012/02/03/2336518.html</id><title type="text">[转]Android API学习 SoundPool 和 MediaPlayer</title><summary type="text">本文转自：http://dev.10086.cn/cmdn/wiki/index.php?doc-view-5522.htmlAndroid平台中关于音频播放有以下两种方式： 1. SoundPool —— 适合短促且对反应速度比较高的情况(游戏音效或按键声等) 2. MediaPlayer —— 适合比较长且对时间要求不高的情况 ------------------------------------------------------------------------------------------- SoundPool 1. 创建一个SoundPool public S...</summary><published>2012-02-03T01:20:00Z</published><updated>2012-02-03T01:20:00Z</updated><author><name>freeliver54</name><uri>http://www.cnblogs.com/freeliver54/</uri></author><link rel="alternate" href="http://www.cnblogs.com/freeliver54/archive/2012/02/03/2336518.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/freeliver54/archive/2012/02/03/2336518.html"/><content type="html">&lt;p&gt;本文转自：&lt;a href="http://dev.10086.cn/cmdn/wiki/index.php?doc-view-5522.html" target="_blank"&gt;http://dev.10086.cn/cmdn/wiki/index.php?doc-view-5522.html&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;div&gt;&lt;span style="font-size: 14px"&gt;&#xD;
&lt;p&gt;Android平台中关于音频播放有以下两种方式：&lt;/p&gt;&#xD;
&lt;p&gt;1. SoundPool &amp;#8212;&amp;#8212; 适合短促且对反应速度比较高的情况(游戏音效或按键声等)&lt;/p&gt;&#xD;
&lt;p&gt;2. MediaPlayer &amp;#8212;&amp;#8212; 适合比较长且对时间要求不高的情况&lt;/p&gt;&#xD;
&lt;p&gt;-------------------------------------------------------------------------------------------&lt;/p&gt;&#xD;
&lt;p&gt;SoundPool&lt;/p&gt;&#xD;
&lt;p&gt;1. 创建一个SoundPool&lt;/p&gt;&#xD;
&lt;p&gt;public SoundPool(int maxStream, int streamType, int srcQuality)&lt;/p&gt;&#xD;
&lt;p&gt;maxStream &amp;#8212;&amp;#8212; 同时播放的流的最大数量&lt;/p&gt;&#xD;
&lt;p&gt;streamType &amp;#8212;&amp;#8212; 流的类型，一般为STREAM_MUSIC(具体在AudioManager类中列出)&lt;/p&gt;&#xD;
&lt;p&gt;srcQuality &amp;#8212;&amp;#8212; 采样率转化质量，当前无效果，使用0作为默认值&lt;/p&gt;&#xD;
&lt;p&gt;eg.&lt;/p&gt;&#xD;
&lt;p&gt;SoundPool soundPool = new SoundPool(3, AudioManager.STREAM_MUSIC, 0);&lt;/p&gt;&#xD;
&lt;p&gt;创建了一个最多支持3个流同时播放的，类型标记为音乐的SoundPool。&lt;/p&gt;&#xD;
&lt;p&gt;2. 加载音频资源&lt;/p&gt;&#xD;
&lt;p&gt;可以通过四种途径来记载一个音频资源：&lt;/p&gt;&#xD;
&lt;p&gt;int load(AssetFileDescriptor afd, int priority)&lt;/p&gt;&#xD;
&lt;p&gt;通过一个AssetFileDescriptor对象&lt;/p&gt;&#xD;
&lt;p&gt;int load(Context context, int resId, int priority)&lt;/p&gt;&#xD;
&lt;p&gt;通过一个资源ID&lt;/p&gt;&#xD;
&lt;p&gt;int load(String path, int priority)&lt;/p&gt;&#xD;
&lt;p&gt;通过指定的路径加载&lt;/p&gt;&#xD;
&lt;p&gt;int load(FileDescriptor fd, long offset, long length, int priority)&lt;/p&gt;&#xD;
&lt;p&gt;通过FileDescriptor加载&lt;/p&gt;&#xD;
&lt;p&gt;*API中指出，其中的priority参数目前没有效果，建议设置为1。&lt;/p&gt;&#xD;
&lt;p&gt;一个SoundPool能同时管理多个音频，所以可以通过多次调用load函数来记载，如果记载成功将返回一个非0的soundID ，用于播放时指定特定的音频。&lt;/p&gt;&#xD;
&lt;p&gt;eg.&lt;/p&gt;&#xD;
&lt;p&gt;int soundID1 = soundPool.load(this, R.raw.sound1, 1);&lt;/p&gt;&#xD;
&lt;p&gt;if(soundID1 ==0){&lt;/p&gt;&#xD;
&lt;p&gt;// 记载失败&lt;/p&gt;&#xD;
&lt;p&gt;}else{&lt;/p&gt;&#xD;
&lt;p&gt;// 加载成功&lt;/p&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;int soundID2 = soundPool.load(this, R.raw.sound2, 1);&lt;/p&gt;&#xD;
&lt;p&gt;...&lt;/p&gt;&#xD;
&lt;p&gt;这里加载了两个流，并分别记录了返回的soundID 。&lt;/p&gt;&#xD;
&lt;p&gt;需要注意的是，&lt;/p&gt;&#xD;
&lt;p&gt;流的加载过程是一个将音频解压为原始16位PCM数据的过程，由一个后台线程来进行处理异步，所以初始化后不能立即播放，需要等待一点时间。&lt;/p&gt;&#xD;
&lt;p&gt;3. 播放控制&lt;/p&gt;&#xD;
&lt;p&gt;有以下几个函数可用于控制播放：&lt;/p&gt;&#xD;
&lt;p&gt;final int play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)&lt;/p&gt;&#xD;
&lt;p&gt;播放指定音频的音效，并返回一个streamID 。&lt;/p&gt;&#xD;
&lt;p&gt;priority &amp;#8212;&amp;#8212; 流的优先级，值越大优先级高，影响当同时播放数量超出了最大支持数时SoundPool对该流的处理;&lt;/p&gt;&#xD;
&lt;p&gt;loop &amp;#8212;&amp;#8212; 循环播放的次数，0为值播放一次，-1为无限循环，其他值为播放loop+1次(例如，3为一共播放4次).&lt;/p&gt;&#xD;
&lt;p&gt;rate &amp;#8212;&amp;#8212; 播放的速率，范围0.5-2.0(0.5为一半速率，1.0为正常速率，2.0为两倍速率)&lt;/p&gt;&#xD;
&lt;p&gt;final void pause(int streamID)&lt;/p&gt;&#xD;
&lt;p&gt;暂停指定播放流的音效(streamID 应通过play()返回)。&lt;/p&gt;&#xD;
&lt;p&gt;final void resume(int streamID)&lt;/p&gt;&#xD;
&lt;p&gt;继续播放指定播放流的音效(streamID 应通过play()返回)。&lt;/p&gt;&#xD;
&lt;p&gt;final void stop(int streamID)&lt;/p&gt;&#xD;
&lt;p&gt;终止指定播放流的音效(streamID 应通过play()返回)。&lt;/p&gt;&#xD;
&lt;p&gt;这里需要注意的是，&lt;/p&gt;&#xD;
&lt;p&gt;1.play()函数传递的是一个load()返回的soundID&amp;#8212;&amp;#8212;指向一个被记载的音频资源 ，如果播放成功则返回一个非0的streamID&amp;#8212;&amp;#8212;指向一个成功播放的流 ;同一个soundID 可以通过多次调用play()而获得多个不同的streamID (只要不超出同时播放的最大数量);&lt;/p&gt;&#xD;
&lt;p&gt;2.pause()、resume()和stop()是针对播放流操作的，传递的是play()返回的streamID ;&lt;/p&gt;&#xD;
&lt;p&gt;3.play()中的priority参数，只在同时播放的流的数量超过了预先设定的最大数量是起作用，管理器将自动终止优先级低的播放流。如果存在多个同样优先级的流，再进一步根据其创建事件来处理，新创建的流的年龄是最小的，将被终止;&lt;/p&gt;&#xD;
&lt;p&gt;4.无论如何，程序退出时，手动终止播放并释放资源是必要的。&lt;/p&gt;&#xD;
&lt;p&gt;eg.&lt;/p&gt;&#xD;
&lt;p&gt;//这里对soundID1的音效进行播放&amp;#8212;&amp;#8212;优先级为0(最低)，无限循环，正常速率。&lt;/p&gt;&#xD;
&lt;p&gt;int streamID = soundPool.play(soundID1 , 1.0, 1.0, 0, -1, 1.0);&lt;/p&gt;&#xD;
&lt;p&gt;if(streamID ==0){&lt;/p&gt;&#xD;
&lt;p&gt;// 播放失败&lt;/p&gt;&#xD;
&lt;p&gt;}else{&lt;/p&gt;&#xD;
&lt;p&gt;// 播放成功&lt;/p&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;...&lt;/p&gt;&#xD;
&lt;p&gt;// 暂停soundID1的播放&lt;/p&gt;&#xD;
&lt;p&gt;soundPool.pause(streamID );&lt;/p&gt;&#xD;
&lt;p&gt;...&lt;/p&gt;&#xD;
&lt;p&gt;// 恢复soundID1的播放&lt;/p&gt;&#xD;
&lt;p&gt;soundPool.resume(streamID );&lt;/p&gt;&#xD;
&lt;p&gt;...&lt;/p&gt;&#xD;
&lt;p&gt;// 终止播放，记住循环为-1时必须手动停止&lt;/p&gt;&#xD;
&lt;p&gt;soundPool.stop(streamID );&lt;/p&gt;&#xD;
&lt;p&gt;*API中指出，即使使用无效的soundID /streamID (操作失败或指向无效的资源)来调用相关函数也不会导致错误，这样能减轻逻辑的处理。&lt;/p&gt;&#xD;
&lt;p&gt;4. 更多属性设置&lt;/p&gt;&#xD;
&lt;p&gt;其实就是paly()中的一些参数的独立设置：&lt;/p&gt;&#xD;
&lt;p&gt;final void setLoop(int streamID, int loop)&lt;/p&gt;&#xD;
&lt;p&gt;设置指定播放流的循环.&lt;/p&gt;&#xD;
&lt;p&gt;final void setVolume(int streamID, float leftVolume, float rightVolume)&lt;/p&gt;&#xD;
&lt;p&gt;设置指定播放流的音量.&lt;/p&gt;&#xD;
&lt;p&gt;final void setPriority(int streamID, int priority)&lt;/p&gt;&#xD;
&lt;p&gt;设置指定播放流的优先级，上面已说明priority的作用.&lt;/p&gt;&#xD;
&lt;p&gt;final void setRate(int streamID, float rate)&lt;/p&gt;&#xD;
&lt;p&gt;设置指定播放流的速率，0.5-2.0.&lt;/p&gt;&#xD;
&lt;p&gt;5. 释放资源&lt;/p&gt;&#xD;
&lt;p&gt;可操作的函数有：&lt;/p&gt;&#xD;
&lt;p&gt;final boolean unload(int soundID)&lt;/p&gt;&#xD;
&lt;p&gt;卸载一个指定的音频资源.&lt;/p&gt;&#xD;
&lt;p&gt;final void release()&lt;/p&gt;&#xD;
&lt;p&gt;释放SoundPool中的所有音频资源.&lt;/p&gt;&#xD;
&lt;p&gt;-汇总-&lt;/p&gt;&#xD;
&lt;p&gt;一个SoundPool可以：&lt;/p&gt;&#xD;
&lt;p&gt;1.管理多个音频资源，通过load()函数，成功则返回非0的soundID;&lt;/p&gt;&#xD;
&lt;p&gt;2.同时播放多个音频，通过play()函数，成功则返回非0的streamID;&lt;/p&gt;&#xD;
&lt;p&gt;3.pause()、resume()和stop()等操作是针对streamID(播放流)的;&lt;/p&gt;&#xD;
&lt;p&gt;4.当设置为无限循环时，需要手动调用stop()来终止播放;&lt;/p&gt;&#xD;
&lt;p&gt;5.播放流的优先级(play()中的priority参数)，只在同时播放数超过设定的最大数时起作用;&lt;/p&gt;&#xD;
&lt;p&gt;6.程序中不用考虑(play触发的)播放流的生命周期，无效的soundID/streamID不会导致程序错误。&lt;/p&gt;&#xD;
&lt;p&gt;-------------------------------------------------------------------------------------------&lt;/p&gt;&#xD;
&lt;p&gt;MediaPlayer&lt;/p&gt;&#xD;
&lt;p&gt;你可以通过new或便捷的静态create函数组来创建一个MediaPlayer对象。&lt;/p&gt;&#xD;
&lt;p&gt;两种方式的比较：&lt;/p&gt;&#xD;
&lt;p&gt;new MediaPlayer()&lt;/p&gt;&#xD;
&lt;p&gt;1.成功调用后，MediaPlayer将处于Idle状态;&lt;/p&gt;&#xD;
&lt;p&gt;2.setDataSource提供了对String(path)、Uri和FileDescriptor格式的资源路径的支持;&lt;/p&gt;&#xD;
&lt;p&gt;3.后续需要手动调用prepare()才能进行播放。&lt;/p&gt;&#xD;
&lt;p&gt;MediaPlayer.create(...)&lt;/p&gt;&#xD;
&lt;p&gt;1.成功调用后，MediaPlayer将处于Prepared状态;&lt;/p&gt;&#xD;
&lt;p&gt;2.create提供了对int(resID)和Uri格式的资源路径的支持;&lt;/p&gt;&#xD;
&lt;p&gt;3.无需(也不能)再次调用prepare()就能直接播放。&lt;br /&gt;　要点：&lt;/p&gt;&#xD;
&lt;p&gt;1.如果由于错误的操作mp.setDataSource("/sdcard/test.mp3"); // 直接传URL也是可以的，将自动处理缓冲&lt;/p&gt;&#xD;
&lt;p&gt;} catch (IllegalArgumentException e) {&lt;/p&gt;&#xD;
&lt;p&gt;e.printStackTrace();&lt;/p&gt;&#xD;
&lt;p&gt;} catch (IllegalStateException e) {&lt;/p&gt;&#xD;
&lt;p&gt;// 如果在非Idle状态下调用setDataSource就会导致该异常&lt;/p&gt;&#xD;
&lt;p&gt;e.printStackTrace();&lt;/p&gt;&#xD;
&lt;p&gt;} catch (IOException e) {&lt;/p&gt;&#xD;
&lt;p&gt;e.printStackTrace();&lt;/p&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;// 设置必要的监听器&lt;/p&gt;&#xD;
&lt;p&gt;mp.setOnPreparedListener(new OnPreparedListener(){&lt;/p&gt;&#xD;
&lt;p&gt;@Override&lt;/p&gt;&#xD;
&lt;p&gt;public void onPrepared(MediaPlayer mp) {&lt;/p&gt;&#xD;
&lt;p&gt;// 这时能确保player处于Prepared状态，触发start是最合适的&lt;/p&gt;&#xD;
&lt;p&gt;mp.start();&lt;/p&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;});&lt;/p&gt;&#xD;
&lt;p&gt;mp.setOnCompletionListener(new OnCompletionListener() {&lt;/p&gt;&#xD;
&lt;p&gt;@Override&lt;/p&gt;&#xD;
&lt;p&gt;public void onCompletion(MediaPlayer mp) {&lt;/p&gt;&#xD;
&lt;p&gt;// 正常播放结束，可以触发播放下一首&lt;/p&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;});&lt;/p&gt;&#xD;
&lt;p&gt;mp.setOnErrorListener(new OnErrorListener() {&lt;/p&gt;&#xD;
&lt;p&gt;@Override&lt;/p&gt;&#xD;
&lt;p&gt;public boolean onError(MediaPlayer mp, int what, intextra) {&lt;/p&gt;&#xD;
&lt;p&gt;// 操作错误或其他原因导致的错误会在这里被通知&lt;/p&gt;&#xD;
&lt;p&gt;return true;&lt;/p&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;});&lt;/p&gt;&#xD;
&lt;p&gt;// 连接并加载资源&lt;/p&gt;&#xD;
&lt;p&gt;try {&lt;/p&gt;&#xD;
&lt;p&gt;mp.prepare();&lt;/p&gt;&#xD;
&lt;p&gt;// mp.prepareAsync() 这也是可以的，这是异步处理，上面的是同步处理，实际加载完毕以OnPreparedListener.onPrepared()为准。&lt;/p&gt;&#xD;
&lt;p&gt;} catch (IllegalStateException e) {&lt;/p&gt;&#xD;
&lt;p&gt;e.printStackTrace();&lt;/p&gt;&#xD;
&lt;p&gt;} catch (IOException e) {&lt;/p&gt;&#xD;
&lt;p&gt;e.printStackTrace();&lt;/p&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;// mp.start(); // 建议在OnPreparedListener.onPrepared()回调中触发该函数，特别是使用异步加载时&lt;/p&gt;&#xD;
&lt;p&gt;/**&lt;/p&gt;&#xD;
&lt;p&gt;* ... 你的其他操作 ...&lt;/p&gt;&#xD;
&lt;p&gt;*/&lt;/p&gt;&#xD;
&lt;p&gt;// 终止播放并释放资源&lt;/p&gt;&#xD;
&lt;p&gt;try{&lt;/p&gt;&#xD;
&lt;p&gt;mp.stop(); // 这是必要的，如果你设置了循环播放，否则程序退出了音乐仍在后台继续播...&lt;/p&gt;&#xD;
&lt;p&gt;mp.release();&lt;/p&gt;&#xD;
&lt;p&gt;}catch(IllegalStateException e){&lt;/p&gt;&#xD;
&lt;p&gt;e.printStackTrace();&lt;/p&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;// 通过new创建后的player处于Idle状态&lt;/p&gt;&#xD;
&lt;p&gt;导致MediaPlayer处于Error状态，可通过reset()函数来使其恢复到Idle状态，再重新执行setDataSource等初始化操作(ps:如果是通过create函数绑定资源ID创建的就郁闷了...);&lt;/p&gt;&#xD;
&lt;p&gt;2.API中指出虽然reset后的MediaPlayer就像相当于新new的一样，但存在微妙的差异的：&lt;/p&gt;&#xD;
&lt;p&gt;在这两种情况下播放器处于Idle状态，此时调用getCurrentPosition(), getDuration(),getVideoHeight(),getVideoWidth(), setAudioStreamType(int),setLooping(boolean), setVolume(float, float), pause(), start(), stop(),seekTo(int), prepare() 或 prepareAsync() 等函数都属与编程错误。当在MediaPlayer刚创建后调用这些函数，用户指定的OnErrorListener.onError() 回调函数不会被internal player engine(内部播放引擎)调用，并且播放器的状态依然未变;但如果是在调用reset() 函数之后，用户指定的OnErrorListener.onError() 回调函数将会被internal player engine(内部播放引擎)调用，并且播放器的状态将转变为Error(错误)状态。&lt;/p&gt;&#xD;
&lt;p&gt;3.使用完毕后应该立即调用release()函数来释放资源，如果操作成功，MediaPlayer对象将处于End状态，此时无法再进行任何操作，除非重新创建MediaPlayer对象。&lt;/p&gt;&#xD;
&lt;p&gt;更多的细节通过一个用new方式来创建的示例说明:&lt;/p&gt;&#xD;
&lt;p&gt;Java代码&lt;/p&gt;&#xD;
&lt;p&gt;// 通过new创建后的player处于Idle状态&lt;/p&gt;&#xD;
&lt;p&gt;MediaPlayer mp = new MediaPlayer();&lt;/p&gt;&#xD;
&lt;p&gt;if(mp==null){&lt;/p&gt;&#xD;
&lt;p&gt;// new创建有可能会返回null值，检测是好的习惯&lt;/p&gt;&#xD;
&lt;p&gt;return;&lt;/p&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;// 设置资源路径，成功执行的话player将处于Initialized状态&lt;/p&gt;&#xD;
&lt;p&gt;try {&lt;/p&gt;&#xD;
&lt;p&gt;MediaPlayer mp = new MediaPlayer();&lt;/p&gt;&#xD;
&lt;p&gt;if(mp==null){&lt;/p&gt;&#xD;
&lt;p&gt;// new创建有可能会返回null值，检测是好的习惯&lt;/p&gt;&#xD;
&lt;p&gt;return;&lt;/p&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;// 设置资源路径，成功执行的话player将处于Initialized状态&lt;/p&gt;&#xD;
&lt;p&gt;try {&lt;/p&gt;&#xD;
&lt;p&gt;mp.setDataSource("/sdcard/test.mp3"); // 直接传URL也是可以的，将自动处理缓冲&lt;/p&gt;&#xD;
&lt;p&gt;} catch (IllegalArgumentException e) {&lt;/p&gt;&#xD;
&lt;p&gt;e.printStackTrace();&lt;/p&gt;&#xD;
&lt;p&gt;} catch (IllegalStateException e) {&lt;/p&gt;&#xD;
&lt;p&gt;// 如果在非Idle状态下调用setDataSource就会导致该异常&lt;/p&gt;&#xD;
&lt;p&gt;e.printStackTrace();&lt;/p&gt;&#xD;
&lt;p&gt;} catch (IOException e) {&lt;/p&gt;&#xD;
&lt;p&gt;e.printStackTrace();&lt;/p&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;// 设置必要的监听器&lt;/p&gt;&#xD;
&lt;p&gt;mp.setOnPreparedListener(new OnPreparedListener(){&lt;/p&gt;&#xD;
&lt;p&gt;@Override&lt;/p&gt;&#xD;
&lt;p&gt;public void onPrepared(MediaPlayer mp) {&lt;/p&gt;&#xD;
&lt;p&gt;// 这时能确保player处于Prepared状态，触发start是最合适的&lt;/p&gt;&#xD;
&lt;p&gt;mp.start();&lt;/p&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;});&lt;/p&gt;&#xD;
&lt;p&gt;mp.setOnCompletionListener(new OnCompletionListener() {&lt;/p&gt;&#xD;
&lt;p&gt;@Override&lt;/p&gt;&#xD;
&lt;p&gt;public void onCompletion(MediaPlayer mp) {&lt;/p&gt;&#xD;
&lt;p&gt;// 正常播放结束，可以触发播放下一首&lt;/p&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;});&lt;/p&gt;&#xD;
&lt;p&gt;mp.setOnErrorListener(new OnErrorListener() {&lt;/p&gt;&#xD;
&lt;p&gt;@Override&lt;/p&gt;&#xD;
&lt;p&gt;public boolean onError(MediaPlayer mp, int what, intextra) {&lt;/p&gt;&#xD;
&lt;p&gt;// 操作错误或其他原因导致的错误会在这里被通知&lt;/p&gt;&#xD;
&lt;p&gt;return true;&lt;/p&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;});&lt;/p&gt;&#xD;
&lt;p&gt;// 连接并加载资源&lt;/p&gt;&#xD;
&lt;p&gt;try {&lt;/p&gt;&#xD;
&lt;p&gt;mp.prepare();&lt;/p&gt;&#xD;
&lt;p&gt;// mp.prepareAsync() 这也是可以的，这是异步处理，上面的是同步处理，实际加载完毕以OnPreparedListener.onPrepared()为准。&lt;/p&gt;&#xD;
&lt;p&gt;} catch (IllegalStateException e) {&lt;/p&gt;&#xD;
&lt;p&gt;e.printStackTrace();&lt;/p&gt;&#xD;
&lt;p&gt;} catch (IOException e) {&lt;/p&gt;&#xD;
&lt;p&gt;e.printStackTrace();&lt;/p&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;// mp.start(); // 建议在OnPreparedListener.onPrepared()回调中触发该函数，特别是使用异步加载时&lt;/p&gt;&#xD;
&lt;p&gt;/**&lt;/p&gt;&#xD;
&lt;p&gt;* ... 你的其他操作 ...&lt;/p&gt;&#xD;
&lt;p&gt;*/&lt;/p&gt;&#xD;
&lt;p&gt;// 终止播放并释放资源&lt;/p&gt;&#xD;
&lt;p&gt;try{&lt;/p&gt;&#xD;
&lt;p&gt;mp.stop(); // 这是必要的，如果你设置了循环播放，否则程序退出了音乐仍在后台继续播...&lt;/p&gt;&#xD;
&lt;p&gt;mp.release();&lt;/p&gt;&#xD;
&lt;p&gt;}catch(IllegalStateException e){&lt;/p&gt;&#xD;
&lt;p&gt;e.printStackTrace();&lt;/p&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;播放控制上基本与SoundPool相同有：&lt;/p&gt;&#xD;
&lt;p&gt;start()、pause()、stop()、seekTo()、setLooping()...&lt;/p&gt;&#xD;
&lt;p&gt;需要注意的是， 循环播放设置上与SoundPool不同，不能指定确定的循环次数，而是一个布尔值，指定是否循环播放...&lt;/p&gt;&#xD;
&lt;p&gt;更多的函数使用请查阅API文档。&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/freeliver54/aggbug/2336518.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/freeliver54/archive/2012/02/03/2336518.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/freeliver54/archive/2012/02/02/2335521.html</id><title type="text">[转]WebGL All in One 全傻瓜简介</title><summary type="text">本文转自：http://www.hiwebgl.com/?p=628本文是基于Opera开发团队的一篇文章翻译修改而成的，建议第一次接触WebGL概念的朋友阅读本文，可以对WebGL技术有一个整体的了解。这不是一个WebGL教程，只相当于WebGL的百科条目（实际上目前中文维基百科和百度百科对WebGL的介绍都不够好）。目录1 什么是WebGL？2 我如何才能运行WebGL？ 2.1 Chrome浏览器2.2 Firefox浏览器2.3 Safari浏览器2.4 如何判断我目前的浏览器是否支持WebGL？3 WebGL可以用来做什么？4 WebGL的工作原理是什么？ 4.1 渲染管线5 我如何</summary><published>2012-02-02T03:24:00Z</published><updated>2012-02-02T03:24:00Z</updated><author><name>freeliver54</name><uri>http://www.cnblogs.com/freeliver54/</uri></author><link rel="alternate" href="http://www.cnblogs.com/freeliver54/archive/2012/02/02/2335521.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/freeliver54/archive/2012/02/02/2335521.html"/><content type="html">&lt;p&gt;&lt;font style="background-color: #c7edcc"&gt;本文转自：&lt;a href="http://www.hiwebgl.com/?p=628" target="_blank"&gt;http://www.hiwebgl.com/?p=628&lt;/a&gt;&lt;/font&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;本文是基于Opera开发团队的&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://dev.opera.com/articles/view/an-introduction-to-webgl/" target="_blank"&gt;一篇文章&lt;/a&gt;翻译修改而成的，建议第一次接触WebGL概念的朋友阅读本文，可以对WebGL技术有一个整体的了解。这不是一个WebGL教程，只相当于WebGL的百科条目（实际上目前中文维基百科和百度百科对WebGL的介绍都不够好）。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-image: none; border-bottom: rgb(170,170,170) 1px solid; border-left: rgb(170,170,170) 1px solid; padding-bottom: 10px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 1em; padding-left: 10px; outline-width: 0px; width: 275px; padding-right: 10px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-top: rgb(170,170,170) 1px solid; border-right: rgb(170,170,170) 1px solid; word-spacing: 0px; padding-top: 10px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px" id="toc_container" &gt;&#xD;
&lt;p style="text-align: center; padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 12px; vertical-align: baseline; border-left-width: 0px; font-weight: bold; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" &gt;目录&lt;/p&gt;&#xD;
&lt;ul style="background-image: none; padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin: 1em 0px 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 12px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" &gt;&lt;li style="background-image: none; padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 12px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial"&gt;&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://www.hiwebgl.com/?p=628#WebGL"&gt;1 什么是WebGL？&lt;/a&gt;&lt;/li&gt;&lt;li style="background-image: none; padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 12px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial"&gt;&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://www.hiwebgl.com/?p=628#WebGL-2"&gt;2 我如何才能运行WebGL？&lt;/a&gt; &#xD;
&lt;ul style="background-image: none; padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin: 0px 0px 0px 1.5em; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 12px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial"&gt;&lt;li style="background-image: none; padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 12px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial"&gt;&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://www.hiwebgl.com/?p=628#Chrome"&gt;2.1 Chrome浏览器&lt;/a&gt;&lt;/li&gt;&lt;li style="background-image: none; padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 12px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial"&gt;&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://www.hiwebgl.com/?p=628#Firefox"&gt;2.2 Firefox浏览器&lt;/a&gt;&lt;/li&gt;&lt;li style="background-image: none; padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 12px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial"&gt;&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://www.hiwebgl.com/?p=628#Safari"&gt;2.3 Safari浏览器&lt;/a&gt;&lt;/li&gt;&lt;li style="background-image: none; padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 12px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial"&gt;&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://www.hiwebgl.com/?p=628#WebGL-3"&gt;2.4 如何判断我目前的浏览器是否支持WebGL？&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li style="background-image: none; padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 12px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial"&gt;&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://www.hiwebgl.com/?p=628#WebGL-4"&gt;3 WebGL可以用来做什么？&lt;/a&gt;&lt;/li&gt;&lt;li style="background-image: none; padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 12px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial"&gt;&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://www.hiwebgl.com/?p=628#WebGL-5"&gt;4 WebGL的工作原理是什么？&lt;/a&gt; &#xD;
&lt;ul style="background-image: none; padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin: 0px 0px 0px 1.5em; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 12px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial"&gt;&lt;li style="background-image: none; padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 12px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial"&gt;&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://www.hiwebgl.com/?p=628#i"&gt;4.1 渲染管线&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li style="background-image: none; padding-bottom: 0px; border-right-width: 0px; list-style-type: none; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 12px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial"&gt;&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://www.hiwebgl.com/?p=628#WebGL-6"&gt;5 我如何开始学习开发WebGL？&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;h1 style="padding-bottom: 14px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 20px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: bold 19px/1.5em Arial, sans-serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(17,17,17); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 28px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 19px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" id="WebGL"&gt;什么是WebGL？&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;WebGL是一套JavaScript API，允许开发者在浏览器中直接嵌入支持硬件加速的互动3D图形。下面是一个WebGL应用于网页中的视频，来源于WebGL教程的&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://www.hiwebgl.com/?p=327" target="_blank"&gt;第10课&lt;/a&gt;，你可以看到简单的全3D的类似于Doom的游戏，而且完全是在浏览器中实现的，无需任何插件。&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;作为一项开放的web标准，WebGL是由&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://www.khronos.org/" target="_blank"&gt;Khronos Group&lt;/a&gt;开发的，Google、Apple、Mozilla、Opera等公司和组织都是其中的成员，即这一标准的制定者和积极倡导者。&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;WebGL是作为HTML5中的 &amp;lt;canvas&amp;gt;标签的一个特殊的上下文（experimental-webgl）实现在浏览器中的，因此WebGL也可以与所有DOM接口完全整合到一起。WebGL API是基于OpenGL ES 2.0的，是OpenGL ES 2.0的子集，所以WebGL可以运行于许多不同的硬件设备之上，例如桌面电脑、智能手机、平板电脑和智能电视。你可以在Khronos的网站上找到&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="https://www.khronos.org/registry/webgl/specs/1.0/" target="_blank"&gt;WebGL的规范全文&lt;/a&gt;。&lt;/p&gt;&#xD;
&lt;h1 style="padding-bottom: 14px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 20px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: bold 19px/1.5em Arial, sans-serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(17,17,17); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 28px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 19px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" id="WebGL-2"&gt;我如何才能运行WebGL？&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;要运行WebGL，你必须有一个支持它的浏览器。例如：&lt;/p&gt;&#xD;
&lt;ul style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); list-style-type: square; text-indent: 0px; margin: 0px 0px 24px 1.5em; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;&lt;li style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px 0px 0px 30px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 12px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial"&gt;&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://www.google.com/chrome/" target="_blank"&gt;Google Chrome 9及以上版本&lt;/a&gt;&lt;/li&gt;&lt;li style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px 0px 0px 30px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 12px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial"&gt;&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://www.mozilla.org/en-US/products/download.html" target="_blank"&gt;Mozilla Firefox 4以及上版本&lt;/a&gt;&lt;/li&gt;&lt;li style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px 0px 0px 30px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 12px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial"&gt;&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://www.apple.com/safari/" target="_blank"&gt;Safari 5.1及以上版本&lt;/a&gt;（仅限于Mac OS X操作系统，不包括Windows操作系统；所有情况下必须强制开启WebGL支持，请参考下文）&lt;/li&gt;&lt;li style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px 0px 0px 30px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 12px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial"&gt;&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://www.opera.com/browser/next/" target="_blank"&gt;Opera Next&lt;/a&gt;&amp;nbsp;即Opera 12 alpha及以上版本&lt;/li&gt;&lt;li style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px 0px 0px 30px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 12px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial"&gt;你会发现IE并不支持WebGL，不过你可以通过下载并安装&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://www.iewebgl.com/" target="_blank"&gt;IEWebGL&lt;/a&gt;这个插件，或者&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://www.google.com/chromeframe" target="_blank"&gt;Google&amp;nbsp;Chrome Framework&lt;/a&gt;来运行一些WebGL应用。&lt;/li&gt;&lt;/ul&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;同时，你还需要一块好的显卡，并安装了最新的显卡驱动；这只是刚刚能够运行WebGL的要求，如果想要在一些复杂的应用中保证显示效果，那你需要一块更好的显卡。&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;如果你的显卡非常老旧，或者是板载的集成显卡，那么你需要在浏览器中强制开启WebGL支持；另外因为其他的一些原因（比如你的操作系统是Windows XP），在正常安装以上浏览器之后还是不能运行WebGL，那你最好也强制开启WebGL支持。开启方法如下：&lt;/p&gt;&#xD;
&lt;h2 style="padding-bottom: 14px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 20px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: bold 19px/1.5em Arial, sans-serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(17,17,17); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 28px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 19px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" id="Chrome"&gt;Chrome浏览器&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;我们需要为Chrome加入一些启动参数，以下具体操作步骤以Windows操作系统为例，请Linux用户自行设置。&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;Chrome浏览器的用户请找到Chrome浏览器的快捷方式，如果没有就创建一个快捷方式（右键点击chrome.exe，选择&amp;#8220;创建快捷方式&amp;#8221;或者&amp;#8220;发送到&amp;#8221;&amp;#8594;&amp;#8220;桌面快捷方式&amp;#8221;），右键点击快捷方式，选择属性。&lt;br /&gt;在目标框内，双引号的后边，加入以下内容&lt;/p&gt;&lt;pre style="padding-bottom: 1.5em; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 30px; outline-width: 0px; padding-right: 1.5em; font: 12px/18px 'Courier 10 Pitch', Courier, monospace; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(34,34,34); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 1.5em; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;--enable-webgl --ignore-gpu-blacklist --allow-file-access-from-files&lt;/pre&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;点击确定。&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;设置完成的后的快捷方式属性窗口看起来应当是这样的，请注意其中的&amp;#8220;目标&amp;#8221;文本框：&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://www.hiwebgl.com/wp-content/uploads/2011/11/chrome_shortcut.png"&gt;&lt;img style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px auto 12px; padding-left: 0px; outline-width: 0px; padding-right: 0px; display: block; max-width: 640px; border-top-width: 0px; border-bottom-width: 0px; clear: both; font-size: 12px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial"  title="chrome_shortcut" alt="" src="http://www.hiwebgl.com/wp-content/uploads/2011/11/chrome_shortcut.png" width="387" height="490" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;关闭目前开启的所有Chrome窗口，然后用此快捷方式启动Chrome浏览器。&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;其中&lt;/p&gt;&lt;pre style="padding-bottom: 1.5em; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 1.5em; outline-width: 0px; padding-right: 1.5em; font: 12px/18px 'Courier 10 Pitch', Courier, monospace; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(34,34,34); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 1.5em; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;--enable-webgl&lt;/pre&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;的意思是开启WebGL支持；&lt;/p&gt;&lt;pre style="padding-bottom: 1.5em; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 1.5em; outline-width: 0px; padding-right: 1.5em; font: 12px/18px 'Courier 10 Pitch', Courier, monospace; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(34,34,34); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 1.5em; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;--ignore-gpu-blacklist&lt;/pre&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;的意思是忽略GPU黑名单，也就是说有一些显卡GPU因为过于陈旧等原因，不建议运行WebGL，这个参数可以让浏览器忽略这个黑名单，强制运行WebGL；&lt;/p&gt;&lt;pre style="padding-bottom: 1.5em; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 1.5em; outline-width: 0px; padding-right: 1.5em; font: 12px/18px 'Courier 10 Pitch', Courier, monospace; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(34,34,34); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 1.5em; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;--allow-file-access-from-files&lt;/pre&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;的意思是允许从本地载入资源，如果你不是WebGL的开发者，不需要开发调试WebGL，只是想要看一下WebGL的Demo，那你可以不添加这个参数。&lt;/p&gt;&#xD;
&lt;h2 style="padding-bottom: 14px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 20px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: bold 19px/1.5em Arial, sans-serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(17,17,17); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 28px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 19px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" id="Firefox"&gt;Firefox浏览器&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ol style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); list-style-type: decimal; text-indent: 0px; margin: 0px 0px 24px 1.5em; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;&lt;li style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px 0px 0px 30px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 12px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial"&gt;Firefox的用户请在浏览器的地址栏输入&amp;#8220;about:config&amp;#8221;，回车&lt;/li&gt;&lt;li style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px 0px 0px 30px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 12px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial"&gt;在过滤器（filter）中搜索&amp;#8220;webgl&amp;#8221;&lt;/li&gt;&lt;li style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px 0px 0px 30px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 12px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial"&gt;将webgl.force-enabled设置为true&lt;/li&gt;&lt;li style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px 0px 0px 30px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 12px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial"&gt;将webgl.disabled设置为false&lt;/li&gt;&lt;li style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px 0px 0px 30px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 12px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial"&gt;在过滤器（filter）中搜索&amp;#8220;security.fileuri.strict_origin_policy&amp;#8221;&lt;/li&gt;&lt;li style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px 0px 0px 30px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 12px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial"&gt;将security.fileuri.strict_origin_policy设置为false&lt;/li&gt;&lt;li style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px 0px 0px 30px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 12px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial"&gt;关闭目前开启的所有Firefox窗口，然后重新启动Firefox。&lt;/li&gt;&lt;/ol&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;其中前两个设置是强制开启WebGL支持，最后一个security.fileuri.strict_origin_policy的设置是允许从本地载入资源，如果你不是WebGL的开发者，不需要开发调试WebGL，只是想要看一下WebGL的Demo，那你可以不设置此项。&lt;/p&gt;&#xD;
&lt;h2 style="padding-bottom: 14px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 20px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: bold 19px/1.5em Arial, sans-serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(17,17,17); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 28px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 19px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" id="Safari"&gt;Safari浏览器&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;在菜单中找到&amp;#8220;属性&amp;#8221;&amp;#8594;&amp;#8220;高级&amp;#8221;，选中&amp;#8220;显示开发菜单&amp;#8221;，然后到&amp;#8220;开发&amp;#8221;菜单，选中&amp;#8220;开启WebGL&amp;#8221;&lt;/p&gt;&#xD;
&lt;h2 style="padding-bottom: 14px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 20px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: bold 19px/1.5em Arial, sans-serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(17,17,17); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 28px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 19px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" id="WebGL-3"&gt;如何判断我目前的浏览器是否支持WebGL？&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;请访问&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://doesmybrowsersupportwebgl.com/" target="_blank"&gt;http://doesmybrowsersupportwebgl.com/&lt;/a&gt;。&lt;/p&gt;&#xD;
&lt;ul style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); list-style-type: square; text-indent: 0px; margin: 0px 0px 24px 1.5em; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;&lt;li style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px 0px 0px 30px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 12px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial"&gt;如果显示Yay，说明你的浏览器已经支持WebGL了。&lt;/li&gt;&lt;li style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px 0px 0px 30px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 12px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial"&gt;如果显示Nay，说明你的浏览器目前还不能运行WebGL。&lt;/li&gt;&lt;/ul&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;你也可以在我们网站的&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://www.hiwebgl.com/?cat=16" target="_blank"&gt;Demo栏目&lt;/a&gt;里，选择几个Demo运行一下，或者运行一些我们&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://www.hiwebgl.com/?p=42" target="_blank"&gt;教程&lt;/a&gt;中的一些Demo。&lt;/p&gt;&#xD;
&lt;h1 style="padding-bottom: 14px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 20px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: bold 19px/1.5em Arial, sans-serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(17,17,17); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 28px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 19px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" id="WebGL-4"&gt;WebGL可以用来做什么？&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;WebGL允许开发者在浏览器中实现实时的3D互动图形。WebGL可以应用于&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://lights.elliegoulding.com/" target="_blank"&gt;互动音乐电视&lt;/a&gt;、&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://operasoftware.github.com/Emberwind/" target="_blank"&gt;游戏&lt;/a&gt;、&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://senchalabs.github.com/philogl/PhiloGL/examples/temperatureAnomalies/" target="_blank"&gt;数据可视化&lt;/a&gt;、&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://mrdoob.github.com/three.js/examples/webgl_materials_cubemap_escher.html" target="_blank"&gt;艺术&lt;/a&gt;、&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://veditor.plopbyte.net/" target="_blank"&gt;3D设计环境&lt;/a&gt;、&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://mrdoob.github.com/three.js/examples/webgl_panorama_equirectangular.html" target="_blank"&gt;3D空间建模&lt;/a&gt;、&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://alteredqualia.com/three/examples/webgl_materials_skin.html" target="_blank"&gt;3D物体建模&lt;/a&gt;、&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://senchalabs.github.com/philogl/PhiloGL/examples/explorer/" target="_blank"&gt;绘制数学函数&lt;/a&gt;和&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://www.cake23.de/traveling-wavefronts-lit-up.html" target="_blank"&gt;创建物理模拟&lt;/a&gt;。&lt;/p&gt;&#xD;
&lt;h1 style="padding-bottom: 14px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 20px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: bold 19px/1.5em Arial, sans-serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(17,17,17); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 28px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 19px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" id="WebGL-5"&gt;WebGL的工作原理是什么？&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;因为是被设计成直接工作在显卡端的，所以WebGL比目前其他的典型的web技术都要更加复杂。总的来说，它是相当的低等级的。这也正是它为什么能够如此迅速的完成大量的计算，并实现复杂的实时3D渲染的原因。&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;你不需要完全理解WebGL内在的工作原理。因为有很多第三方WebGL图形库可以帮你完成一些复杂的操作。但是如果你想成为一个高级开发者，充分利用WebGL的各种高级特性，那建议你最好还是深入了解一下其中的内涵。&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;在WebGL中编程，通常的目标都是想要渲染某种场景。这其中包括多重并发的绘制工作，称之为绘制调用（draw call），这些调用都是在GPU端通过一个叫做渲染管线（Rendering Pipeline）的处理流程来实现的。&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;在WebGL中，和其他大多数实时3D图形系统一样，三角形是用于绘制模型的最基本的元素。因此，在WebGL中需要通过使用JavaScript来生成绘制信息，这些绘制信息包括指定在什么位置绘制三角形、如何绘制三角形、这些三角形的外观长的什么样子（颜色、形状、纹理等等）。然后将这些信息传递给到GPU端，GPU进行处理，最后再返回绘制结果。&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;下面我们来看看渲染管线的具体流程。&lt;/p&gt;&#xD;
&lt;h2 style="padding-bottom: 14px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 20px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: bold 19px/1.5em Arial, sans-serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(17,17,17); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 28px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 19px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" id="i"&gt;渲染管线&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;以下部分节选自Joe Groff的文章&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://duriansoftware.com/joe/An-intro-to-modern-OpenGL.-Chapter-1:-The-Graphics-Pipeline.html" target="_blank"&gt;《现代OpenGL简介 &amp;#8211; 第一章：图形管线》&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://www.hiwebgl.com/wp-content/uploads/2011/11/rendering_pipeline.jpg"&gt;&lt;img style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 4px 24px 12px 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; display: inline; max-width: 640px; float: left; border-top-width: 0px; border-bottom-width: 0px; font-size: 12px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial"  title="rendering_pipeline" alt="" src="http://www.hiwebgl.com/wp-content/uploads/2011/11/rendering_pipeline.jpg" width="300" height="927" /&gt;&lt;/a&gt;渲染管线的处理流程开始于建立顶点数组（Vertex Array）。这些数组包括了顶点属性（例如顶点在3D空间中的位置）和顶点纹理信息、颜色信息和如何接受光照（顶点法线）。这些顶点数组和其中包含的数据都是在JavaScript中建立的，建立的方法有以下几种：&lt;/p&gt;&#xD;
&lt;ul style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); list-style-type: square; text-indent: 0px; margin: 0px 0px 24px 1.5em; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;&#xD;
&lt;ul style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; list-style-type: square; margin: 0px 0px 0px 1.5em; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 12px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial"&gt;&lt;li style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px 0px 0px 30px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 12px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial"&gt;自己编写JavaScript代码建立&lt;/li&gt;&lt;li style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px 0px 0px 30px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 12px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial"&gt;加载并解析一个描述3D模型的文件（例如.obj文件）&lt;/li&gt;&lt;li style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px 0px 0px 30px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 12px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial"&gt;使用第三方图形库内置封装好的几何体形状&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;然后顶点数组里的数据会被填充到一个或多个顶点缓冲（Vertex Buffer）中，并传递到GPU端。在向GPU提交渲染工作的时候，我们还需要提供一个额外的数组用于描述顶点数组中元素的索引。这个顶点索引数组会在稍后控制顶点如何被装配到三角形中。&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;好了，GPU开始从顶点缓冲中读取顶点信息，并在顶点着色器（Vertex Shader）中处理这些信息。顶点着色器是一个程序，用于读取顶点属性，并输出一个新的属性集合。顶点着色器最基本的功能是计算顶点在屏幕空间中的位置。但它也会为每个顶点生成其他属性，比如颜色或纹理坐标。你可以编写代码自定义顶点着色器，也可以使用第三方图形库提供的顶点着色器。&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;然后，GPU会连接这些顶点来形成三角形。这里就用到了顶点索引数组，GPU会根据顶点索引的描述，将这些顶点按照指定顺序每3个分成一组，形成一个三角形。&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;然后光栅器（Rasterizer）会作用于每个三角形，切出这些三角形并忽略形状之外的其他部分，然后将当前剩余的可见部分打碎，填充到像素大小的片元（Fragment）中。对于其他顶点属性（比如颜色和纹理），顶点着色器会在光栅化之后的三角形表面上，为一个顶点和另一个顶点之间的部分做线性插值，为每一个片元（也就是像素）产生一个平滑的渐变值。举例来说，如果顶点着色器为每个顶点分配了一个颜色值，那么光栅器将会混合这些颜色，并在像素化的表面生成一个新的合适的渐变色。关于本段内容更详细的讲解，请参考我们教程的&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://www.hiwebgl.com/?p=133" target="_blank"&gt;第2课&lt;/a&gt;。&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;这些生成的像素大小的片元之后会被传递到片元着色器（Fragment Shader）中。片元着色器将会输出每个像素的颜色和深度值，用于在帧缓冲（Frame Buffer）中进行绘制。通常情况下，片元着色器的操作包括纹理映射和光照。因为片元着色器会为每个像素进行独立绘制，这就可以实现很多相当复杂的特殊效果；但也正是因为这样，片元着色器也成为图形管线中和性能最为相关的部分。和顶点着色器一样，你可以编写代码自定义片元着色器，也可以使用第三方图形库提供的片元着色器。&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;最后，帧缓冲（Frame Buffer）是渲染输出的最终目的地。帧缓冲是一个2D图像，但又不仅仅是一个2D图像这么简单。除了一个或多个颜色缓冲区之外，帧缓冲还包含深度缓冲区（Depth Buffer）和/或模板缓冲区（Stencil Buffer），这两个都是在最终绘制到帧缓冲之前可选的过滤片元的方式，深度检测会忽略被前面已经绘制的物体挡住的后面的物体，模板检测会使用模板缓冲区中绘制的形状约束帧缓冲中的可绘制区域，将渲染工作&amp;#8220;模板化&amp;#8221;。经过这两层过滤之后依然幸存的片元，它们的颜色值会与在它们覆盖之下的颜色值进行&amp;#945;混合。最终的颜色值、深度值、模板值会写入相应的缓冲区。帧缓冲的输出结果也可以用作纹理输入到其他渲染中去（即渲染到纹理，可以参考教程&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://www.hiwebgl.com/?p=432" target="_blank"&gt;第16课&lt;/a&gt;）。&lt;/p&gt;&#xD;
&lt;h1 style="padding-bottom: 14px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 20px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: bold 19px/1.5em Arial, sans-serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(17,17,17); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 28px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;&lt;span style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; font-size: 19px; vertical-align: baseline; border-left-width: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" id="WebGL-6"&gt;我如何开始学习开发WebGL？&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;首先你需要有一个支持WebGL的浏览器。然后，你可以在你喜欢的JavaScript开发环境中编写代码。&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;要学习WebGL，最好有编写JavaScript、OpenGL或OpenGL ES的经验和基础，还需要少量的HTML5知识。如果你是一个网络前端工程师，那可能你的JavaScript经验已经很充足了，但是却没有接触过计算机图形学，那也没有关系，实际上你可以越过OpenGL和OpenGL ES，直接从WebGL切入，作为你学习计算机图形学的开始。&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;教程方面推荐&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://learningwebgl.com/blog/?page_id=1217" target="_blank"&gt;Giles编写的WebGL教程&lt;/a&gt;，我们的网站上有&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://www.hiwebgl.com/?p=42" target="_blank"&gt;这一教程的指定中文版本&lt;/a&gt;，这一教程的大部分课程都是从大名鼎鼎的&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://nehe.gamedev.net/" target="_blank"&gt;Nehe的OpenGL教程&lt;/a&gt;改编的，从浅入深，相当的通俗易懂。如果学习过程中有什么疑问，可以加入我们的QQ群提问，也可以在&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://www.hiwebgl.com/forum" target="_blank"&gt;论坛&lt;/a&gt;发帖提问。&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;如果不是出于学习目的，而是要开发一个正式的商用项目，那么我们建议你在了解了WebGL的工作原理和其他计算机图形学的知识之后，使用第三方图形库进行开发。如果你阅读了上面的章节之后，你会发现直接使用原生的WebGL API开发项目会非常非常非常让人头疼。不像其他的web API，原生的WebGL是非常低等级的。WebGL标准的开发者这么做的目的是为了保证WebGL充分的灵活性和适用于所有应用的可用性，同时希望第三方图形库的开发者在这之后可以为WebGL添加一个简单便捷开发层。&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;目前有很多WebGL的第三方图形库，其中大多都是基于WebGL来迅速创建3D环境中的元素的，这些元素包括场景、相机、光源、环境光、内置的几何体形状、材质、纹理和雾化以及粒子效果。每个图形库都提供了差不多的元素类型，但可用性如何依赖于不同图形库的本身的开发质量。另外因为WebGL可以互动，所以很多图形库也封装了处理交互事件的接口。最后，很多图形库都提供了一些成型的顶点着色器和片元着色器代码。这么说很难说清楚，当你开始试着用一下各种图形库的时候，你就会发现使用图形库而不是原生WebGL AP的便捷性了。&lt;/p&gt;&#xD;
&lt;p style="padding-bottom: 0px; border-right-width: 0px; widows: 2; text-transform: none; background-color: rgb(226,226,226); text-indent: 0px; margin: 0px 0px 24px; padding-left: 0px; outline-width: 0px; padding-right: 0px; font: 12px/24px Georgia, 'Times New Roman', Times, serif; white-space: normal; orphans: 2; border-top-width: 0px; border-bottom-width: 0px; letter-spacing: normal; color: rgb(68,68,68); vertical-align: baseline; border-left-width: 0px; word-spacing: 0px; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px"&gt;你可以在&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://www.khronos.org/webgl/wiki/Main_Page" target="_blank"&gt;WebGL Public Wiki&lt;/a&gt;的&lt;a style="padding-bottom: 0px; border-right-width: 0px; background-color: transparent; margin: 0px; padding-left: 0px; outline-width: 0px; padding-right: 0px; border-top-width: 0px; border-bottom-width: 0px; color: rgb(185,81,35); font-size: 12px; vertical-align: baseline; border-left-width: 0px; text-decoration: none; padding-top: 0px; border-image: initial; background-origin: initial; background-clip: initial" href="http://www.khronos.org/webgl/wiki/User_Contributions" target="_blank"&gt;User Contributions&lt;/a&gt;页面上找到一个列有大部分图形库的清单。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/freeliver54/aggbug/2335521.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/freeliver54/archive/2012/02/02/2335521.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
