{"id":2030,"date":"2025-05-10T00:00:07","date_gmt":"2025-05-09T16:00:07","guid":{"rendered":"https:\/\/www.wunen.com\/index.php\/2025\/05\/10\/%e5%8a%a8%e6%80%81%e5%a3%81%e7%ba%b8%e6%8e%a2%e7%a9%b6\/"},"modified":"2025-05-10T00:00:07","modified_gmt":"2025-05-09T16:00:07","slug":"%e5%8a%a8%e6%80%81%e5%a3%81%e7%ba%b8%e6%8e%a2%e7%a9%b6","status":"publish","type":"post","link":"http:\/\/www.wunen.com\/index.php\/2025\/05\/10\/%e5%8a%a8%e6%80%81%e5%a3%81%e7%ba%b8%e6%8e%a2%e7%a9%b6\/","title":{"rendered":"\u52a8\u6001\u58c1\u7eb8\u63a2\u7a76"},"content":{"rendered":"<div class=\"article_content clearfix\" id=\"article_content\">\n <link href=\"https:\/\/csdnimg.cn\/release\/blogv2\/dist\/mdeditor\/css\/editerView\/kdoc_html_views-1a98987dfd.css\" rel=\"stylesheet\"\/>\n <link href=\"https:\/\/csdnimg.cn\/release\/blogv2\/dist\/mdeditor\/css\/editerView\/ck_htmledit_views-704d5b9767.css\" rel=\"stylesheet\"\/>\n<div class=\"htmledit_views atom-one-dark\" id=\"content_views\">\n<p>\n   \u968f\u7740<br \/>\n   <a href=\"http:\/\/dev.10086.cn\/cmdn\/wiki\/index.php?doc-view-1277\" rel=\"nofollow\"><br \/>\n    \u4e09\u661f<br \/>\n   <\/a><br \/>\n   Oscar\u7684\u4e0a\u5e02\uff0c\u6d41\u7545\u7684\u64cd\u4f5c\uff0c\u534e\u4e3d\u7684\u754c\u9762\uff0c<br \/>\n   <a href=\"http:\/\/dev.10086.cn\/cmdn\/wiki\/index.php?doc-view-1401\" rel=\"nofollow\"><br \/>\n    OPhone<br \/>\n   <\/a><br \/>\n   2.0\u7684\u4e0d\u4fd7\u8868\u73b0\u4e0d\u7981\u8ba9\u4eba\u773c\u524d\u4e00\u4eae\u3002\u4f5c\u4e3aOPhone 2.0\u4e00\u4e2a\u65b0\u7279\u6027\uff0c\u52a8\u6001\u58c1\u7eb8(Live Wallpapers)\u4e3a\u7528\u6237\u5e26\u6765\u4e86\u66f4\u70ab\u4f53\u9a8c\u3002\u672c\u6587\u4e3b\u8981\u901a\u8fc7\u4e00\u4e2a\u5b8c\u6574\u7684\u65f6\u95f4\u58c1\u7eb8\uff08TimeWall\uff09\u4e3a\u5927\u5bb6\u4ecb\u7ecd\u5982\u4f55\u5f00\u53d1 Live Wallpapers\u3002\u8fd8\u6ca1\u5f00\u53d1\u73af\u5883\uff1f\u8d76\u7d27\u53bb\u4e0b\u8f7dOPhone<br \/>\n   <a href=\"http:\/\/dev.10086.cn\/cmdn\/wiki\/index.php?doc-view-1426\" rel=\"nofollow\"><br \/>\n    SDK<br \/>\n   <\/a><br \/>\n   2.0\u5427\uff01\n  <\/p>\n<p>\n   <br \/>\n   1\u3001 Live Wallpapers\u662f\u4ec0\u4e48\uff1f<br \/>\n   <br \/>\n   \u5728oscar\u4e0a\u6709\u4e00\u4e2a\u52a8\u6001\u58c1\u7eb8\u53eb\u201c\u5929\u7a7a\u8349\u5730\u201d\uff0c\u7528\u8fc7\u4e00\u6bb5\u65f6\u95f4\uff0c\u53ef\u4ee5\u53d1\u73b0\uff0c\u968f\u7740\u65f6\u95f4\u7684\u53d8\u5316\uff0c\u58c1\u7eb8\u7684\u5929\u7a7a\u5c31\u4f1a\u7531\u84dd\u84dd\u9752\u5929\u53d8\u6210\u7e41\u661f\u6ee1\u5929\u3002\u770b\u770b\u6548\u679c\uff1a\n  <\/p>\n<\/p>\n<p>\n   \u4e3a\u4ec0\u4e48\u58c1\u7eb8\u8fd8\u6709\u8fd9\u4e48\u795e\u5947\u7684\u53d8\u5316\uff0c\u8fd9\u4e2d\u95f4\u5230\u5e95\u662f\u4ec0\u4e48\u5728\u8d77\u4f5c\u7528\uff1f\u5176\u5b9e\uff0c\u4e00\u4e2aLive Wallpaper\u5c31\u662f\u4e00\u4e2aapk\uff01\u4e5f\u5c31\u662f\u8bf4\uff0c\u52a8\u6001\u58c1\u7eb8\u7684\u5b9e\u8d28\u662f\u4e00\u4e2aapk\u5728\u540e\u53f0\u4e0d\u65ad\u5730\u91cd\u7ed8\u58c1\u7eb8\uff0c\u6240\u4ee5\u6211\u4eec\u53ef\u4ee5\u8ba9\u5c0f\u8349\u957f\u9ad8\uff0c\u5c0f\u9e1f\u98de\u7fd4\u3002\n  <\/p>\n<p>\n   \u6765\u770b\u4e00\u4e0bAndoridManifest.xml\uff1a\n  <\/p>\n<\/p>\n<div class=\"dp-highlighter\">\n<div class=\"bar\">\n<div class=\"tools\">\n     Xhtml\u4ee3\u7801<br \/>\n     <a href=\"http:\/\/daimajishu.iteye.com\/blog\/1080874#\" rel=\"nofollow\" title=\"\u590d\u5236\u4ee3\u7801\"><br \/>\n     <\/a>\n    <\/div>\n<\/p><\/div>\n<ol class=\"dp-xml\">\n<li>\n     <span class=\"tag\"><br \/>\n      &lt;?<br \/>\n     <\/span><br \/>\n     <span class=\"tag-name\"><br \/>\n      xml<br \/>\n     <\/span><br \/>\n     <span class=\"attribute\"><br \/>\n      version<br \/>\n     <\/span><br \/>\n     =<br \/>\n     <span class=\"attribute-value\"><br \/>\n      &#8220;1.0&#8221;<br \/>\n     <\/span><br \/>\n     <span class=\"attribute\"><br \/>\n      encoding<br \/>\n     <\/span><br \/>\n     =<br \/>\n     <span class=\"attribute-value\"><br \/>\n      &#8220;utf-8&#8221;<br \/>\n     <\/span><br \/>\n     <span class=\"tag\"><br \/>\n      ?&gt;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     &lt;!&#8211;\n    <\/li>\n<li>\n     \/*\n    <\/li>\n<li>\n     **\n    <\/li>\n<li>\n     **\u00a0Copyright\u00a02009,\u00a0The\u00a0Android\u00a0Open\u00a0Source\u00a0Project\n    <\/li>\n<li>\n     **\n    <\/li>\n<li>\n     **\u00a0Licensed\u00a0under\u00a0the\u00a0Apache\u00a0License,\u00a0Version\u00a02.0\u00a0(the\u00a0&#8220;License&#8221;);\n    <\/li>\n<li>\n     **\u00a0you\u00a0may\u00a0not\u00a0use\u00a0this\u00a0file\u00a0except\u00a0in\u00a0compliance\u00a0with\u00a0the\u00a0License.\n    <\/li>\n<li>\n     **\u00a0You\u00a0may\u00a0obtain\u00a0a\u00a0copy\u00a0of\u00a0the\u00a0License\u00a0at\n    <\/li>\n<li>\n     **\n    <\/li>\n<li>\n     **\u00a0\u00a0\u00a0\u00a0\u00a0http:\/\/www.apache.org\/licenses\/LICENSE-2.0\n    <\/li>\n<li>\n     **\n    <\/li>\n<li>\n     **\u00a0Unless\u00a0required\u00a0by\u00a0applicable\u00a0law\u00a0or\u00a0agreed\u00a0to\u00a0in\u00a0writing,\u00a0software\n    <\/li>\n<li>\n     **\u00a0distributed\u00a0under\u00a0the\u00a0License\u00a0is\u00a0distributed\u00a0on\u00a0an\u00a0&#8220;AS\u00a0IS&#8221;\u00a0BASIS,\n    <\/li>\n<li>\n     **\u00a0WITHOUT\u00a0WARRANTIES\u00a0OR\u00a0CONDITIONS\u00a0OF\u00a0ANY\u00a0KIND,\u00a0either\u00a0express\u00a0or\u00a0implied.\n    <\/li>\n<li>\n     **\u00a0See\u00a0the\u00a0License\u00a0for\u00a0the\u00a0specific\u00a0language\u00a0governing\u00a0permissions\u00a0and\n    <\/li>\n<li>\n     **\u00a0limitations\u00a0under\u00a0the\u00a0License.\n    <\/li>\n<li>\n     *\/\n    <\/li>\n<li>\n     &#8212;<br \/>\n     <span class=\"tag\"><br \/>\n      &gt;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"tag\"><br \/>\n      &lt;<br \/>\n     <\/span><br \/>\n     <span class=\"tag-name\"><br \/>\n      manifest<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"attribute\"><br \/>\n      xmlns:android<br \/>\n     <\/span><br \/>\n     =<br \/>\n     <span class=\"attribute-value\"><br \/>\n      &#8220;http:\/\/schemas.android.com\/apk\/res\/android&#8221;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"attribute\"><br \/>\n      package<br \/>\n     <\/span><br \/>\n     =<br \/>\n     <span class=\"attribute-value\"><br \/>\n      &#8220;com.example.android.livecubes&#8221;<br \/>\n     <\/span><br \/>\n     <span class=\"tag\"><br \/>\n      &gt;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"tag\"><br \/>\n      &lt;<br \/>\n     <\/span><br \/>\n     <span class=\"tag-name\"><br \/>\n      uses-sdk<br \/>\n     <\/span><br \/>\n     <span class=\"attribute\"><br \/>\n      android:minSdkVersion<br \/>\n     <\/span><br \/>\n     =<br \/>\n     <span class=\"attribute-value\"><br \/>\n      &#8220;7&#8221;<br \/>\n     <\/span><br \/>\n     <span class=\"tag\"><br \/>\n      \/&gt;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"tag\"><br \/>\n      &lt;<br \/>\n     <\/span><br \/>\n     <span class=\"tag-name\"><br \/>\n      uses-feature<br \/>\n     <\/span><br \/>\n     <span class=\"attribute\"><br \/>\n      android:name<br \/>\n     <\/span><br \/>\n     =<br \/>\n     <span class=\"attribute-value\"><br \/>\n      &#8220;android.software.live_wallpaper&#8221;<br \/>\n     <\/span><br \/>\n     <span class=\"tag\"><br \/>\n      \/&gt;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"tag\"><br \/>\n      &lt;<br \/>\n     <\/span><br \/>\n     <span class=\"tag-name\"><br \/>\n      application<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"attribute\"><br \/>\n      android:label<br \/>\n     <\/span><br \/>\n     =<br \/>\n     <span class=\"attribute-value\"><br \/>\n      &#8220;@string\/wallpapers&#8221;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"attribute\"><br \/>\n      android:icon<br \/>\n     <\/span><br \/>\n     =<br \/>\n     <span class=\"attribute-value\"><br \/>\n      &#8220;@drawable\/ic_launcher_wallpaper&#8221;<br \/>\n     <\/span><br \/>\n     <span class=\"tag\"><br \/>\n      &gt;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"tag\"><br \/>\n      &lt;<br \/>\n     <\/span><br \/>\n     <span class=\"tag-name\"><br \/>\n      service<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"attribute\"><br \/>\n      android:label<br \/>\n     <\/span><br \/>\n     =<br \/>\n     <span class=\"attribute-value\"><br \/>\n      &#8220;@string\/wallpaper_cube1&#8221;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"attribute\"><br \/>\n      android:name<br \/>\n     <\/span><br \/>\n     =<br \/>\n     <span class=\"attribute-value\"><br \/>\n      &#8220;.cube1.CubeWallpaper1&#8221;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"attribute\"><br \/>\n      android:permission<br \/>\n     <\/span><br \/>\n     =<br \/>\n     <span class=\"attribute-value\"><br \/>\n      &#8220;android.permission.BIND_WALLPAPER&#8221;<br \/>\n     <\/span><br \/>\n     <span class=\"tag\"><br \/>\n      &gt;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"tag\"><br \/>\n      &lt;<br \/>\n     <\/span><br \/>\n     <span class=\"tag-name\"><br \/>\n      intent-filter<br \/>\n     <\/span><br \/>\n     <span class=\"tag\"><br \/>\n      &gt;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"tag\"><br \/>\n      &lt;<br \/>\n     <\/span><br \/>\n     <span class=\"tag-name\"><br \/>\n      action<br \/>\n     <\/span><br \/>\n     <span class=\"attribute\"><br \/>\n      android:name<br \/>\n     <\/span><br \/>\n     =<br \/>\n     <span class=\"attribute-value\"><br \/>\n      &#8220;android.service.wallpaper.WallpaperService&#8221;<br \/>\n     <\/span><br \/>\n     <span class=\"tag\"><br \/>\n      \/&gt;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"tag\"><br \/>\n      &lt;\/<br \/>\n     <\/span><br \/>\n     <span class=\"tag-name\"><br \/>\n      intent-filter<br \/>\n     <\/span><br \/>\n     <span class=\"tag\"><br \/>\n      &gt;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"tag\"><br \/>\n      &lt;<br \/>\n     <\/span><br \/>\n     <span class=\"tag-name\"><br \/>\n      meta-data<br \/>\n     <\/span><br \/>\n     <span class=\"attribute\"><br \/>\n      android:name<br \/>\n     <\/span><br \/>\n     =<br \/>\n     <span class=\"attribute-value\"><br \/>\n      &#8220;android.service.wallpaper&#8221;<br \/>\n     <\/span><br \/>\n     <span class=\"attribute\"><br \/>\n      android:resource<br \/>\n     <\/span><br \/>\n     =<br \/>\n     <span class=\"attribute-value\"><br \/>\n      &#8220;@xml\/cube1&#8221;<br \/>\n     <\/span><br \/>\n     <span class=\"tag\"><br \/>\n      \/&gt;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"tag\"><br \/>\n      &lt;\/<br \/>\n     <\/span><br \/>\n     <span class=\"tag-name\"><br \/>\n      service<br \/>\n     <\/span><br \/>\n     <span class=\"tag\"><br \/>\n      &gt;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"tag\"><br \/>\n      &lt;<br \/>\n     <\/span><br \/>\n     <span class=\"tag-name\"><br \/>\n      service<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"attribute\"><br \/>\n      android:label<br \/>\n     <\/span><br \/>\n     =<br \/>\n     <span class=\"attribute-value\"><br \/>\n      &#8220;@string\/wallpaper_cube2&#8221;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"attribute\"><br \/>\n      android:name<br \/>\n     <\/span><br \/>\n     =<br \/>\n     <span class=\"attribute-value\"><br \/>\n      &#8220;.cube2.CubeWallpaper2&#8221;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"attribute\"><br \/>\n      android:permission<br \/>\n     <\/span><br \/>\n     =<br \/>\n     <span class=\"attribute-value\"><br \/>\n      &#8220;android.permission.BIND_WALLPAPER&#8221;<br \/>\n     <\/span><br \/>\n     <span class=\"tag\"><br \/>\n      &gt;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"tag\"><br \/>\n      &lt;<br \/>\n     <\/span><br \/>\n     <span class=\"tag-name\"><br \/>\n      intent-filter<br \/>\n     <\/span><br \/>\n     <span class=\"tag\"><br \/>\n      &gt;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"tag\"><br \/>\n      &lt;<br \/>\n     <\/span><br \/>\n     <span class=\"tag-name\"><br \/>\n      action<br \/>\n     <\/span><br \/>\n     <span class=\"attribute\"><br \/>\n      android:name<br \/>\n     <\/span><br \/>\n     =<br \/>\n     <span class=\"attribute-value\"><br \/>\n      &#8220;android.service.wallpaper.WallpaperService&#8221;<br \/>\n     <\/span><br \/>\n     <span class=\"tag\"><br \/>\n      \/&gt;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"tag\"><br \/>\n      &lt;\/<br \/>\n     <\/span><br \/>\n     <span class=\"tag-name\"><br \/>\n      intent-filter<br \/>\n     <\/span><br \/>\n     <span class=\"tag\"><br \/>\n      &gt;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"tag\"><br \/>\n      &lt;<br \/>\n     <\/span><br \/>\n     <span class=\"tag-name\"><br \/>\n      meta-data<br \/>\n     <\/span><br \/>\n     <span class=\"attribute\"><br \/>\n      android:name<br \/>\n     <\/span><br \/>\n     =<br \/>\n     <span class=\"attribute-value\"><br \/>\n      &#8220;android.service.wallpaper&#8221;<br \/>\n     <\/span><br \/>\n     <span class=\"attribute\"><br \/>\n      android:resource<br \/>\n     <\/span><br \/>\n     =<br \/>\n     <span class=\"attribute-value\"><br \/>\n      &#8220;@xml\/cube2&#8221;<br \/>\n     <\/span><br \/>\n     <span class=\"tag\"><br \/>\n      \/&gt;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"tag\"><br \/>\n      &lt;\/<br \/>\n     <\/span><br \/>\n     <span class=\"tag-name\"><br \/>\n      service<br \/>\n     <\/span><br \/>\n     <span class=\"tag\"><br \/>\n      &gt;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"tag\"><br \/>\n      &lt;<br \/>\n     <\/span><br \/>\n     <span class=\"tag-name\"><br \/>\n      activity<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"attribute\"><br \/>\n      android:label<br \/>\n     <\/span><br \/>\n     =<br \/>\n     <span class=\"attribute-value\"><br \/>\n      &#8220;@string\/cube2_settings&#8221;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"attribute\"><br \/>\n      android:name<br \/>\n     <\/span><br \/>\n     =<br \/>\n     <span class=\"attribute-value\"><br \/>\n      &#8220;.cube2.CubeWallpaper2Settings&#8221;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"attribute\"><br \/>\n      android:theme<br \/>\n     <\/span><br \/>\n     =<br \/>\n     <span class=\"attribute-value\"><br \/>\n      &#8220;@android:style\/Theme.Light.WallpaperSettings&#8221;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"attribute\"><br \/>\n      android:exported<br \/>\n     <\/span><br \/>\n     =<br \/>\n     <span class=\"attribute-value\"><br \/>\n      &#8220;true&#8221;<br \/>\n     <\/span><br \/>\n     <span class=\"tag\"><br \/>\n      &gt;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"tag\"><br \/>\n      &lt;\/<br \/>\n     <\/span><br \/>\n     <span class=\"tag-name\"><br \/>\n      activity<br \/>\n     <\/span><br \/>\n     <span class=\"tag\"><br \/>\n      &gt;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"comments\"><br \/>\n      &lt;!&#8211;android:exported\u00a0\u662f\u5426\u53ef\u88ab\u5176\u4ed6\u7a0b\u5e8f\u8c03\u7528\u00a0\u00a0android:permission=&#8221;android.permission.BIND_WALLPAPER&#8221;\u00a0\u684c\u9762\u670d\u52a1\u7ed1\u5b9a\u8bbe\u7f6e&#8211;&gt;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"tag\"><br \/>\n      &lt;\/<br \/>\n     <\/span><br \/>\n     <span class=\"tag-name\"><br \/>\n      application<br \/>\n     <\/span><br \/>\n     <span class=\"tag\"><br \/>\n      &gt;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"tag\"><br \/>\n      &lt;\/<br \/>\n     <\/span><br \/>\n     <span class=\"tag-name\"><br \/>\n      manifest<br \/>\n     <\/span><br \/>\n     <span class=\"tag\"><br \/>\n      &gt;<br \/>\n     <\/span>\n    <\/li>\n<\/ol><\/div>\n<p>  <textarea class=\"xhtml:nogutter\" name=\"code\" style=\"DISPLAY: none\">&lt;?xml version=&#8221;1.0&#8243; encoding=&#8221;utf-8&#8243;?&gt;<br \/>\n&lt;!&#8211;<br \/>\n\/*<br \/>\n**<br \/>\n** Copyright 2009, The Android Open Source Project<br \/>\n**<br \/>\n** Licensed under the Apache License, Version 2.0 (the &#8220;License&#8221;);<br \/>\n** you may not use this file except in compliance with the License.<br \/>\n** You may obtain a copy of the License at<br \/>\n**<br \/>\n**     http:\/\/www.apache.org\/licenses\/LICENSE-2.0<br \/>\n**<br \/>\n** Unless required by applicable law or agreed to in writing, software<br \/>\n** distributed under the License is distributed on an &#8220;AS IS&#8221; BASIS,<br \/>\n** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<br \/>\n** See the License for the specific language governing permissions and<br \/>\n** limitations under the License.<br \/>\n*\/<br \/>\n&#8211;&gt;<br \/>\n&lt;manifest<br \/>\n    xmlns:android=&#8221;http:\/\/schemas.android.com\/apk\/res\/android&#8221;<br \/>\n    package=&#8221;com.example.android.livecubes&#8221;&gt;<br \/>\n    &lt;uses-sdk android:minSdkVersion=&#8221;7&#8243; \/&gt;<br \/>\n    &lt;uses-feature android:name=&#8221;android.software.live_wallpaper&#8221; \/&gt;<br \/>\n    &lt;application<br \/>\n        android:label=&#8221;@string\/wallpapers&#8221;<br \/>\n        android:icon=&#8221;@drawable\/ic_launcher_wallpaper&#8221;&gt;<br \/>\n        &lt;service<br \/>\n            android:label=&#8221;@string\/wallpaper_cube1&#8243;<br \/>\n            android:name=&#8221;.cube1.CubeWallpaper1&#8243;<br \/>\n            android:permission=&#8221;android.permission.BIND_WALLPAPER&#8221;&gt;<br \/>\n            &lt;intent-filter&gt;<br \/>\n                &lt;action android:name=&#8221;android.service.wallpaper.WallpaperService&#8221; \/&gt;<br \/>\n            &lt;\/intent-filter&gt;<br \/>\n            &lt;meta-data android:name=&#8221;android.service.wallpaper&#8221; android:resource=&#8221;@xml\/cube1&#8243; \/&gt;<br \/>\n        &lt;\/service&gt;<br \/>\n        &lt;service<br \/>\n            android:label=&#8221;@string\/wallpaper_cube2&#8243;<br \/>\n            android:name=&#8221;.cube2.CubeWallpaper2&#8243;<br \/>\n            android:permission=&#8221;android.permission.BIND_WALLPAPER&#8221;&gt;<br \/>\n            &lt;intent-filter&gt;<br \/>\n                &lt;action android:name=&#8221;android.service.wallpaper.WallpaperService&#8221; \/&gt;<br \/>\n            &lt;\/intent-filter&gt;<br \/>\n            &lt;meta-data android:name=&#8221;android.service.wallpaper&#8221; android:resource=&#8221;@xml\/cube2&#8243; \/&gt;<br \/>\n        &lt;\/service&gt;<br \/>\n        &lt;activity<br \/>\n            android:label=&#8221;@string\/cube2_settings&#8221;<br \/>\n            android:name=&#8221;.cube2.CubeWallpaper2Settings&#8221;<br \/>\n            android:theme=&#8221;@android:style\/Theme.Light.WallpaperSettings&#8221;<br \/>\n            android:exported=&#8221;true&#8221;&gt;<br \/>\n        &lt;\/activity&gt;<br \/>\n\t&lt;!&#8211;android:exported \u662f\u5426\u53ef\u88ab\u5176\u4ed6\u7a0b\u5e8f\u8c03\u7528  android:permission=&#8221;android.permission.BIND_WALLPAPER&#8221; \u684c\u9762\u670d\u52a1\u7ed1\u5b9a\u8bbe\u7f6e&#8211;&gt;<br \/>\n    &lt;\/application&gt;<br \/>\n&lt;\/manifest&gt;<br \/>\n<\/textarea><\/p>\n<\/p>\n<p>\n   <span style=\"font-size:14px\"><br \/>\n    \u539f\u6765\u5982\u6b64\u7b80\u5355\uff0c\u52a8\u6001\u58c1\u7eb8\u4ec5\u4ec5\u6709\u4e00\u4e2aservice\u5c31\u591f\u4e86\u3002\u5176\u4e2d<br \/>\n    <br \/>\n    <a href=\"http:\/\/dev.10086.cn\/cmdn\/wiki\/index.php?doc-view-1789\" rel=\"nofollow\"><br \/>\n     Android<br \/>\n    <\/a><br \/>\n    :permission=&#8221;android.permission.BIND_WALLPAPER&#8221;<\/p>\n<p>    \u662f\u8ba9\u8be5service\u6709\u80fd\u8bbe\u7f6e\u4e3a\u58c1\u7eb8\u7684\u6743\u9650\uff0c\u6ca1\u6709\u7684\u8bdd\u8be5\u58c1\u7eb8\u53ea\u80fd\u88ab\u9884\u89c8\u3002<br \/>\n    <br \/>\n    &lt;uses-sdk android:minSdkVersion=&#8221;7&#8243; \/&gt;<\/p>\n<p>    \u544a\u8bc9\u6211\u4eec\uff0c\u5982\u679c\u4f60\u60f3\u5f00\u53d1\u4e00\u4e2alive wallpaper\uff0c\u5fc5\u987b\u662fOPhone 2.0\u6216\u8005\u66f4\u9ad8\u7684\u7248\u672c\u3002\u5f53\u7136\u8fd9\u4e5f\u9700\u8981\u624b\u673a\u786c\u4ef6\u7684\u652f\u6301\u3002<\/p>\n<p>    2\u3001\u600e\u6837\u5b9e\u73b0WallpaperService\uff1f<br \/>\n    <br \/>\n    WallpaperService\u4e0e\u5176\u4ed6\u7684service\u552f\u4e00\u7684\u4e0d\u540c\u5c31\u662f\uff0c\u4f60\u5fc5\u987b\u8981\u589e\u52a0\u4e00\u4e2a\u65b9\u6cd5onCreateEngine()\uff0c\u5b83\u4f1a\u8fd4\u56de\u4e00\u4e2a WallpaperService.Engine\uff0c\u8fd9\u4e2aengine\u624d\u662f\u8d1f\u8d23\u7ed8\u5236\u58c1\u7eb8\u4ee5\u53ca\u54cd\u5e94\u4e0e\u7528\u6237\u4ea4\u4e92\u4e8b\u4ef6\u7684\u6838\u5fc3\u90e8\u4ef6\u3002\u8fd9\u4e2aservice\u4ee3\u7801\u7ed3\u6784\u5982\u4e0b\uff1a<br \/>\n   <\/span>\n  <\/p>\n<p>\n   <span style=\"font-size:14px\"><br \/>\n   <\/span>\n  <\/p>\n<div class=\"dp-highlighter\">\n<div class=\"bar\">\n<div class=\"tools\">\n     Java\u4ee3\u7801<br \/>\n     <a href=\"http:\/\/daimajishu.iteye.com\/blog\/1080874#\" rel=\"nofollow\" title=\"\u590d\u5236\u4ee3\u7801\"><br \/>\n     <\/a>\n    <\/div>\n<\/p><\/div>\n<ol class=\"dp-j\">\n<li>\n     <span class=\"comment\"><br \/>\n      \/*<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      *\u00a0Copyright\u00a0(C)\u00a02009\u00a0The\u00a0Android\u00a0Open\u00a0Source\u00a0Project<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      *<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      *\u00a0Licensed\u00a0under\u00a0the\u00a0Apache\u00a0License,\u00a0Version\u00a02.0\u00a0(the\u00a0&#8220;License&#8221;);<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      *\u00a0you\u00a0may\u00a0not\u00a0use\u00a0this\u00a0file\u00a0except\u00a0in\u00a0compliance\u00a0with\u00a0the\u00a0License.<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      *\u00a0You\u00a0may\u00a0obtain\u00a0a\u00a0copy\u00a0of\u00a0the\u00a0License\u00a0at<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      *<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      *\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0http:\/\/www.apache.org\/licenses\/LICENSE-2.0<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      *<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      *\u00a0Unless\u00a0required\u00a0by\u00a0applicable\u00a0law\u00a0or\u00a0agreed\u00a0to\u00a0in\u00a0writing,\u00a0software<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      *\u00a0distributed\u00a0under\u00a0the\u00a0License\u00a0is\u00a0distributed\u00a0on\u00a0an\u00a0&#8220;AS\u00a0IS&#8221;\u00a0BASIS,<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      *\u00a0WITHOUT\u00a0WARRANTIES\u00a0OR\u00a0CONDITIONS\u00a0OF\u00a0ANY\u00a0KIND,\u00a0either\u00a0express\u00a0or\u00a0implied.<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      *\u00a0See\u00a0the\u00a0License\u00a0for\u00a0the\u00a0specific\u00a0language\u00a0governing\u00a0permissions\u00a0and<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      *\u00a0limitations\u00a0under\u00a0the\u00a0License.<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      *\/<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      package<br \/>\n     <\/span><br \/>\n     com.example.android.livecubes.cube2;\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      import<br \/>\n     <\/span><br \/>\n     android.content.SharedPreferences;\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      import<br \/>\n     <\/span><br \/>\n     android.graphics.Canvas;\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      import<br \/>\n     <\/span><br \/>\n     android.graphics.Paint;\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      import<br \/>\n     <\/span><br \/>\n     android.graphics.Rect;\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      import<br \/>\n     <\/span><br \/>\n     android.os.Handler;\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      import<br \/>\n     <\/span><br \/>\n     android.os.SystemClock;\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      import<br \/>\n     <\/span><br \/>\n     android.service.wallpaper.WallpaperService;\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      import<br \/>\n     <\/span><br \/>\n     android.view.MotionEvent;\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      import<br \/>\n     <\/span><br \/>\n     android.view.SurfaceHolder;\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      \/*<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      *\u00a0This\u00a0animated\u00a0wallpaper\u00a0draws\u00a0a\u00a0rotating\u00a0wireframe\u00a0shape.\u00a0It\u00a0is\u00a0similar\u00a0to<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      *\u00a0example\u00a0#1,\u00a0but\u00a0has\u00a0a\u00a0choice\u00a0of\u00a02\u00a0shapes,\u00a0which\u00a0are\u00a0user\u00a0selectable\u00a0and<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      *\u00a0defined\u00a0in\u00a0resources\u00a0instead\u00a0of\u00a0in\u00a0code.<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      *\/<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      public<br \/>\n     <\/span><br \/>\n     <span class=\"keyword\"><br \/>\n      class<br \/>\n     <\/span><br \/>\n     CubeWallpaper2<br \/>\n     <span class=\"keyword\"><br \/>\n      extends<br \/>\n     <\/span><br \/>\n     WallpaperService\u00a0{\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      public<br \/>\n     <\/span><br \/>\n     <span class=\"keyword\"><br \/>\n      static<br \/>\n     <\/span><br \/>\n     <span class=\"keyword\"><br \/>\n      final<br \/>\n     <\/span><br \/>\n     String\u00a0SHARED_PREFS_NAME=<br \/>\n     <span class=\"string\"><br \/>\n      &#8220;cube2settings&#8221;<br \/>\n     <\/span><br \/>\n     ;\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      static<br \/>\n     <\/span><br \/>\n     <span class=\"keyword\"><br \/>\n      class<br \/>\n     <\/span><br \/>\n     ThreeDPoint\u00a0{\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      float<br \/>\n     <\/span><br \/>\n     x;\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      float<br \/>\n     <\/span><br \/>\n     y;\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      float<br \/>\n     <\/span><br \/>\n     z;\n    <\/li>\n<li>\n     }\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      static<br \/>\n     <\/span><br \/>\n     <span class=\"keyword\"><br \/>\n      class<br \/>\n     <\/span><br \/>\n     ThreeDLine\u00a0{\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      int<br \/>\n     <\/span><br \/>\n     startPoint;\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      int<br \/>\n     <\/span><br \/>\n     endPoint;\n    <\/li>\n<li>\n     }\n    <\/li>\n<li>\n     <span class=\"annotation\"><br \/>\n      @Override<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      public<br \/>\n     <\/span><br \/>\n     <span class=\"keyword\"><br \/>\n      void<br \/>\n     <\/span><br \/>\n     onCreate()\u00a0{\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      super<br \/>\n     <\/span><br \/>\n     .onCreate();\n    <\/li>\n<li>\n     }\n    <\/li>\n<li>\n     <span class=\"annotation\"><br \/>\n      @Override<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      public<br \/>\n     <\/span><br \/>\n     <span class=\"keyword\"><br \/>\n      void<br \/>\n     <\/span><br \/>\n     onDestroy()\u00a0{\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      super<br \/>\n     <\/span><br \/>\n     .onDestroy();\n    <\/li>\n<li>\n     }\n    <\/li>\n<li>\n     <span class=\"annotation\"><br \/>\n      @Override<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      public<br \/>\n     <\/span><br \/>\n     Engine\u00a0onCreateEngine()\u00a0{\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      return<br \/>\n     <\/span><br \/>\n     <span class=\"keyword\"><br \/>\n      new<br \/>\n     <\/span><br \/>\n     CubeEngine();\n    <\/li>\n<li>\n     }\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      class<br \/>\n     <\/span><br \/>\n     CubeEngine<br \/>\n     <span class=\"keyword\"><br \/>\n      extends<br \/>\n     <\/span><br \/>\n     Engine\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      implements<br \/>\n     <\/span><br \/>\n     SharedPreferences.OnSharedPreferenceChangeListener\u00a0{\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      private<br \/>\n     <\/span><br \/>\n     <span class=\"keyword\"><br \/>\n      final<br \/>\n     <\/span><br \/>\n     Handler\u00a0mHandler\u00a0=<br \/>\n     <span class=\"keyword\"><br \/>\n      new<br \/>\n     <\/span><br \/>\n     Handler();\n    <\/li>\n<li>\n     ThreeDPoint\u00a0[]\u00a0mOriginalPoints;\n    <\/li>\n<li>\n     ThreeDPoint\u00a0[]\u00a0mRotatedPoints;\n    <\/li>\n<li>\n     ThreeDLine\u00a0[]\u00a0mLines;\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      private<br \/>\n     <\/span><br \/>\n     <span class=\"keyword\"><br \/>\n      final<br \/>\n     <\/span><br \/>\n     Paint\u00a0mPaint\u00a0=<br \/>\n     <span class=\"keyword\"><br \/>\n      new<br \/>\n     <\/span><br \/>\n     Paint();\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      private<br \/>\n     <\/span><br \/>\n     <span class=\"keyword\"><br \/>\n      float<br \/>\n     <\/span><br \/>\n     mOffset;\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      private<br \/>\n     <\/span><br \/>\n     <span class=\"keyword\"><br \/>\n      float<br \/>\n     <\/span><br \/>\n     mTouchX\u00a0=\u00a0&#8211;<br \/>\n     <span class=\"number\"><br \/>\n      1<br \/>\n     <\/span><br \/>\n     ;\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      private<br \/>\n     <\/span><br \/>\n     <span class=\"keyword\"><br \/>\n      float<br \/>\n     <\/span><br \/>\n     mTouchY\u00a0=\u00a0&#8211;<br \/>\n     <span class=\"number\"><br \/>\n      1<br \/>\n     <\/span><br \/>\n     ;\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      private<br \/>\n     <\/span><br \/>\n     <span class=\"keyword\"><br \/>\n      long<br \/>\n     <\/span><br \/>\n     mStartTime;\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      private<br \/>\n     <\/span><br \/>\n     <span class=\"keyword\"><br \/>\n      float<br \/>\n     <\/span><br \/>\n     mCenterX;\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      private<br \/>\n     <\/span><br \/>\n     <span class=\"keyword\"><br \/>\n      float<br \/>\n     <\/span><br \/>\n     mCenterY;\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      private<br \/>\n     <\/span><br \/>\n     <span class=\"keyword\"><br \/>\n      final<br \/>\n     <\/span><br \/>\n     Runnable\u00a0mDrawCube\u00a0=<br \/>\n     <span class=\"keyword\"><br \/>\n      new<br \/>\n     <\/span><br \/>\n     Runnable()\u00a0{\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      public<br \/>\n     <\/span><br \/>\n     <span class=\"keyword\"><br \/>\n      void<br \/>\n     <\/span><br \/>\n     run()\u00a0{\n    <\/li>\n<li>\n     drawFrame();\n    <\/li>\n<li>\n     }\n    <\/li>\n<li>\n     };\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      private<br \/>\n     <\/span><br \/>\n     <span class=\"keyword\"><br \/>\n      boolean<br \/>\n     <\/span><br \/>\n     mVisible;\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      private<br \/>\n     <\/span><br \/>\n     SharedPreferences\u00a0mPrefs;\n    <\/li>\n<li>\n     CubeEngine()\u00a0{\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      \/\/\u00a0Create\u00a0a\u00a0Paint\u00a0to\u00a0draw\u00a0the\u00a0lines\u00a0for\u00a0our\u00a0cube<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      final<br \/>\n     <\/span><br \/>\n     Paint\u00a0paint\u00a0=\u00a0mPaint;\n    <\/li>\n<li>\n     paint.setColor(<br \/>\n     <span class=\"number\"><br \/>\n      0xffffffff<br \/>\n     <\/span><br \/>\n     );\n    <\/li>\n<li>\n     paint.setAntiAlias(<br \/>\n     <span class=\"keyword\"><br \/>\n      true<br \/>\n     <\/span><br \/>\n     );\n    <\/li>\n<li>\n     paint.setStrokeWidth(<br \/>\n     <span class=\"number\"><br \/>\n      2<br \/>\n     <\/span><br \/>\n     );\n    <\/li>\n<li>\n     paint.setStrokeCap(Paint.Cap.ROUND);\n    <\/li>\n<li>\n     paint.setStyle(Paint.Style.STROKE);\n    <\/li>\n<li>\n     mStartTime\u00a0=\u00a0SystemClock.elapsedRealtime();\n    <\/li>\n<li>\n     mPrefs\u00a0=\u00a0CubeWallpaper2.<br \/>\n     <span class=\"keyword\"><br \/>\n      this<br \/>\n     <\/span><br \/>\n     .getSharedPreferences(SHARED_PREFS_NAME,<br \/>\n     <span class=\"number\"><br \/>\n      0<br \/>\n     <\/span><br \/>\n     );\n    <\/li>\n<li>\n     mPrefs.registerOnSharedPreferenceChangeListener(<br \/>\n     <span class=\"keyword\"><br \/>\n      this<br \/>\n     <\/span><br \/>\n     );\n    <\/li>\n<li>\n     onSharedPreferenceChanged(mPrefs,<br \/>\n     <span class=\"keyword\"><br \/>\n      null<br \/>\n     <\/span><br \/>\n     );\n    <\/li>\n<li>\n     }\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      public<br \/>\n     <\/span><br \/>\n     <span class=\"keyword\"><br \/>\n      void<br \/>\n     <\/span><br \/>\n     onSharedPreferenceChanged(SharedPreferences\u00a0prefs,\u00a0String\u00a0key)\u00a0{\n    <\/li>\n<li>\n     String\u00a0shape\u00a0=\u00a0prefs.getString(<br \/>\n     <span class=\"string\"><br \/>\n      &#8220;cube2_shape&#8221;<br \/>\n     <\/span><br \/>\n     ,<br \/>\n     <span class=\"string\"><br \/>\n      &#8220;cube&#8221;<br \/>\n     <\/span><br \/>\n     );\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      \/\/\u00a0read\u00a0the\u00a03D\u00a0model\u00a0from\u00a0the\u00a0resource<br \/>\n     <\/span>\n    <\/li>\n<li>\n     readModel(shape);\n    <\/li>\n<li>\n     }\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      private<br \/>\n     <\/span><br \/>\n     <span class=\"keyword\"><br \/>\n      void<br \/>\n     <\/span><br \/>\n     readModel(String\u00a0prefix)\u00a0{\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      \/\/\u00a0Read\u00a0the\u00a0model\u00a0definition\u00a0in\u00a0from\u00a0a\u00a0resource.<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      \/\/\u00a0get\u00a0the\u00a0resource\u00a0identifiers\u00a0for\u00a0the\u00a0arrays\u00a0for\u00a0the\u00a0selected\u00a0shape<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      int<br \/>\n     <\/span><br \/>\n     pid\u00a0=\u00a0getResources().getIdentifier(prefix\u00a0+<br \/>\n     <span class=\"string\"><br \/>\n      &#8220;points&#8221;<br \/>\n     <\/span><br \/>\n     ,<br \/>\n     <span class=\"string\"><br \/>\n      &#8220;array&#8221;<br \/>\n     <\/span><br \/>\n     ,\u00a0getPackageName());\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      int<br \/>\n     <\/span><br \/>\n     lid\u00a0=\u00a0getResources().getIdentifier(prefix\u00a0+<br \/>\n     <span class=\"string\"><br \/>\n      &#8220;lines&#8221;<br \/>\n     <\/span><br \/>\n     ,<br \/>\n     <span class=\"string\"><br \/>\n      &#8220;array&#8221;<br \/>\n     <\/span><br \/>\n     ,\u00a0getPackageName());\n    <\/li>\n<li>\n     String\u00a0[]\u00a0p\u00a0=\u00a0getResources().getStringArray(pid);\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      int<br \/>\n     <\/span><br \/>\n     numpoints\u00a0=\u00a0p.length;\n    <\/li>\n<li>\n     mOriginalPoints\u00a0=<br \/>\n     <span class=\"keyword\"><br \/>\n      new<br \/>\n     <\/span><br \/>\n     ThreeDPoint[numpoints];\n    <\/li>\n<li>\n     mRotatedPoints\u00a0=<br \/>\n     <span class=\"keyword\"><br \/>\n      new<br \/>\n     <\/span><br \/>\n     ThreeDPoint[numpoints];\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      for<br \/>\n     <\/span><br \/>\n     (<br \/>\n     <span class=\"keyword\"><br \/>\n      int<br \/>\n     <\/span><br \/>\n     i\u00a0=<br \/>\n     <span class=\"number\"><br \/>\n      0<br \/>\n     <\/span><br \/>\n     ;\u00a0i\u00a0&lt;\u00a0numpoints;\u00a0i++)\u00a0{\n    <\/li>\n<li>\n     mOriginalPoints[i]\u00a0=<br \/>\n     <span class=\"keyword\"><br \/>\n      new<br \/>\n     <\/span><br \/>\n     ThreeDPoint();\n    <\/li>\n<li>\n     mRotatedPoints[i]\u00a0=<br \/>\n     <span class=\"keyword\"><br \/>\n      new<br \/>\n     <\/span><br \/>\n     ThreeDPoint();\n    <\/li>\n<li>\n     String\u00a0[]\u00a0coord\u00a0=\u00a0p[i].split(<br \/>\n     <span class=\"string\"><br \/>\n      &#8221;\u00a0&#8221;<br \/>\n     <\/span><br \/>\n     );\n    <\/li>\n<li>\n     mOriginalPoints[i].x\u00a0=\u00a0Float.valueOf(coord[<br \/>\n     <span class=\"number\"><br \/>\n      0<br \/>\n     <\/span><br \/>\n     ]);\n    <\/li>\n<li>\n     mOriginalPoints[i].y\u00a0=\u00a0Float.valueOf(coord[<br \/>\n     <span class=\"number\"><br \/>\n      1<br \/>\n     <\/span><br \/>\n     ]);\n    <\/li>\n<li>\n     mOriginalPoints[i].z\u00a0=\u00a0Float.valueOf(coord[<br \/>\n     <span class=\"number\"><br \/>\n      2<br \/>\n     <\/span><br \/>\n     ]);\n    <\/li>\n<li>\n     }\n    <\/li>\n<li>\n     String\u00a0[]\u00a0l\u00a0=\u00a0getResources().getStringArray(lid);\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      int<br \/>\n     <\/span><br \/>\n     numlines\u00a0=\u00a0l.length;\n    <\/li>\n<li>\n     mLines\u00a0=<br \/>\n     <span class=\"keyword\"><br \/>\n      new<br \/>\n     <\/span><br \/>\n     ThreeDLine[numlines];\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      for<br \/>\n     <\/span><br \/>\n     (<br \/>\n     <span class=\"keyword\"><br \/>\n      int<br \/>\n     <\/span><br \/>\n     i\u00a0=<br \/>\n     <span class=\"number\"><br \/>\n      0<br \/>\n     <\/span><br \/>\n     ;\u00a0i\u00a0&lt;\u00a0numlines;\u00a0i++)\u00a0{\n    <\/li>\n<li>\n     mLines[i]\u00a0=<br \/>\n     <span class=\"keyword\"><br \/>\n      new<br \/>\n     <\/span><br \/>\n     ThreeDLine();\n    <\/li>\n<li>\n     String\u00a0[]\u00a0idx\u00a0=\u00a0l[i].split(<br \/>\n     <span class=\"string\"><br \/>\n      &#8221;\u00a0&#8221;<br \/>\n     <\/span><br \/>\n     );\n    <\/li>\n<li>\n     mLines[i].startPoint\u00a0=\u00a0Integer.valueOf(idx[<br \/>\n     <span class=\"number\"><br \/>\n      0<br \/>\n     <\/span><br \/>\n     ]);\n    <\/li>\n<li>\n     mLines[i].endPoint\u00a0=\u00a0Integer.valueOf(idx[<br \/>\n     <span class=\"number\"><br \/>\n      1<br \/>\n     <\/span><br \/>\n     ]);\n    <\/li>\n<li>\n     }\n    <\/li>\n<li>\n     }\n    <\/li>\n<li>\n     <span class=\"annotation\"><br \/>\n      @Override<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      public<br \/>\n     <\/span><br \/>\n     <span class=\"keyword\"><br \/>\n      void<br \/>\n     <\/span><br \/>\n     onCreate(SurfaceHolder\u00a0surfaceHolder)\u00a0{\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      super<br \/>\n     <\/span><br \/>\n     .onCreate(surfaceHolder);\n    <\/li>\n<li>\n     setTouchEventsEnabled(<br \/>\n     <span class=\"keyword\"><br \/>\n      true<br \/>\n     <\/span><br \/>\n     );\n    <\/li>\n<li>\n     }\n    <\/li>\n<li>\n     <span class=\"annotation\"><br \/>\n      @Override<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      public<br \/>\n     <\/span><br \/>\n     <span class=\"keyword\"><br \/>\n      void<br \/>\n     <\/span><br \/>\n     onDestroy()\u00a0{\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      super<br \/>\n     <\/span><br \/>\n     .onDestroy();\n    <\/li>\n<li>\n     mHandler.removeCallbacks(mDrawCube);\n    <\/li>\n<li>\n     }\n    <\/li>\n<li>\n     <span class=\"annotation\"><br \/>\n      @Override<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      public<br \/>\n     <\/span><br \/>\n     <span class=\"keyword\"><br \/>\n      void<br \/>\n     <\/span><br \/>\n     onVisibilityChanged(<br \/>\n     <span class=\"keyword\"><br \/>\n      boolean<br \/>\n     <\/span><br \/>\n     visible)\u00a0{\n    <\/li>\n<li>\n     mVisible\u00a0=\u00a0visible;\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      if<br \/>\n     <\/span><br \/>\n     (visible)\u00a0{\n    <\/li>\n<li>\n     drawFrame();\n    <\/li>\n<li>\n     }<br \/>\n     <span class=\"keyword\"><br \/>\n      else<br \/>\n     <\/span><br \/>\n     {\n    <\/li>\n<li>\n     mHandler.removeCallbacks(mDrawCube);\n    <\/li>\n<li>\n     }\n    <\/li>\n<li>\n     }\n    <\/li>\n<li>\n     <span class=\"annotation\"><br \/>\n      @Override<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      public<br \/>\n     <\/span><br \/>\n     <span class=\"keyword\"><br \/>\n      void<br \/>\n     <\/span><br \/>\n     onSurfaceChanged(SurfaceHolder\u00a0holder,<br \/>\n     <span class=\"keyword\"><br \/>\n      int<br \/>\n     <\/span><br \/>\n     format,<br \/>\n     <span class=\"keyword\"><br \/>\n      int<br \/>\n     <\/span><br \/>\n     width,<br \/>\n     <span class=\"keyword\"><br \/>\n      int<br \/>\n     <\/span><br \/>\n     height)\u00a0{\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      super<br \/>\n     <\/span><br \/>\n     .onSurfaceChanged(holder,\u00a0format,\u00a0width,\u00a0height);\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      \/\/\u00a0store\u00a0the\u00a0center\u00a0of\u00a0the\u00a0surface,\u00a0so\u00a0we\u00a0can\u00a0draw\u00a0the\u00a0cube\u00a0in\u00a0the\u00a0right\u00a0spot<br \/>\n     <\/span>\n    <\/li>\n<li>\n     mCenterX\u00a0=\u00a0width\/<br \/>\n     <span class=\"number\"><br \/>\n      2<br \/>\n     <\/span><br \/>\n     .0f;\n    <\/li>\n<li>\n     mCenterY\u00a0=\u00a0height\/<br \/>\n     <span class=\"number\"><br \/>\n      2<br \/>\n     <\/span><br \/>\n     .0f;\n    <\/li>\n<li>\n     drawFrame();\n    <\/li>\n<li>\n     }\n    <\/li>\n<li>\n     <span class=\"annotation\"><br \/>\n      @Override<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      public<br \/>\n     <\/span><br \/>\n     <span class=\"keyword\"><br \/>\n      void<br \/>\n     <\/span><br \/>\n     onSurfaceCreated(SurfaceHolder\u00a0holder)\u00a0{\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      super<br \/>\n     <\/span><br \/>\n     .onSurfaceCreated(holder);\n    <\/li>\n<li>\n     }\n    <\/li>\n<li>\n     <span class=\"annotation\"><br \/>\n      @Override<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      public<br \/>\n     <\/span><br \/>\n     <span class=\"keyword\"><br \/>\n      void<br \/>\n     <\/span><br \/>\n     onSurfaceDestroyed(SurfaceHolder\u00a0holder)\u00a0{\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      super<br \/>\n     <\/span><br \/>\n     .onSurfaceDestroyed(holder);\n    <\/li>\n<li>\n     mVisible\u00a0=<br \/>\n     <span class=\"keyword\"><br \/>\n      false<br \/>\n     <\/span><br \/>\n     ;\n    <\/li>\n<li>\n     mHandler.removeCallbacks(mDrawCube);\n    <\/li>\n<li>\n     }\n    <\/li>\n<li>\n     <span class=\"annotation\"><br \/>\n      @Override<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      public<br \/>\n     <\/span><br \/>\n     <span class=\"keyword\"><br \/>\n      void<br \/>\n     <\/span><br \/>\n     onOffsetsChanged(<br \/>\n     <span class=\"keyword\"><br \/>\n      float<br \/>\n     <\/span><br \/>\n     xOffset,<br \/>\n     <span class=\"keyword\"><br \/>\n      float<br \/>\n     <\/span><br \/>\n     yOffset,\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      float<br \/>\n     <\/span><br \/>\n     xStep,<br \/>\n     <span class=\"keyword\"><br \/>\n      float<br \/>\n     <\/span><br \/>\n     yStep,<br \/>\n     <span class=\"keyword\"><br \/>\n      int<br \/>\n     <\/span><br \/>\n     xPixels,<br \/>\n     <span class=\"keyword\"><br \/>\n      int<br \/>\n     <\/span><br \/>\n     yPixels)\u00a0{\n    <\/li>\n<li>\n     mOffset\u00a0=\u00a0xOffset;\n    <\/li>\n<li>\n     drawFrame();\n    <\/li>\n<li>\n     }\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      \/*<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      *\u00a0Store\u00a0the\u00a0position\u00a0of\u00a0the\u00a0touch\u00a0event\u00a0so\u00a0we\u00a0can\u00a0use\u00a0it\u00a0for\u00a0drawing\u00a0later<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      *\/<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"annotation\"><br \/>\n      @Override<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      public<br \/>\n     <\/span><br \/>\n     <span class=\"keyword\"><br \/>\n      void<br \/>\n     <\/span><br \/>\n     onTouchEvent(MotionEvent\u00a0event)\u00a0{\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      if<br \/>\n     <\/span><br \/>\n     (event.getAction()\u00a0==\u00a0MotionEvent.ACTION_MOVE)\u00a0{\n    <\/li>\n<li>\n     mTouchX\u00a0=\u00a0event.getX();\n    <\/li>\n<li>\n     mTouchY\u00a0=\u00a0event.getY();\n    <\/li>\n<li>\n     }<br \/>\n     <span class=\"keyword\"><br \/>\n      else<br \/>\n     <\/span><br \/>\n     {\n    <\/li>\n<li>\n     mTouchX\u00a0=\u00a0&#8211;<br \/>\n     <span class=\"number\"><br \/>\n      1<br \/>\n     <\/span><br \/>\n     ;\n    <\/li>\n<li>\n     mTouchY\u00a0=\u00a0&#8211;<br \/>\n     <span class=\"number\"><br \/>\n      1<br \/>\n     <\/span><br \/>\n     ;\n    <\/li>\n<li>\n     }\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      super<br \/>\n     <\/span><br \/>\n     .onTouchEvent(event);\n    <\/li>\n<li>\n     }\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      \/*<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      *\u00a0Draw\u00a0one\u00a0frame\u00a0of\u00a0the\u00a0animation.\u00a0This\u00a0method\u00a0gets\u00a0called\u00a0repeatedly<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      *\u00a0by\u00a0posting\u00a0a\u00a0delayed\u00a0Runnable.\u00a0You\u00a0can\u00a0do\u00a0any\u00a0drawing\u00a0you\u00a0want\u00a0in<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      *\u00a0here.\u00a0This\u00a0example\u00a0draws\u00a0a\u00a0wireframe\u00a0cube.<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      *\/<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      void<br \/>\n     <\/span><br \/>\n     drawFrame()\u00a0{\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      final<br \/>\n     <\/span><br \/>\n     SurfaceHolder\u00a0holder\u00a0=\u00a0getSurfaceHolder();\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      final<br \/>\n     <\/span><br \/>\n     Rect\u00a0frame\u00a0=\u00a0holder.getSurfaceFrame();\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      final<br \/>\n     <\/span><br \/>\n     <span class=\"keyword\"><br \/>\n      int<br \/>\n     <\/span><br \/>\n     width\u00a0=\u00a0frame.width();\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      final<br \/>\n     <\/span><br \/>\n     <span class=\"keyword\"><br \/>\n      int<br \/>\n     <\/span><br \/>\n     height\u00a0=\u00a0frame.height();\n    <\/li>\n<li>\n     Canvas\u00a0c\u00a0=<br \/>\n     <span class=\"keyword\"><br \/>\n      null<br \/>\n     <\/span><br \/>\n     ;\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      try<br \/>\n     <\/span><br \/>\n     {\n    <\/li>\n<li>\n     c\u00a0=\u00a0holder.lockCanvas();\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      if<br \/>\n     <\/span><br \/>\n     (c\u00a0!=<br \/>\n     <span class=\"keyword\"><br \/>\n      null<br \/>\n     <\/span><br \/>\n     )\u00a0{\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      \/\/\u00a0draw\u00a0something<br \/>\n     <\/span>\n    <\/li>\n<li>\n     drawCube(c);\n    <\/li>\n<li>\n     drawTouchPoint(c);\n    <\/li>\n<li>\n     }\n    <\/li>\n<li>\n     }<br \/>\n     <span class=\"keyword\"><br \/>\n      finally<br \/>\n     <\/span><br \/>\n     {\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      if<br \/>\n     <\/span><br \/>\n     (c\u00a0!=<br \/>\n     <span class=\"keyword\"><br \/>\n      null<br \/>\n     <\/span><br \/>\n     )\u00a0holder.unlockCanvasAndPost(c);\n    <\/li>\n<li>\n     }\n    <\/li>\n<li>\n     mHandler.removeCallbacks(mDrawCube);\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      if<br \/>\n     <\/span><br \/>\n     (mVisible)\u00a0{\n    <\/li>\n<li>\n     mHandler.postDelayed(mDrawCube,<br \/>\n     <span class=\"number\"><br \/>\n      1000<br \/>\n     <\/span><br \/>\n     \/<br \/>\n     <span class=\"number\"><br \/>\n      25<br \/>\n     <\/span><br \/>\n     );\n    <\/li>\n<li>\n     }\n    <\/li>\n<li>\n     }\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      void<br \/>\n     <\/span><br \/>\n     drawCube(Canvas\u00a0c)\u00a0{\n    <\/li>\n<li>\n     c.save();\n    <\/li>\n<li>\n     c.translate(mCenterX,\u00a0mCenterY);\n    <\/li>\n<li>\n     c.drawColor(<br \/>\n     <span class=\"number\"><br \/>\n      0xff000000<br \/>\n     <\/span><br \/>\n     );\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      long<br \/>\n     <\/span><br \/>\n     now\u00a0=\u00a0SystemClock.elapsedRealtime();\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      float<br \/>\n     <\/span><br \/>\n     xrot\u00a0=\u00a0((<br \/>\n     <span class=\"keyword\"><br \/>\n      float<br \/>\n     <\/span><br \/>\n     )(now\u00a0&#8211;\u00a0mStartTime))\u00a0\/<br \/>\n     <span class=\"number\"><br \/>\n      1000<br \/>\n     <\/span><br \/>\n     ;\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      float<br \/>\n     <\/span><br \/>\n     yrot\u00a0=\u00a0(<br \/>\n     <span class=\"number\"><br \/>\n      0<br \/>\n     <\/span><br \/>\n     .5f\u00a0&#8211;\u00a0mOffset)\u00a0*<br \/>\n     <span class=\"number\"><br \/>\n      2<br \/>\n     <\/span><br \/>\n     .0f;\n    <\/li>\n<li>\n     rotateAndProjectPoints(xrot,\u00a0yrot);\n    <\/li>\n<li>\n     drawLines(c);\n    <\/li>\n<li>\n     c.restore();\n    <\/li>\n<li>\n     }\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      void<br \/>\n     <\/span><br \/>\n     rotateAndProjectPoints(<br \/>\n     <span class=\"keyword\"><br \/>\n      float<br \/>\n     <\/span><br \/>\n     xrot,<br \/>\n     <span class=\"keyword\"><br \/>\n      float<br \/>\n     <\/span><br \/>\n     yrot)\u00a0{\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      int<br \/>\n     <\/span><br \/>\n     n\u00a0=\u00a0mOriginalPoints.length;\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      for<br \/>\n     <\/span><br \/>\n     (<br \/>\n     <span class=\"keyword\"><br \/>\n      int<br \/>\n     <\/span><br \/>\n     i\u00a0=<br \/>\n     <span class=\"number\"><br \/>\n      0<br \/>\n     <\/span><br \/>\n     ;\u00a0i\u00a0&lt;\u00a0n;\u00a0i++)\u00a0{\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      \/\/\u00a0rotation\u00a0around\u00a0X-axis<br \/>\n     <\/span>\n    <\/li>\n<li>\n     ThreeDPoint\u00a0p\u00a0=\u00a0mOriginalPoints[i];\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      float<br \/>\n     <\/span><br \/>\n     x\u00a0=\u00a0p.x;\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      float<br \/>\n     <\/span><br \/>\n     y\u00a0=\u00a0p.y;\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      float<br \/>\n     <\/span><br \/>\n     z\u00a0=\u00a0p.z;\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      float<br \/>\n     <\/span><br \/>\n     newy\u00a0=\u00a0(<br \/>\n     <span class=\"keyword\"><br \/>\n      float<br \/>\n     <\/span><br \/>\n     )(Math.sin(xrot)\u00a0*\u00a0z\u00a0+\u00a0Math.cos(xrot)\u00a0*\u00a0y);\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      float<br \/>\n     <\/span><br \/>\n     newz\u00a0=\u00a0(<br \/>\n     <span class=\"keyword\"><br \/>\n      float<br \/>\n     <\/span><br \/>\n     )(Math.cos(xrot)\u00a0*\u00a0z\u00a0&#8211;\u00a0Math.sin(xrot)\u00a0*\u00a0y);\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      \/\/\u00a0rotation\u00a0around\u00a0Y-axis<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      float<br \/>\n     <\/span><br \/>\n     newx\u00a0=\u00a0(<br \/>\n     <span class=\"keyword\"><br \/>\n      float<br \/>\n     <\/span><br \/>\n     )(Math.sin(yrot)\u00a0*\u00a0newz\u00a0+\u00a0Math.cos(yrot)\u00a0*\u00a0x);\n    <\/li>\n<li>\n     newz\u00a0=\u00a0(<br \/>\n     <span class=\"keyword\"><br \/>\n      float<br \/>\n     <\/span><br \/>\n     )(Math.cos(yrot)\u00a0*\u00a0newz\u00a0&#8211;\u00a0Math.sin(yrot)\u00a0*\u00a0x);\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      \/\/\u00a03D-to-2D\u00a0projection<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      float<br \/>\n     <\/span><br \/>\n     screenX\u00a0=\u00a0newx\u00a0\/\u00a0(<br \/>\n     <span class=\"number\"><br \/>\n      4<br \/>\n     <\/span><br \/>\n     &#8211;\u00a0newz\u00a0\/<br \/>\n     <span class=\"number\"><br \/>\n      400<br \/>\n     <\/span><br \/>\n     );\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      float<br \/>\n     <\/span><br \/>\n     screenY\u00a0=\u00a0newy\u00a0\/\u00a0(<br \/>\n     <span class=\"number\"><br \/>\n      4<br \/>\n     <\/span><br \/>\n     &#8211;\u00a0newz\u00a0\/<br \/>\n     <span class=\"number\"><br \/>\n      400<br \/>\n     <\/span><br \/>\n     );\n    <\/li>\n<li>\n     mRotatedPoints[i].x\u00a0=\u00a0screenX;\n    <\/li>\n<li>\n     mRotatedPoints[i].y\u00a0=\u00a0screenY;\n    <\/li>\n<li>\n     mRotatedPoints[i].z\u00a0=<br \/>\n     <span class=\"number\"><br \/>\n      0<br \/>\n     <\/span><br \/>\n     ;\n    <\/li>\n<li>\n     }\n    <\/li>\n<li>\n     }\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      void<br \/>\n     <\/span><br \/>\n     drawLines(Canvas\u00a0c)\u00a0{\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      int<br \/>\n     <\/span><br \/>\n     n\u00a0=\u00a0mLines.length;\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      for<br \/>\n     <\/span><br \/>\n     (<br \/>\n     <span class=\"keyword\"><br \/>\n      int<br \/>\n     <\/span><br \/>\n     i\u00a0=<br \/>\n     <span class=\"number\"><br \/>\n      0<br \/>\n     <\/span><br \/>\n     ;\u00a0i\u00a0&lt;\u00a0n;\u00a0i++)\u00a0{\n    <\/li>\n<li>\n     ThreeDLine\u00a0l\u00a0=\u00a0mLines[i];\n    <\/li>\n<li>\n     ThreeDPoint\u00a0start\u00a0=\u00a0mRotatedPoints[l.startPoint];\n    <\/li>\n<li>\n     ThreeDPoint\u00a0end\u00a0=\u00a0mRotatedPoints[l.endPoint];\n    <\/li>\n<li>\n     c.drawLine(start.x,\u00a0start.y,\u00a0end.x,\u00a0end.y,\u00a0mPaint);\n    <\/li>\n<li>\n     }\n    <\/li>\n<li>\n     }\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      void<br \/>\n     <\/span><br \/>\n     drawTouchPoint(Canvas\u00a0c)\u00a0{\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      if<br \/>\n     <\/span><br \/>\n     (mTouchX\u00a0&gt;=<br \/>\n     <span class=\"number\"><br \/>\n      0<br \/>\n     <\/span><br \/>\n     &amp;&amp;\u00a0mTouchY\u00a0&gt;=<br \/>\n     <span class=\"number\"><br \/>\n      0<br \/>\n     <\/span><br \/>\n     )\u00a0{\n    <\/li>\n<li>\n     c.drawCircle(mTouchX,\u00a0mTouchY,<br \/>\n     <span class=\"number\"><br \/>\n      80<br \/>\n     <\/span><br \/>\n     ,\u00a0mPaint);\n    <\/li>\n<li>\n     }\n    <\/li>\n<li>\n     }\n    <\/li>\n<li>\n     }\n    <\/li>\n<li>\n     }\n    <\/li>\n<\/ol><\/div>\n<p>  <textarea class=\"java:nogutter\" name=\"code\" style=\"DISPLAY: none\">\/*<br \/>\n * Copyright (C) 2009 The Android Open Source Project<br \/>\n *<br \/>\n * Licensed under the Apache License, Version 2.0 (the &#8220;License&#8221;);<br \/>\n * you may not use this file except in compliance with the License.<br \/>\n * You may obtain a copy of the License at<br \/>\n *<br \/>\n *      http:\/\/www.apache.org\/licenses\/LICENSE-2.0<br \/>\n *<br \/>\n * Unless required by applicable law or agreed to in writing, software<br \/>\n * distributed under the License is distributed on an &#8220;AS IS&#8221; BASIS,<br \/>\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<br \/>\n * See the License for the specific language governing permissions and<br \/>\n * limitations under the License.<br \/>\n *\/<br \/>\npackage com.example.android.livecubes.cube2;<br \/>\nimport android.content.SharedPreferences;<br \/>\nimport android.graphics.Canvas;<br \/>\nimport android.graphics.Paint;<br \/>\nimport android.graphics.Rect;<br \/>\nimport android.os.Handler;<br \/>\nimport android.os.SystemClock;<br \/>\nimport android.service.wallpaper.WallpaperService;<br \/>\nimport android.view.MotionEvent;<br \/>\nimport android.view.SurfaceHolder;<br \/>\n\/*<br \/>\n * This animated wallpaper draws a rotating wireframe shape. It is similar to<br \/>\n * example #1, but has a choice of 2 shapes, which are user selectable and<br \/>\n * defined in resources instead of in code.<br \/>\n *\/<br \/>\npublic class CubeWallpaper2 extends WallpaperService {<br \/>\n    public static final String SHARED_PREFS_NAME=&#8221;cube2settings&#8221;;<br \/>\n    static class ThreeDPoint {<br \/>\n        float x;<br \/>\n        float y;<br \/>\n        float z;<br \/>\n    }<br \/>\n    static class ThreeDLine {<br \/>\n        int startPoint;<br \/>\n        int endPoint;<br \/>\n    }<br \/>\n    @Override<br \/>\n    public void onCreate() {<br \/>\n        super.onCreate();<br \/>\n    }<br \/>\n    @Override<br \/>\n    public void onDestroy() {<br \/>\n        super.onDestroy();<br \/>\n    }<br \/>\n    @Override<br \/>\n    public Engine onCreateEngine() {<br \/>\n        return new CubeEngine();<br \/>\n    }<br \/>\n    class CubeEngine extends Engine<br \/>\n        implements SharedPreferences.OnSharedPreferenceChangeListener {<br \/>\n        private final Handler mHandler = new Handler();<br \/>\n        ThreeDPoint [] mOriginalPoints;<br \/>\n        ThreeDPoint [] mRotatedPoints;<br \/>\n        ThreeDLine [] mLines;<br \/>\n        private final Paint mPaint = new Paint();<br \/>\n        private float mOffset;<br \/>\n        private float mTouchX = -1;<br \/>\n        private float mTouchY = -1;<br \/>\n        private long mStartTime;<br \/>\n        private float mCenterX;<br \/>\n        private float mCenterY;<br \/>\n        private final Runnable mDrawCube = new Runnable() {<br \/>\n            public void run() {<br \/>\n                drawFrame();<br \/>\n            }<br \/>\n        };<br \/>\n        private boolean mVisible;<br \/>\n        private SharedPreferences mPrefs;<br \/>\n        CubeEngine() {<br \/>\n            \/\/ Create a Paint to draw the lines for our cube<br \/>\n            final Paint paint = mPaint;<br \/>\n            paint.setColor(0xffffffff);<br \/>\n            paint.setAntiAlias(true);<br \/>\n            paint.setStrokeWidth(2);<br \/>\n            paint.setStrokeCap(Paint.Cap.ROUND);<br \/>\n            paint.setStyle(Paint.Style.STROKE);<br \/>\n            mStartTime = SystemClock.elapsedRealtime();<br \/>\n            mPrefs = CubeWallpaper2.this.getSharedPreferences(SHARED_PREFS_NAME, 0);<br \/>\n            mPrefs.registerOnSharedPreferenceChangeListener(this);<br \/>\n            onSharedPreferenceChanged(mPrefs, null);<br \/>\n        }<br \/>\n        public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {<br \/>\n            String shape = prefs.getString(&#8220;cube2_shape&#8221;, &#8220;cube&#8221;);<br \/>\n            \/\/ read the 3D model from the resource<br \/>\n            readModel(shape);<br \/>\n        }<br \/>\n        private void readModel(String prefix) {<br \/>\n            \/\/ Read the model definition in from a resource.<br \/>\n            \/\/ get the resource identifiers for the arrays for the selected shape<br \/>\n            int pid = getResources().getIdentifier(prefix + &#8220;points&#8221;, &#8220;array&#8221;, getPackageName());<br \/>\n            int lid = getResources().getIdentifier(prefix + &#8220;lines&#8221;, &#8220;array&#8221;, getPackageName());<br \/>\n            String [] p = getResources().getStringArray(pid);<br \/>\n            int numpoints = p.length;<br \/>\n            mOriginalPoints = new ThreeDPoint[numpoints];<br \/>\n            mRotatedPoints = new ThreeDPoint[numpoints];<br \/>\n            for (int i = 0; i &lt; numpoints; i++) {<br \/>\n                mOriginalPoints[i] = new ThreeDPoint();<br \/>\n                mRotatedPoints[i] = new ThreeDPoint();<br \/>\n                String [] coord = p[i].split(&#8221; &#8220;);<br \/>\n                mOriginalPoints[i].x = Float.valueOf(coord[0]);<br \/>\n                mOriginalPoints[i].y = Float.valueOf(coord[1]);<br \/>\n                mOriginalPoints[i].z = Float.valueOf(coord[2]);<br \/>\n            }<br \/>\n            String [] l = getResources().getStringArray(lid);<br \/>\n            int numlines = l.length;<br \/>\n            mLines = new ThreeDLine[numlines];<br \/>\n            for (int i = 0; i &lt; numlines; i++) {<br \/>\n                mLines[i] = new ThreeDLine();<br \/>\n                String [] idx = l[i].split(&#8221; &#8220;);<br \/>\n                mLines[i].startPoint = Integer.valueOf(idx[0]);<br \/>\n                mLines[i].endPoint = Integer.valueOf(idx[1]);<br \/>\n            }<br \/>\n        }<br \/>\n        @Override<br \/>\n        public void onCreate(SurfaceHolder surfaceHolder) {<br \/>\n            super.onCreate(surfaceHolder);<br \/>\n            setTouchEventsEnabled(true);<br \/>\n        }<br \/>\n        @Override<br \/>\n        public void onDestroy() {<br \/>\n            super.onDestroy();<br \/>\n            mHandler.removeCallbacks(mDrawCube);<br \/>\n        }<br \/>\n        @Override<br \/>\n        public void onVisibilityChanged(boolean visible) {<br \/>\n            mVisible = visible;<br \/>\n            if (visible) {<br \/>\n                drawFrame();<br \/>\n            } else {<br \/>\n                mHandler.removeCallbacks(mDrawCube);<br \/>\n            }<br \/>\n        }<br \/>\n        @Override<br \/>\n        public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {<br \/>\n            super.onSurfaceChanged(holder, format, width, height);<br \/>\n            \/\/ store the center of the surface, so we can draw the cube in the right spot<br \/>\n            mCenterX = width\/2.0f;<br \/>\n            mCenterY = height\/2.0f;<br \/>\n            drawFrame();<br \/>\n        }<br \/>\n        @Override<br \/>\n        public void onSurfaceCreated(SurfaceHolder holder) {<br \/>\n            super.onSurfaceCreated(holder);<br \/>\n        }<br \/>\n        @Override<br \/>\n        public void onSurfaceDestroyed(SurfaceHolder holder) {<br \/>\n            super.onSurfaceDestroyed(holder);<br \/>\n            mVisible = false;<br \/>\n            mHandler.removeCallbacks(mDrawCube);<br \/>\n        }<br \/>\n        @Override<br \/>\n        public void onOffsetsChanged(float xOffset, float yOffset,<br \/>\n                float xStep, float yStep, int xPixels, int yPixels) {<br \/>\n            mOffset = xOffset;<br \/>\n            drawFrame();<br \/>\n        }<br \/>\n        \/*<br \/>\n         * Store the position of the touch event so we can use it for drawing later<br \/>\n         *\/<br \/>\n        @Override<br \/>\n        public void onTouchEvent(MotionEvent event) {<br \/>\n            if (event.getAction() == MotionEvent.ACTION_MOVE) {<br \/>\n                mTouchX = event.getX();<br \/>\n                mTouchY = event.getY();<br \/>\n            } else {<br \/>\n                mTouchX = -1;<br \/>\n                mTouchY = -1;<br \/>\n            }<br \/>\n            super.onTouchEvent(event);<br \/>\n        }<br \/>\n        \/*<br \/>\n         * Draw one frame of the animation. This method gets called repeatedly<br \/>\n         * by posting a delayed Runnable. You can do any drawing you want in<br \/>\n         * here. This example draws a wireframe cube.<br \/>\n         *\/<br \/>\n        void drawFrame() {<br \/>\n            final SurfaceHolder holder = getSurfaceHolder();<br \/>\n            final Rect frame = holder.getSurfaceFrame();<br \/>\n            final int width = frame.width();<br \/>\n            final int height = frame.height();<br \/>\n            Canvas c = null;<br \/>\n            try {<br \/>\n                c = holder.lockCanvas();<br \/>\n                if (c != null) {<br \/>\n                    \/\/ draw something<br \/>\n                    drawCube(c);<br \/>\n                    drawTouchPoint(c);<br \/>\n                }<br \/>\n            } finally {<br \/>\n                if (c != null) holder.unlockCanvasAndPost(c);<br \/>\n            }<br \/>\n            mHandler.removeCallbacks(mDrawCube);<br \/>\n            if (mVisible) {<br \/>\n                mHandler.postDelayed(mDrawCube, 1000 \/ 25);<br \/>\n            }<br \/>\n        }<br \/>\n        void drawCube(Canvas c) {<br \/>\n            c.save();<br \/>\n            c.translate(mCenterX, mCenterY);<br \/>\n            c.drawColor(0xff000000);<br \/>\n            long now = SystemClock.elapsedRealtime();<br \/>\n            float xrot = ((float)(now &#8211; mStartTime)) \/ 1000;<br \/>\n            float yrot = (0.5f &#8211; mOffset) * 2.0f;<br \/>\n            rotateAndProjectPoints(xrot, yrot);<br \/>\n            drawLines(c);<br \/>\n            c.restore();<br \/>\n        }<br \/>\n        void rotateAndProjectPoints(float xrot, float yrot) {<br \/>\n            int n = mOriginalPoints.length;<br \/>\n            for (int i = 0; i &lt; n; i++) {<br \/>\n                \/\/ rotation around X-axis<br \/>\n                ThreeDPoint p = mOriginalPoints[i];<br \/>\n                float x = p.x;<br \/>\n                float y = p.y;<br \/>\n                float z = p.z;<br \/>\n                float newy = (float)(Math.sin(xrot) * z + Math.cos(xrot) * y);<br \/>\n                float newz = (float)(Math.cos(xrot) * z &#8211; Math.sin(xrot) * y);<br \/>\n                \/\/ rotation around Y-axis<br \/>\n                float newx = (float)(Math.sin(yrot) * newz + Math.cos(yrot) * x);<br \/>\n                newz = (float)(Math.cos(yrot) * newz &#8211; Math.sin(yrot) * x);<br \/>\n                \/\/ 3D-to-2D projection<br \/>\n                float screenX = newx \/ (4 &#8211; newz \/ 400);<br \/>\n                float screenY = newy \/ (4 &#8211; newz \/ 400);<br \/>\n                mRotatedPoints[i].x = screenX;<br \/>\n                mRotatedPoints[i].y = screenY;<br \/>\n                mRotatedPoints[i].z = 0;<br \/>\n            }<br \/>\n        }<br \/>\n        void drawLines(Canvas c) {<br \/>\n            int n = mLines.length;<br \/>\n            for (int i = 0; i &lt; n; i++) {<br \/>\n                ThreeDLine l = mLines[i];<br \/>\n                ThreeDPoint start = mRotatedPoints[l.startPoint];<br \/>\n                ThreeDPoint end = mRotatedPoints[l.endPoint];<br \/>\n                c.drawLine(start.x, start.y, end.x, end.y, mPaint);<br \/>\n            }<br \/>\n        }<br \/>\n        void drawTouchPoint(Canvas c) {<br \/>\n            if (mTouchX &gt;=0 &amp;&amp; mTouchY &gt;= 0) {<br \/>\n                c.drawCircle(mTouchX, mTouchY, 80, mPaint);<br \/>\n            }<br \/>\n        }<br \/>\n    }<br \/>\n}<br \/>\n<\/textarea><\/p>\n<\/p>\n<p>\n   <span style=\"font-size:14px\"><br \/>\n   <\/span>\n  <\/p>\n<div class=\"dp-highlighter\">\n<div class=\"bar\">\n<div class=\"tools\">\n     Java\u4ee3\u7801<br \/>\n     <a href=\"http:\/\/daimajishu.iteye.com\/blog\/1080874#\" rel=\"nofollow\" title=\"\u590d\u5236\u4ee3\u7801\"><br \/>\n     <\/a>\n    <\/div>\n<\/p><\/div>\n<ol class=\"dp-j\">\n<li>\n     <span class=\"comment\"><br \/>\n      \/*<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      *\u00a0Copyright\u00a0(C)\u00a02009\u00a0Google\u00a0Inc.<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      *<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      *\u00a0Licensed\u00a0under\u00a0the\u00a0Apache\u00a0License,\u00a0Version\u00a02.0\u00a0(the\u00a0&#8220;License&#8221;);\u00a0you\u00a0may\u00a0not<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      *\u00a0use\u00a0this\u00a0file\u00a0except\u00a0in\u00a0compliance\u00a0with\u00a0the\u00a0License.\u00a0You\u00a0may\u00a0obtain\u00a0a\u00a0copy\u00a0of<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      *\u00a0the\u00a0License\u00a0at<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      *<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      *\u00a0http:\/\/www.apache.org\/licenses\/LICENSE-2.0<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      *<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      *\u00a0Unless\u00a0required\u00a0by\u00a0applicable\u00a0law\u00a0or\u00a0agreed\u00a0to\u00a0in\u00a0writing,\u00a0software<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      *\u00a0distributed\u00a0under\u00a0the\u00a0License\u00a0is\u00a0distributed\u00a0on\u00a0an\u00a0&#8220;AS\u00a0IS&#8221;\u00a0BASIS,\u00a0WITHOUT<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      *\u00a0WARRANTIES\u00a0OR\u00a0CONDITIONS\u00a0OF\u00a0ANY\u00a0KIND,\u00a0either\u00a0express\u00a0or\u00a0implied.\u00a0See\u00a0the<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      *\u00a0License\u00a0for\u00a0the\u00a0specific\u00a0language\u00a0governing\u00a0permissions\u00a0and\u00a0limitations\u00a0under<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      *\u00a0the\u00a0License.<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"comment\"><br \/>\n      *\/<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      package<br \/>\n     <\/span><br \/>\n     com.example.android.livecubes.cube2;\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      import<br \/>\n     <\/span><br \/>\n     com.example.android.livecubes.R;\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      import<br \/>\n     <\/span><br \/>\n     android.content.SharedPreferences;\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      import<br \/>\n     <\/span><br \/>\n     android.os.Bundle;\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      import<br \/>\n     <\/span><br \/>\n     android.preference.PreferenceActivity;\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      public<br \/>\n     <\/span><br \/>\n     <span class=\"keyword\"><br \/>\n      class<br \/>\n     <\/span><br \/>\n     CubeWallpaper2Settings<br \/>\n     <span class=\"keyword\"><br \/>\n      extends<br \/>\n     <\/span><br \/>\n     PreferenceActivity\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      implements<br \/>\n     <\/span><br \/>\n     SharedPreferences.OnSharedPreferenceChangeListener\u00a0{\n    <\/li>\n<li>\n     <span class=\"annotation\"><br \/>\n      @Override<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      protected<br \/>\n     <\/span><br \/>\n     <span class=\"keyword\"><br \/>\n      void<br \/>\n     <\/span><br \/>\n     onCreate(Bundle\u00a0icicle)\u00a0{\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      super<br \/>\n     <\/span><br \/>\n     .onCreate(icicle);\n    <\/li>\n<li>\n     getPreferenceManager().setSharedPreferencesName(\n    <\/li>\n<li>\n     CubeWallpaper2.SHARED_PREFS_NAME);\n    <\/li>\n<li>\n     addPreferencesFromResource(R.xml.cube2_settings);\n    <\/li>\n<li>\n     getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      this<br \/>\n     <\/span><br \/>\n     );\n    <\/li>\n<li>\n     }\n    <\/li>\n<li>\n     <span class=\"annotation\"><br \/>\n      @Override<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      protected<br \/>\n     <\/span><br \/>\n     <span class=\"keyword\"><br \/>\n      void<br \/>\n     <\/span><br \/>\n     onResume()\u00a0{\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      super<br \/>\n     <\/span><br \/>\n     .onResume();\n    <\/li>\n<li>\n     }\n    <\/li>\n<li>\n     <span class=\"annotation\"><br \/>\n      @Override<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      protected<br \/>\n     <\/span><br \/>\n     <span class=\"keyword\"><br \/>\n      void<br \/>\n     <\/span><br \/>\n     onDestroy()\u00a0{\n    <\/li>\n<li>\n     getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      this<br \/>\n     <\/span><br \/>\n     );\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      super<br \/>\n     <\/span><br \/>\n     .onDestroy();\n    <\/li>\n<li>\n     }\n    <\/li>\n<li>\n     <span class=\"keyword\"><br \/>\n      public<br \/>\n     <\/span><br \/>\n     <span class=\"keyword\"><br \/>\n      void<br \/>\n     <\/span><br \/>\n     onSharedPreferenceChanged(SharedPreferences\u00a0sharedPreferences,\n    <\/li>\n<li>\n     String\u00a0key)\u00a0{\n    <\/li>\n<li>\n     }\n    <\/li>\n<li>\n     }\n    <\/li>\n<\/ol><\/div>\n<p>  <textarea class=\"java:nogutter\" name=\"code\" style=\"DISPLAY: none\">\/*<br \/>\n * Copyright (C) 2009 Google Inc.<br \/>\n *<br \/>\n * Licensed under the Apache License, Version 2.0 (the &#8220;License&#8221;); you may not<br \/>\n * use this file except in compliance with the License. You may obtain a copy of<br \/>\n * the License at<br \/>\n *<br \/>\n * http:\/\/www.apache.org\/licenses\/LICENSE-2.0<br \/>\n *<br \/>\n * Unless required by applicable law or agreed to in writing, software<br \/>\n * distributed under the License is distributed on an &#8220;AS IS&#8221; BASIS, WITHOUT<br \/>\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the<br \/>\n * License for the specific language governing permissions and limitations under<br \/>\n * the License.<br \/>\n *\/<br \/>\npackage com.example.android.livecubes.cube2;<br \/>\nimport com.example.android.livecubes.R;<br \/>\nimport android.content.SharedPreferences;<br \/>\nimport android.os.Bundle;<br \/>\nimport android.preference.PreferenceActivity;<br \/>\npublic class CubeWallpaper2Settings extends PreferenceActivity<br \/>\n    implements SharedPreferences.OnSharedPreferenceChangeListener {<br \/>\n    @Override<br \/>\n    protected void onCreate(Bundle icicle) {<br \/>\n        super.onCreate(icicle);<br \/>\n        getPreferenceManager().setSharedPreferencesName(<br \/>\n                CubeWallpaper2.SHARED_PREFS_NAME);<br \/>\n        addPreferencesFromResource(R.xml.cube2_settings);<br \/>\n        getPreferenceManager().getSharedPreferences().registerOnSharedPreferenceChangeListener(<br \/>\n                this);<br \/>\n    }<br \/>\n    @Override<br \/>\n    protected void onResume() {<br \/>\n        super.onResume();<br \/>\n    }<br \/>\n    @Override<br \/>\n    protected void onDestroy() {<br \/>\n        getPreferenceManager().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(<br \/>\n                this);<br \/>\n        super.onDestroy();<br \/>\n    }<br \/>\n    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,<br \/>\n            String key) {<br \/>\n    }<br \/>\n}<br \/>\n<\/textarea><\/p>\n<\/p>\n<p>\n   \u7c7bTimeEngine\u624d\u662f\u5904\u7406\u58c1\u7eb8\u7684\u6838\u5fc3\u7c7b\uff0c\u6211\u4eec\u4f1a\u5728\u7c7bTimeEngine\u4e2d\u52a0\u4e0a\u81ea\u5df1\u7684\u903b\u8f91\u4ee5\u5b8c\u6210\u58c1\u7eb8\u7684\u7ed8\u5236\u3001\u53d8\u5316\u4ee5\u53ca\u9500\u6bc1\u3002Engine\u7684\u751f\u547d\u5468\u671f\u4e0e\u5927\u591a\u6570OPhone<br \/>\n   <a href=\"http:\/\/dev.10086.cn\/cmdn\/wiki\/index.php?doc-view-1781\" rel=\"nofollow\"><br \/>\n    \u5e94\u7528\u7a0b\u5e8f<br \/>\n   <\/a><br \/>\n   \u7ec4\u4ef6\uff0c\u6bd4\u5982activity\u7c7b\u4f3c\uff0c\u90fd\u662f\u4eceonCreate()\u5f00\u59cb\uff0c\u5728\u9500\u6bc1\u65f6\u8c03\u7528onDestory()\u65b9\u6cd5\u3002\u4e0d\u540c\u7684\u662fWallpaperService\u4f1a\u63d0\u4f9b\u4e00\u4e2asurface\u7528\u6765\u7ed8\u5236\u58c1\u7eb8\uff0c\u6240\u4ee5\u5728\u751f\u547d\u5468\u671f\u4e2d\u591a\u4e00\u4e2aonSurfaceCreated\u4e0eonSurfaceDestroyed\u7684\u8fc7\u7a0b\u3002\u4e0b\u9762\u662f\u4e00\u4e2a\u6700\u7b80\u751f\u547d\u5468\u671f\uff1a\n  <\/p>\n<\/p>\n<p>\n   \u4e5f\u5c31\u662f\u8bf4\u53ea\u8981\u6211\u4eec\u5b9e\u73b0\u4e0a\u9762\u56db\u4e2a\u65b9\u6cd5\uff0c\u4e00\u4e2a\u57fa\u672c\u7684LiveWallpaper\u5c31\u53ef\u4ee5\u5b8c\u6210\u4e86\u3002\u8ba9\u6211\u4eec\u9010\u4e2a\u770b\u4e00\u4e0b\u8fd9\u51e0\u4e2a\u65b9\u6cd5\u7684\u5b9e\u73b0\u3002\n  <\/p>\n<p>\n   <span style=\"font-size:14px\"><br \/>\n    nCreate\u65b9\u6cd5\u91cc\uff0c\u6211\u4eec<br \/>\n    <br \/>\n    setTouchEventsEnabled(true);<\/p>\n<p>    \u4f5c\u7528\u662f\u4f7f\u58c1\u7eb8\u80fd\u54cd\u5e94touch event\uff0c\u9ed8\u8ba4\u662ffalse\u3002TimeWall\u4f1a\u5728\u7528\u6237\u70b9\u51fb\u5c4f\u5e55\u7684\u65f6\u5019\u753b\u4e00\u4e2a\u5341\u5b57\u67b6\uff0c\u6240\u4ee5\u6211\u4eec\u9700\u8981\u8bbe\u7f6e\u5176\u4e3atrue\u3002<\/p>\n<p>    \u53ef\u4ee5\u770b\u5230\u6211\u4eec\u5728\u8fd9\u56db\u4e2a\u65b9\u6cd5\u91cc\u9762\u505a\u7684\u4e8b\u60c5\u975e\u5e38\u7b80\u5355\uff0c\u5c31\u662f\u5728create\u65f6\u5019\u53d1\u4e00\u4e2amessage\uff0c\u6267\u884c\u753b\u9762\u7684\u7ed8\u5236\uff0c\u5728destory\u65f6remove\u8fd9\u4e2a\u6d88\u606f\u3002<br \/>\n   <\/span>\n  <\/p>\n<p>\n   <span style=\"font-size:14px\"><br \/>\n    \u4ece\u4e0a\u9762\u53ef\u4ee5\u770b\u51fa\uff0c\u52a8\u6001\u58c1\u7eb8\u5b9e\u9645\u4e0a\u5c31\u662f\u4e0d\u65ad\u5237\u65b0\u7684\u9759\u6001\u58c1\u7eb8\uff0c\u8d8a\u534e\u4e3d\u8d8a\u6d41\u7545\uff0cCPU\u5c31\u6d88\u8017\u8d8a\u5927\uff0c\u5bf9\u4e8e\u73b0\u5728\u7684\u672c\u6765\u7535\u91cf\u5c31\u4e0d\u600e\u4e48\u5730\u7684\u667a\u80fd\u673a\u6765\u8bf4\uff0c\u8017\u7535\u4e5f\u662f\u5f88\u53ef\u89c2\u7684\u3002\u4f46\u662f\u5076\u5c14\u5411\u670b\u53cb\u4eec\u70ab\u4e00\u4e0b\u8fd8\u662f\u7edd\u5bf9\u53ef\u884c\u7684\u3002drawTime()\u4e0e drawCross()\u7684\u5185\u5bb9\u53ef\u4ee5\u7531\u5bb6\u81ea\u5df1\u5b9e\u73b0\uff0c\u5728TimeWall\u91cc\uff0c\u5b83\u4eec\u6bd4\u8f83\u7b80\u5355\u3002drawTime()\u662f\u8ba1\u7b97\u4e0b\u4e00\u5904Time String\u5e94\u8be5\u79fb\u52a8\u5230\u7684\u5750\u6807\uff0c\u4ee5\u53ca\u753b\u51fa\u8fd9\u4e2aString\u3002drawCross()\u7684\u4f5c\u7528\u662f\u5728\u7528\u6237\u89e6\u53d1onTouchEvent\u65f6\u753b\u4e00\u4e2a\u5341\u5b57\u67b6\u3002\u56e0\u4e3a TimeWall\u6bd4\u8f83\u7b80\u5355\uff0c\u5982\u679c\u5927\u5bb6\u81ea\u5df1\u5b9e\u73b0\u7684\u753b\u56fe\u6bd4\u8f83\u590d\u6742\uff0c\u53ef\u4ee5\u53e6\u5916\u5f00\u542f\u4e00\u4e2a\u7ebf\u7a0b\u6765\u5237\u65b0<br \/>\n    <a href=\"http:\/\/dev.10086.cn\/cmdn\/wiki\/index.php?doc-view-1788\" rel=\"nofollow\"><br \/>\n     UI<br \/>\n    <\/a><br \/>\n    \uff0c\u5426\u5219\u6709\u53ef\u80fd\u4e3b\u7ebf\u7a0b\u88ab\u963b\u585e\u6389\u3002<br \/>\n   <\/span>\n  <\/p>\n<p>\n   <span style=\"font-size:14px\"><br \/>\n    cube2.xml<br \/>\n   <\/span>\n  <\/p>\n<p>\n   <span style=\"font-size:14px\"><br \/>\n   <\/span>\n  <\/p>\n<div class=\"dp-highlighter\">\n<div class=\"bar\">\n<div class=\"tools\">\n     Java\u4ee3\u7801<br \/>\n     <a href=\"http:\/\/daimajishu.iteye.com\/blog\/1080874#\" rel=\"nofollow\" title=\"\u590d\u5236\u4ee3\u7801\"><br \/>\n     <\/a>\n    <\/div>\n<\/p><\/div>\n<ol class=\"dp-j\">\n<li>\n     &lt;wallpaper\u00a0xmlns:android=<br \/>\n     <span class=\"string\"><br \/>\n      &#8220;http:\/\/schemas.android.com\/apk\/res\/android&#8221;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     android:settingsActivity=<br \/>\n     <span class=\"string\"><br \/>\n      &#8220;com.example.android.livecubes.cube2.CubeWallpaper2Settings&#8221;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     \/&gt;\n    <\/li>\n<\/ol><\/div>\n<p>  <textarea class=\"java:nogutter\" name=\"code\" style=\"DISPLAY: none\">&lt;wallpaper xmlns:android=&#8221;http:\/\/schemas.android.com\/apk\/res\/android&#8221;<br \/>\n        android:settingsActivity=&#8221;com.example.android.livecubes.cube2.CubeWallpaper2Settings&#8221;<br \/>\n\/&gt;<\/textarea><\/p>\n<\/p>\n<p>\n   <span style=\"font-size:14px\"><br \/>\n    cube2_setting<br \/>\n   <\/span>\n  <\/p>\n<p>\n   <span style=\"font-size:14px\"><br \/>\n   <\/span>\n  <\/p>\n<div class=\"dp-highlighter\">\n<div class=\"bar\">\n<div class=\"tools\">\n     Xhtml\u4ee3\u7801<br \/>\n     <a href=\"http:\/\/daimajishu.iteye.com\/blog\/1080874#\" rel=\"nofollow\" title=\"\u590d\u5236\u4ee3\u7801\"><br \/>\n     <\/a>\n    <\/div>\n<\/p><\/div>\n<ol class=\"dp-xml\">\n<li>\n     <span class=\"tag\"><br \/>\n      &lt;<br \/>\n     <\/span><br \/>\n     <span class=\"tag-name\"><br \/>\n      PreferenceScreen<br \/>\n     <\/span><br \/>\n     <span class=\"attribute\"><br \/>\n      xmlns:android<br \/>\n     <\/span><br \/>\n     =<br \/>\n     <span class=\"attribute-value\"><br \/>\n      &#8220;http:\/\/schemas.android.com\/apk\/res\/android&#8221;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"attribute\"><br \/>\n      android:title<br \/>\n     <\/span><br \/>\n     =<br \/>\n     <span class=\"attribute-value\"><br \/>\n      &#8220;@string\/cube2_settings&#8221;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"attribute\"><br \/>\n      android:key<br \/>\n     <\/span><br \/>\n     =<br \/>\n     <span class=\"attribute-value\"><br \/>\n      &#8220;cube2wallpaper_settings&#8221;<br \/>\n     <\/span><br \/>\n     <span class=\"tag\"><br \/>\n      &gt;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"tag\"><br \/>\n      &lt;<br \/>\n     <\/span><br \/>\n     <span class=\"tag-name\"><br \/>\n      ListPreference<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"attribute\"><br \/>\n      android:key<br \/>\n     <\/span><br \/>\n     =<br \/>\n     <span class=\"attribute-value\"><br \/>\n      &#8220;cube2_shape&#8221;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"attribute\"><br \/>\n      android:title<br \/>\n     <\/span><br \/>\n     =<br \/>\n     <span class=\"attribute-value\"><br \/>\n      &#8220;@string\/cube2_settings_title&#8221;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"attribute\"><br \/>\n      android:summary<br \/>\n     <\/span><br \/>\n     =<br \/>\n     <span class=\"attribute-value\"><br \/>\n      &#8220;@string\/cube2_settings_summary&#8221;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"attribute\"><br \/>\n      android:entries<br \/>\n     <\/span><br \/>\n     =<br \/>\n     <span class=\"attribute-value\"><br \/>\n      &#8220;@array\/cube2_shapenames&#8221;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"attribute\"><br \/>\n      android:entryValues<br \/>\n     <\/span><br \/>\n     =<br \/>\n     <span class=\"attribute-value\"><br \/>\n      &#8220;@array\/cube2_shapeprefix&#8221;<br \/>\n     <\/span><br \/>\n     <span class=\"tag\"><br \/>\n      \/&gt;<br \/>\n     <\/span>\n    <\/li>\n<li>\n     <span class=\"tag\"><br \/>\n      &lt;\/<br \/>\n     <\/span><br \/>\n     <span class=\"tag-name\"><br \/>\n      PreferenceScreen<br \/>\n     <\/span><br \/>\n     <span class=\"tag\"><br \/>\n      &gt;<br \/>\n     <\/span>\n    <\/li>\n<\/ol><\/div>\n<\/p>\n<\/p><\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u968f\u7740 \u4e09\u661f Oscar\u7684\u4e0a\u5e02\uff0c\u6d41\u7545\u7684\u64cd\u4f5c\uff0c\u534e\u4e3d\u7684\u754c\u9762\uff0c OPhone 2.0\u7684\u4e0d\u4fd7\u8868\u73b0\u4e0d\u7981\u8ba9\u4eba\u773c\u524d\u4e00\u4eae\u3002\u4f5c\u4e3aO [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":215,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[],"class_list":["post-2030","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-8"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v24.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u52a8\u6001\u58c1\u7eb8\u63a2\u7a76 - \u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/www.wunen.com\/index.php\/2025\/05\/10\/\u52a8\u6001\u58c1\u7eb8\u63a2\u7a76\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u52a8\u6001\u58c1\u7eb8\u63a2\u7a76 - \u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51\" \/>\n<meta property=\"og:description\" content=\"\u968f\u7740 \u4e09\u661f Oscar\u7684\u4e0a\u5e02\uff0c\u6d41\u7545\u7684\u64cd\u4f5c\uff0c\u534e\u4e3d\u7684\u754c\u9762\uff0c OPhone 2.0\u7684\u4e0d\u4fd7\u8868\u73b0\u4e0d\u7981\u8ba9\u4eba\u773c\u524d\u4e00\u4eae\u3002\u4f5c\u4e3aO [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"http:\/\/www.wunen.com\/index.php\/2025\/05\/10\/\u52a8\u6001\u58c1\u7eb8\u63a2\u7a76\/\" \/>\n<meta property=\"og:site_name\" content=\"\u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51\" \/>\n<meta property=\"article:published_time\" content=\"2025-05-09T16:00:07+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/\u8d44\u8baf.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"260\" \/>\n\t<meta property=\"og:image:height\" content=\"180\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"admin@wunen\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin@wunen\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"15 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"http:\/\/www.wunen.com\/index.php\/2025\/05\/10\/%e5%8a%a8%e6%80%81%e5%a3%81%e7%ba%b8%e6%8e%a2%e7%a9%b6\/#article\",\"isPartOf\":{\"@id\":\"http:\/\/www.wunen.com\/index.php\/2025\/05\/10\/%e5%8a%a8%e6%80%81%e5%a3%81%e7%ba%b8%e6%8e%a2%e7%a9%b6\/\"},\"author\":{\"name\":\"admin@wunen\",\"@id\":\"http:\/\/www.wunen.com\/#\/schema\/person\/d5f7a6cf545656a9c90d507e64452db8\"},\"headline\":\"\u52a8\u6001\u58c1\u7eb8\u63a2\u7a76\",\"datePublished\":\"2025-05-09T16:00:07+00:00\",\"mainEntityOfPage\":{\"@id\":\"http:\/\/www.wunen.com\/index.php\/2025\/05\/10\/%e5%8a%a8%e6%80%81%e5%a3%81%e7%ba%b8%e6%8e%a2%e7%a9%b6\/\"},\"wordCount\":2924,\"commentCount\":0,\"publisher\":{\"@id\":\"http:\/\/www.wunen.com\/#organization\"},\"image\":{\"@id\":\"http:\/\/www.wunen.com\/index.php\/2025\/05\/10\/%e5%8a%a8%e6%80%81%e5%a3%81%e7%ba%b8%e6%8e%a2%e7%a9%b6\/#primaryimage\"},\"thumbnailUrl\":\"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/\u8d44\u8baf.jpg\",\"articleSection\":[\"\u52a8\u6001\u58c1\u7eb8\"],\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"http:\/\/www.wunen.com\/index.php\/2025\/05\/10\/%e5%8a%a8%e6%80%81%e5%a3%81%e7%ba%b8%e6%8e%a2%e7%a9%b6\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.wunen.com\/index.php\/2025\/05\/10\/%e5%8a%a8%e6%80%81%e5%a3%81%e7%ba%b8%e6%8e%a2%e7%a9%b6\/\",\"url\":\"http:\/\/www.wunen.com\/index.php\/2025\/05\/10\/%e5%8a%a8%e6%80%81%e5%a3%81%e7%ba%b8%e6%8e%a2%e7%a9%b6\/\",\"name\":\"\u52a8\u6001\u58c1\u7eb8\u63a2\u7a76 - \u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51\",\"isPartOf\":{\"@id\":\"http:\/\/www.wunen.com\/#website\"},\"primaryImageOfPage\":{\"@id\":\"http:\/\/www.wunen.com\/index.php\/2025\/05\/10\/%e5%8a%a8%e6%80%81%e5%a3%81%e7%ba%b8%e6%8e%a2%e7%a9%b6\/#primaryimage\"},\"image\":{\"@id\":\"http:\/\/www.wunen.com\/index.php\/2025\/05\/10\/%e5%8a%a8%e6%80%81%e5%a3%81%e7%ba%b8%e6%8e%a2%e7%a9%b6\/#primaryimage\"},\"thumbnailUrl\":\"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/\u8d44\u8baf.jpg\",\"datePublished\":\"2025-05-09T16:00:07+00:00\",\"breadcrumb\":{\"@id\":\"http:\/\/www.wunen.com\/index.php\/2025\/05\/10\/%e5%8a%a8%e6%80%81%e5%a3%81%e7%ba%b8%e6%8e%a2%e7%a9%b6\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/www.wunen.com\/index.php\/2025\/05\/10\/%e5%8a%a8%e6%80%81%e5%a3%81%e7%ba%b8%e6%8e%a2%e7%a9%b6\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"http:\/\/www.wunen.com\/index.php\/2025\/05\/10\/%e5%8a%a8%e6%80%81%e5%a3%81%e7%ba%b8%e6%8e%a2%e7%a9%b6\/#primaryimage\",\"url\":\"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/\u8d44\u8baf.jpg\",\"contentUrl\":\"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/\u8d44\u8baf.jpg\",\"width\":260,\"height\":180},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/www.wunen.com\/index.php\/2025\/05\/10\/%e5%8a%a8%e6%80%81%e5%a3%81%e7%ba%b8%e6%8e%a2%e7%a9%b6\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"http:\/\/www.wunen.com\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u52a8\u6001\u58c1\u7eb8\u63a2\u7a76\"}]},{\"@type\":\"WebSite\",\"@id\":\"http:\/\/www.wunen.com\/#website\",\"url\":\"http:\/\/www.wunen.com\/\",\"name\":\"\u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51\",\"description\":\"\u8f6f\u4ef6\u8d44\u8baf\u6765\u7269\u5ae9\",\"publisher\":{\"@id\":\"http:\/\/www.wunen.com\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\/\/www.wunen.com\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Organization\",\"@id\":\"http:\/\/www.wunen.com\/#organization\",\"name\":\"\u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51\",\"url\":\"http:\/\/www.wunen.com\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"http:\/\/www.wunen.com\/#\/schema\/logo\/image\/\",\"url\":\"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/cropped-\u7269\u5ae9-1.png\",\"contentUrl\":\"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/cropped-\u7269\u5ae9-1.png\",\"width\":1024,\"height\":1024,\"caption\":\"\u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51\"},\"image\":{\"@id\":\"http:\/\/www.wunen.com\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"http:\/\/www.wunen.com\/#\/schema\/person\/d5f7a6cf545656a9c90d507e64452db8\",\"name\":\"admin@wunen\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"http:\/\/www.wunen.com\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d90ec1e3faf77c4d4e66e40c29b85ff6401161e0502f401dae2f0e25b38ce25e?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d90ec1e3faf77c4d4e66e40c29b85ff6401161e0502f401dae2f0e25b38ce25e?s=96&d=mm&r=g\",\"caption\":\"admin@wunen\"},\"sameAs\":[\"http:\/\/www.wunen.com\"],\"url\":\"http:\/\/www.wunen.com\/index.php\/author\/adminwunen\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u52a8\u6001\u58c1\u7eb8\u63a2\u7a76 - \u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/www.wunen.com\/index.php\/2025\/05\/10\/\u52a8\u6001\u58c1\u7eb8\u63a2\u7a76\/","og_locale":"zh_CN","og_type":"article","og_title":"\u52a8\u6001\u58c1\u7eb8\u63a2\u7a76 - \u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51","og_description":"\u968f\u7740 \u4e09\u661f Oscar\u7684\u4e0a\u5e02\uff0c\u6d41\u7545\u7684\u64cd\u4f5c\uff0c\u534e\u4e3d\u7684\u754c\u9762\uff0c OPhone 2.0\u7684\u4e0d\u4fd7\u8868\u73b0\u4e0d\u7981\u8ba9\u4eba\u773c\u524d\u4e00\u4eae\u3002\u4f5c\u4e3aO [&hellip;]","og_url":"http:\/\/www.wunen.com\/index.php\/2025\/05\/10\/\u52a8\u6001\u58c1\u7eb8\u63a2\u7a76\/","og_site_name":"\u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51","article_published_time":"2025-05-09T16:00:07+00:00","og_image":[{"width":260,"height":180,"url":"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/\u8d44\u8baf.jpg","type":"image\/jpeg"}],"author":"admin@wunen","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"admin@wunen","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"15 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"http:\/\/www.wunen.com\/index.php\/2025\/05\/10\/%e5%8a%a8%e6%80%81%e5%a3%81%e7%ba%b8%e6%8e%a2%e7%a9%b6\/#article","isPartOf":{"@id":"http:\/\/www.wunen.com\/index.php\/2025\/05\/10\/%e5%8a%a8%e6%80%81%e5%a3%81%e7%ba%b8%e6%8e%a2%e7%a9%b6\/"},"author":{"name":"admin@wunen","@id":"http:\/\/www.wunen.com\/#\/schema\/person\/d5f7a6cf545656a9c90d507e64452db8"},"headline":"\u52a8\u6001\u58c1\u7eb8\u63a2\u7a76","datePublished":"2025-05-09T16:00:07+00:00","mainEntityOfPage":{"@id":"http:\/\/www.wunen.com\/index.php\/2025\/05\/10\/%e5%8a%a8%e6%80%81%e5%a3%81%e7%ba%b8%e6%8e%a2%e7%a9%b6\/"},"wordCount":2924,"commentCount":0,"publisher":{"@id":"http:\/\/www.wunen.com\/#organization"},"image":{"@id":"http:\/\/www.wunen.com\/index.php\/2025\/05\/10\/%e5%8a%a8%e6%80%81%e5%a3%81%e7%ba%b8%e6%8e%a2%e7%a9%b6\/#primaryimage"},"thumbnailUrl":"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/\u8d44\u8baf.jpg","articleSection":["\u52a8\u6001\u58c1\u7eb8"],"inLanguage":"zh-Hans","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["http:\/\/www.wunen.com\/index.php\/2025\/05\/10\/%e5%8a%a8%e6%80%81%e5%a3%81%e7%ba%b8%e6%8e%a2%e7%a9%b6\/#respond"]}]},{"@type":"WebPage","@id":"http:\/\/www.wunen.com\/index.php\/2025\/05\/10\/%e5%8a%a8%e6%80%81%e5%a3%81%e7%ba%b8%e6%8e%a2%e7%a9%b6\/","url":"http:\/\/www.wunen.com\/index.php\/2025\/05\/10\/%e5%8a%a8%e6%80%81%e5%a3%81%e7%ba%b8%e6%8e%a2%e7%a9%b6\/","name":"\u52a8\u6001\u58c1\u7eb8\u63a2\u7a76 - \u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51","isPartOf":{"@id":"http:\/\/www.wunen.com\/#website"},"primaryImageOfPage":{"@id":"http:\/\/www.wunen.com\/index.php\/2025\/05\/10\/%e5%8a%a8%e6%80%81%e5%a3%81%e7%ba%b8%e6%8e%a2%e7%a9%b6\/#primaryimage"},"image":{"@id":"http:\/\/www.wunen.com\/index.php\/2025\/05\/10\/%e5%8a%a8%e6%80%81%e5%a3%81%e7%ba%b8%e6%8e%a2%e7%a9%b6\/#primaryimage"},"thumbnailUrl":"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/\u8d44\u8baf.jpg","datePublished":"2025-05-09T16:00:07+00:00","breadcrumb":{"@id":"http:\/\/www.wunen.com\/index.php\/2025\/05\/10\/%e5%8a%a8%e6%80%81%e5%a3%81%e7%ba%b8%e6%8e%a2%e7%a9%b6\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["http:\/\/www.wunen.com\/index.php\/2025\/05\/10\/%e5%8a%a8%e6%80%81%e5%a3%81%e7%ba%b8%e6%8e%a2%e7%a9%b6\/"]}]},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"http:\/\/www.wunen.com\/index.php\/2025\/05\/10\/%e5%8a%a8%e6%80%81%e5%a3%81%e7%ba%b8%e6%8e%a2%e7%a9%b6\/#primaryimage","url":"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/\u8d44\u8baf.jpg","contentUrl":"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/\u8d44\u8baf.jpg","width":260,"height":180},{"@type":"BreadcrumbList","@id":"http:\/\/www.wunen.com\/index.php\/2025\/05\/10\/%e5%8a%a8%e6%80%81%e5%a3%81%e7%ba%b8%e6%8e%a2%e7%a9%b6\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"http:\/\/www.wunen.com\/"},{"@type":"ListItem","position":2,"name":"\u52a8\u6001\u58c1\u7eb8\u63a2\u7a76"}]},{"@type":"WebSite","@id":"http:\/\/www.wunen.com\/#website","url":"http:\/\/www.wunen.com\/","name":"\u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51","description":"\u8f6f\u4ef6\u8d44\u8baf\u6765\u7269\u5ae9","publisher":{"@id":"http:\/\/www.wunen.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/www.wunen.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"zh-Hans"},{"@type":"Organization","@id":"http:\/\/www.wunen.com\/#organization","name":"\u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51","url":"http:\/\/www.wunen.com\/","logo":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"http:\/\/www.wunen.com\/#\/schema\/logo\/image\/","url":"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/cropped-\u7269\u5ae9-1.png","contentUrl":"http:\/\/www.wunen.com\/wp-content\/uploads\/2025\/03\/cropped-\u7269\u5ae9-1.png","width":1024,"height":1024,"caption":"\u7269\u5ae9\u8f6f\u4ef6\u8d44\u8baf\u7f51"},"image":{"@id":"http:\/\/www.wunen.com\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"http:\/\/www.wunen.com\/#\/schema\/person\/d5f7a6cf545656a9c90d507e64452db8","name":"admin@wunen","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"http:\/\/www.wunen.com\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/d90ec1e3faf77c4d4e66e40c29b85ff6401161e0502f401dae2f0e25b38ce25e?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d90ec1e3faf77c4d4e66e40c29b85ff6401161e0502f401dae2f0e25b38ce25e?s=96&d=mm&r=g","caption":"admin@wunen"},"sameAs":["http:\/\/www.wunen.com"],"url":"http:\/\/www.wunen.com\/index.php\/author\/adminwunen\/"}]}},"_links":{"self":[{"href":"http:\/\/www.wunen.com\/index.php\/wp-json\/wp\/v2\/posts\/2030","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.wunen.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.wunen.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.wunen.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.wunen.com\/index.php\/wp-json\/wp\/v2\/comments?post=2030"}],"version-history":[{"count":0,"href":"http:\/\/www.wunen.com\/index.php\/wp-json\/wp\/v2\/posts\/2030\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"http:\/\/www.wunen.com\/index.php\/wp-json\/wp\/v2\/media\/215"}],"wp:attachment":[{"href":"http:\/\/www.wunen.com\/index.php\/wp-json\/wp\/v2\/media?parent=2030"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.wunen.com\/index.php\/wp-json\/wp\/v2\/categories?post=2030"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.wunen.com\/index.php\/wp-json\/wp\/v2\/tags?post=2030"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}