﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-咖啡伴侣-随笔分类-Android</title><link>http://www.blogjava.net/oathleo/category/43544.html</link><description>呆在上海</description><language>zh-cn</language><lastBuildDate>Thu, 21 Feb 2013 07:03:21 GMT</lastBuildDate><pubDate>Thu, 21 Feb 2013 07:03:21 GMT</pubDate><ttl>60</ttl><item><title>新android的rom的log功能无法使用</title><link>http://www.blogjava.net/oathleo/archive/2013/02/21/395519.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Thu, 21 Feb 2013 05:47:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2013/02/21/395519.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/395519.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2013/02/21/395519.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/395519.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/395519.html</trackback:ping><description><![CDATA[<div>解决刷新rom后log功能默认屏蔽问题：<br />Logger<br />C:\Users\Leo&gt;adb shell</div><div>shell@android:/ $ su</div><div>su</div><div>&nbsp;</div><div>1|shell@android:/ # mount -o remount, rw /system</div><div>mount -o remount, rw /system<br /></div><div>shell@android:/ # echo ANDROIDLOGGER &gt;&gt; /system/etc/tweaks.conf</div><div>echo ANDROIDLOGGER &gt;&gt; /system/etc/tweaks.conf<br /></div><div>shell@android:/ # mount -o remount, ro /system</div><div>mount -o remount, ro /system<br /></div><div>shell@android:/ #</div><div></div><div></div><img src ="http://www.blogjava.net/oathleo/aggbug/395519.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2013-02-21 13:47 <a href="http://www.blogjava.net/oathleo/archive/2013/02/21/395519.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>android手势效果-水果忍者 刀锋效果/光刀效果</title><link>http://www.blogjava.net/oathleo/archive/2011/09/23/android_Fruit_Ninja.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Fri, 23 Sep 2011 03:29:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2011/09/23/android_Fruit_Ninja.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/359336.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2011/09/23/android_Fruit_Ninja.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/359336.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/359336.html</trackback:ping><description><![CDATA[<div><a title="http://www.blogjava.net/oathleo/archive/2011/09/23/android_Fruit_Ninja.html" href="http://www.blogjava.net/oathleo/archive/2011/09/23/android_Fruit_Ninja.html">请保留：<br />
<div>http://www.blogjava.net/oathleo/archive/2011/09/23/android_Fruit_Ninja.html</div>
</a>
<div></div>
<br />
<br />
android手势加上了，比如左右滑动<br />
但是用户经常不能感受到是否滑动了，
<div>水果忍者刀锋效果/光刀效果就相当不错<br />
<br />
网上搜了下，大多是ios的实现，想想原理可能不是很复杂，就实现了个最简单的。<br />
原理<br />
1.在背景view上再加一层view专门负责draw刀锋<br />
2.刀锋就是随着手势move，动态画shape<br />
3.接受到事件得dispatchTouchEvent，否则下面的组件无法获得事件了<br />
4.下面的组件事件等无需更改，互不耦合<br />
5.一个类实现，不涉及其他第三方<br />
6.只实现了一个最简单的形状，水果忍者里面实现了很多复杂形状，可以在这个基础上进行扩展<br />
</div>
效果如图<br />
<img src="http://www.blogjava.net/images/blogjava_net/oathleo/world.png" alt="" border="0" /></div>
<img src="http://www.blogjava.net/images/blogjava_net/oathleo/17.png" alt="" border="0" width="736" height="370" /><br />
<br />
<br />
代码：<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;android.content.Context;<br />
</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;android.graphics.Canvas;<br />
</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;android.graphics.Color;<br />
</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;android.graphics.Paint;<br />
</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;android.graphics.Path;<br />
</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;android.view.MotionEvent;<br />
</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;android.view.View;<br />
<br />
<br />
<br />
</span><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />
&nbsp;*&nbsp;<br />
&nbsp;*&nbsp;模仿水果忍者刀锋效果<br />
&nbsp;*&nbsp;</span><span style="color: #808080; ">@author</span><span style="color: #008000; ">&nbsp;leooath@gmail.com<br />
&nbsp;*<br />
&nbsp;</span><span style="color: #008000; ">*/</span><span style="color: #000000; "><br />
</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;GestureView&nbsp;</span><span style="color: #0000FF; ">extends</span><span style="color: #000000; ">&nbsp;View&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;Paint&nbsp;paint;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&nbsp;startX&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Float.NaN;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&nbsp;startY&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Float.NaN;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&nbsp;endX&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Float.NaN;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&nbsp;endY&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Float.NaN;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">下层view</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;View&nbsp;viewer;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;gestureColor&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Color.rgb(</span><span style="color: #000000; ">153</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">153</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">153</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;alpha&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">220</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;alpha_full&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">255</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">刀锋长度</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;shape_length&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">40</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">刀锋截短时间</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;shape_cut_time&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">150</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;GestureView(Context&nbsp;context,&nbsp;View&nbsp;viewer)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">super</span><span style="color: #000000; ">(context);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">.viewer&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;viewer;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paint&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Paint();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paint.setStyle(Paint.Style.FILL);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;draw(Canvas&nbsp;canvas)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">super</span><span style="color: #000000; ">.draw(canvas);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #000000; ">!</span><span style="color: #000000; ">Float.isNaN(startX)&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">!</span><span style="color: #000000; ">Float.isNaN(endY))&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&nbsp;gap&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;ViewUtils.getGap(startX,&nbsp;startY,&nbsp;endX,&nbsp;endY);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&nbsp;w&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;gap&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">10</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">背景shape外侧点高度</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&nbsp;h&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;w&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">7</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">?</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">7</span><span style="color: #000000; ">&nbsp;:&nbsp;w;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">填充shape外侧点高度</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&nbsp;h2&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;h&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">3</span><span style="color: #000000; ">;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">double</span><span style="color: #000000; ">&nbsp;length&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Math.pow(Math.pow(w,&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;Math.pow((h),&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">),&nbsp;</span><span style="color: #000000; ">0.5</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">double</span><span style="color: #000000; ">&nbsp;length2&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Math.pow(Math.pow(w,&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">)&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;Math.pow((h2),&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">),&nbsp;</span><span style="color: #000000; ">0.5</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">double</span><span style="color: #000000; ">&nbsp;ang1_1&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Math.atan((endY&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;startY)&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;(endX&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;startX));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">double</span><span style="color: #000000; ">&nbsp;ang1_2&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Math.atan(h&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;w);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">double</span><span style="color: #000000; ">&nbsp;angle1_1&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;ang1_1&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;ang1_2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">double</span><span style="color: #000000; ">&nbsp;angle1_2&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;ang1_1&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;ang1_2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">double</span><span style="color: #000000; ">&nbsp;ang2_2&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Math.atan(h2&nbsp;</span><span style="color: #000000; ">/</span><span style="color: #000000; ">&nbsp;w);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">double</span><span style="color: #000000; ">&nbsp;angle2_1&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;ang1_1&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;ang2_2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">double</span><span style="color: #000000; ">&nbsp;angle2_2&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;ang1_1&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;ang2_2;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(endX&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;startX)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&nbsp;xx1&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;endX&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">)&nbsp;(length&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;Math.cos(angle1_1));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&nbsp;yy1&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;endY&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">)&nbsp;(length&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;Math.sin(angle1_1));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&nbsp;xx2&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;endX&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">)&nbsp;(length&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;Math.cos(angle1_2));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&nbsp;yy2&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;endY&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">)&nbsp;(length&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;Math.sin(angle1_2));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&nbsp;xx12&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;endX&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">)&nbsp;(length2&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;Math.cos(angle2_1));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&nbsp;yy12&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;endY&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">)&nbsp;(length2&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;Math.sin(angle2_1));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&nbsp;xx22&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;endX&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">)&nbsp;(length2&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;Math.cos(angle2_2));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&nbsp;yy22&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;endY&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">)&nbsp;(length2&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;Math.sin(angle2_2));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Path&nbsp;backPath&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Path();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;backPath.moveTo(startX,&nbsp;startY);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;backPath.lineTo(xx1,&nbsp;yy1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;backPath.lineTo(endX,&nbsp;endY);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;backPath.lineTo(xx2,&nbsp;yy2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;backPath.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Path&nbsp;fillPath&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Path();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fillPath.moveTo(startX,&nbsp;startY);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fillPath.lineTo(xx12,&nbsp;yy12);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fillPath.lineTo(endX,&nbsp;endY);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fillPath.lineTo(xx22,&nbsp;yy22);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fillPath.close();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paint.setColor(gestureColor);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paint.setAlpha(alpha);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;canvas.drawPath(backPath,&nbsp;paint);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paint.setColor(Color.WHITE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paint.setAlpha(alpha_full);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;canvas.drawPath(fillPath,&nbsp;paint);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&nbsp;xx1&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;endX&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">)&nbsp;(length&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;Math.cos(angle1_1));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&nbsp;yy1&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;endY&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">)&nbsp;(length&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;Math.sin(angle1_1));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&nbsp;xx2&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;endX&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">)&nbsp;(length&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;Math.cos(angle1_2));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&nbsp;yy2&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;endY&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">)&nbsp;(length&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;Math.sin(angle1_2));<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&nbsp;xx12&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;endX&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">)&nbsp;(length2&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;Math.cos(angle2_1));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&nbsp;yy12&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;endY&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">)&nbsp;(length2&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;Math.sin(angle2_1));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&nbsp;xx22&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;endX&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">)&nbsp;(length2&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;Math.cos(angle2_2));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&nbsp;yy22&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;endY&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">)&nbsp;(length2&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;Math.sin(angle2_2));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Path&nbsp;backPath&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Path();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;backPath.moveTo(startX,&nbsp;startY);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;backPath.lineTo(xx1,&nbsp;yy1);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;backPath.lineTo(endX,&nbsp;endY);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;backPath.lineTo(xx2,&nbsp;yy2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;backPath.close();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Path&nbsp;fillPath&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Path();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fillPath.moveTo(startX,&nbsp;startY);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fillPath.lineTo(xx12,&nbsp;yy12);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fillPath.lineTo(endX,&nbsp;endY);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fillPath.lineTo(xx22,&nbsp;yy22);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fillPath.close();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paint.setColor(gestureColor);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paint.setAlpha(alpha);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;canvas.drawPath(backPath,&nbsp;paint);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paint.setColor(Color.WHITE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paint.setAlpha(alpha_full);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;canvas.drawPath(fillPath,&nbsp;paint);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">boolean</span><span style="color: #000000; ">&nbsp;onTouchEvent(android.view.MotionEvent&nbsp;event)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(event.getPointerCount()&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;action&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;event.getAction();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(MotionEvent.ACTION_DOWN&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;action)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;startX&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;event.getX();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;startY&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;event.getY();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(MotionEvent.ACTION_MOVE&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;action)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endX&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;event.getX();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endY&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;event.getY();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">刀锋截短时间，则截短至一半</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;((event.getEventTime()&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;event.getDownTime())&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;shape_cut_time)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">(Math.abs(endX&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;startX)&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;shape_length&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;Math.abs(endY&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;startY)&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;shape_length){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;startX&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">)&nbsp;(startX&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;(endX&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;startX)&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0.5</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;startY&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">)&nbsp;(startY&nbsp;</span><span style="color: #000000; ">+</span><span style="color: #000000; ">&nbsp;(endY&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;startY)&nbsp;</span><span style="color: #000000; ">*</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0.5</span><span style="color: #000000; ">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;invalidate();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(MotionEvent.ACTION_UP&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;action)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;startX&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Float.NaN;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;startY&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Float.NaN;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endX&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Float.NaN;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;endY&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;Float.NaN;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;invalidate();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">该view消费了event，所以下层的view必须dispatchTouchEvent才能获得事件</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MotionEvent&nbsp;newEvent&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;MotionEvent.obtain(event);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;viewer.dispatchTouchEvent(newEvent);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}<br />
</span></div>
<img src ="http://www.blogjava.net/oathleo/aggbug/359336.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2011-09-23 11:29 <a href="http://www.blogjava.net/oathleo/archive/2011/09/23/android_Fruit_Ninja.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android 事件返回值</title><link>http://www.blogjava.net/oathleo/archive/2011/09/19/359000.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Mon, 19 Sep 2011 08:31:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2011/09/19/359000.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/359000.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2011/09/19/359000.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/359000.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/359000.html</trackback:ping><description><![CDATA[对于View来说，事件的返回值是关注的，down时返回true，才能接受up的事件<br /><div>对于SurfaceView，事件返回值貌似没有什么作用<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setOnTouchListener(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;OnTouchListener()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">boolean</span><span style="color: #000000; ">&nbsp;onTouch(View&nbsp;v,&nbsp;MotionEvent&nbsp;event)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">touch</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});</span></div><br />有兴趣的朋友可以试试上面的代码</div><img src ="http://www.blogjava.net/oathleo/aggbug/359000.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2011-09-19 16:31 <a href="http://www.blogjava.net/oathleo/archive/2011/09/19/359000.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>activity  launchmode</title><link>http://www.blogjava.net/oathleo/archive/2011/09/02/357809.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Fri, 02 Sep 2011 05:11:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2011/09/02/357809.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/357809.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2011/09/02/357809.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/357809.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/357809.html</trackback:ping><description><![CDATA[<div><div>&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp; &lt;activity android:name=".LoginActivity" android:label="@string/app_name" android:launchMode="singleTask"&gt;</div><br />launchmode4种模式：<br /> 1，standard：<br /> 如果从A跳到A，intent5次，task里5个activity；<br /> 2，single Top:<br /> 如果从A 跳B,再从B跳A，如果此时栈顶为A，则不创建新实例，直接把Intent给A，但如果栈顶不是A，则还要创建A的实例<br /> 3，singleTask<br /> 如果从A跳B，再从B跳A，无论是否栈顶栈底，只要A在，则将Intent给A，不会创建A的新实例；<br /> 4，singleInstance<br /> 不同于前3种模式，前3种只是在同一个task的，而实例化的策略不同。这种模式下的activity会单独存在一个task下。<br /> 现成的例子是google地图。比如我有一个应用是导游方面的，其中调用的google地图Activity。那么现在我比如按home（后台 activity  onstop，back是finish）键，然后到应用列表中打开google地图，你会发现显示的就是刚才的地图，实际上是同一个Activity。<br /> 如果使用上面三种模式，是无法实现这个需求的。google地图应用中有多个上下文Activity，比如路线查询等的，导游应用也有一些上下文Activity。在各自应用中回退要回退到各自的上下文Activity中。<br /> 总结：<br /> 1 2：会创建新实例<br /> 3 4：不会创建新实例<br /> 123：activity的taskid相同<br /> 4：activity的taskid不同。被分到单独一个task中</div><img src ="http://www.blogjava.net/oathleo/aggbug/357809.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2011-09-02 13:11 <a href="http://www.blogjava.net/oathleo/archive/2011/09/02/357809.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>PopupWindow自适应大小</title><link>http://www.blogjava.net/oathleo/archive/2011/09/02/357805.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Fri, 02 Sep 2011 03:23:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2011/09/02/357805.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/357805.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2011/09/02/357805.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/357805.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/357805.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">&nbsp;&nbsp;&nbsp; popupWindow</span>.setWidth(LayoutParams.WRAP_CONTENT);<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; popupWindow.setHeight(LayoutParams.WRAP_CONTENT);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
</span></div>
&nbsp;&nbsp;&nbsp;&nbsp;
<br />
<br />
view自适应<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LinearLayout.LayoutParams&nbsp;params&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,&nbsp;LinearLayout.LayoutParams.WRAP_CONTENT);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LinearLayout&nbsp;linearLayout&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000;">&nbsp;LinearLayout(c);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;linearLayout.setLayoutParams(params);</span></div>
<br /><br />使用：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp;&nbsp;mPop.showAtLocation((View)&nbsp;v.getParent(),&nbsp;Gravity.TOP&nbsp;</span><span style="color: #000000; ">|</span><span style="color: #000000; ">&nbsp;Gravity.LEFT,&nbsp;</span><span style="color: #000000; ">252</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">50</span><span style="color: #000000; ">);<br /><br />以上面一句为例：第一个参数是指PopupWindow显示在哪一个View之上．后面三个参数控制PopupWindow显示的位置，此处表明PopupWindow显示在距左上角x252个像素，y50个像素．</span></div><img src ="http://www.blogjava.net/oathleo/aggbug/357805.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2011-09-02 11:23 <a href="http://www.blogjava.net/oathleo/archive/2011/09/02/357805.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android自适应屏幕方向、大小和分辨率 转</title><link>http://www.blogjava.net/oathleo/archive/2011/09/02/357792.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Fri, 02 Sep 2011 01:28:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2011/09/02/357792.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/357792.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2011/09/02/357792.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/357792.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/357792.html</trackback:ping><description><![CDATA[<div><p>屏幕大小<br />1、不同的layout</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Android手机屏幕大小不一，有480x320，640x360，800x480.怎样才能让App自动适应不同的屏幕呢？  其实很简单，只需要在res目录下创建不同的layout文件夹，比如：layout-640x360，layout-800x480，所有的 layout文件在编译之后都会写入R.java里，而系统会根据屏幕的大小自己选择合适的layout进行使用。</p> <p>2、hdpi、mdpi、ldpi</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 前的版本中，只有一个drawable，而2.1版本中有drawable-mdpi、drawable-ldpi、drawable-hdpi三个，这三个主要是为了支持多分辨率。</p> <p>drawable- hdpi、drawable- mdpi、drawable-ldpi的区别：</p> <p>1.drawable-hdpi里面存放高分辨率的图片，如WVGA (480x800),FWVGA (480x854)<br />2.drawable-mdpi里面存放中等分辨率的图片，如HVGA (320x480)<br />3.drawable-ldpi里面存放低分辨率的图片，如QVGA (240x320)<br />系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的图片。在开发程序时为了兼容不同平台不同屏幕，建议各自文件夹根据需求均存放不同版本图片。</p> <p>屏幕方向<br />1、横屏竖屏自动切换</p> <p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以在res目录下建立layout-port和layout-land两个目录，里面分别放置竖屏和横屏两种布局文件，这样在手机屏幕方向变化的时候系统会自动调用相应的布局文件，避免一种布局文件无法满足两种屏幕显示的问题。</p> <p>2、禁用自动切换</p> <p>只需要在AndroidManifest.xml文件中加入android:screenOrientation属性限制。</p> <p>&#8226;Android:screenOrientation="landscape"&nbsp; //是限制此页面横屏显示<br />&#8226;Android:screenOrientation="portrait"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //是限制此页面数竖屏显示<br />字体自适应大小<br />方法1：</p> <p>首先根据不同分辨率获取不同字体大小。 <br />在RES里创建<br />values-480x320/strings.xml 里面设置&lt;dimen name="Text_size"&gt;30px&lt;/dimen&gt;<br />和 <br />values-800x400/strings.xml 里面设置&lt;dimen name="Text_size"&gt;30px&lt;/dimen&gt;</p> <p>分别代表480X320 和 800X400分辨率情况下 字号为30px和40px;</p> <p>在java文件中这样调用</p> <p>int sizeOfText = (int) this.getResources().getDimension(R.dimen.Text_size);</p> <p>方法2：</p> <p>在视图的 onsizechanged里获取视图宽度，一般情况下默认宽度是320，所以计算一个缩放比率rate = (float) w/320&nbsp;&nbsp; w是实际宽度<br />然后在设置字体尺寸时 paint.setTextSize((int)(8*rate));&nbsp;&nbsp; 8是在分辨率宽为320 下需要设置的字体大小实际字体大小 = 默认字体大小 x&nbsp; rate</p></div><img src ="http://www.blogjava.net/oathleo/aggbug/357792.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2011-09-02 09:28 <a href="http://www.blogjava.net/oathleo/archive/2011/09/02/357792.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android WebView Java和Javascript互调的例子   转</title><link>http://www.blogjava.net/oathleo/archive/2011/08/25/357274.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Thu, 25 Aug 2011 07:36:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2011/08/25/357274.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/357274.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2011/08/25/357274.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/357274.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/357274.html</trackback:ping><description><![CDATA[<div>WebView对Javascript的支持也很强，google一个<a style="color: #006699; text-decoration: underline" href="http://code.google.com/p/apps-for-android/source/browse/#svn/trunk/Samples/WebViewDemo%3Fstate%3Dclosed" target="_blank">Java和Javascript互调的例子</a>&nbsp;&nbsp;<br />整个Eclipse ADT工程例子中都有，这里重点分析一下代码：<div style="padding-bottom: 1px; overflow-x: auto; overflow-y: auto; background-color: transparent; padding-left: 1px; width: 766px; padding-right: 1px; font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; word-wrap: break-word; margin-left: 9px; font-size: 12px; word-break: break-all; padding-top: 1px"><div><div style="text-align: left; padding-bottom: 3px; margin: 0px; padding-left: 3px; padding-right: 3px; color: black; font-weight: bold; padding-top: 3px">Java代码&nbsp;&nbsp;<a style="color: #006699; text-decoration: underline" title="收藏这段代码" href="http://www.iteye.com/topic/376674"><img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" alt="收藏代码" src="http://www.iteye.com/images/icon_star.png" /></a></div></div><ol style="border-bottom: #d1d7dc 1px solid; border-left: #d1d7dc 1px solid; padding-bottom: 2px; line-height: 1.4em; background-color: #ffffff; list-style-type: decimal; margin: 0px 0px 1px; padding-left: 0px; padding-right: 0px; color: #2b91af; font-size: 1em; border-top: #d1d7dc 1px solid; border-right: #d1d7dc 1px solid; padding-top: 2px"><li style="border-left: #d1d7dc 1px solid; padding-bottom: 0px; line-height: 18px; background-color: #fafafa; margin: 0px 0px 0px 38px; padding-left: 10px; padding-right: 0px; font-size: 1em; padding-top: 0px"><span style="color:black;"><span style="color:#7f055;font-weight: bold">public</span>&nbsp;<span style="color:#7f055;font-weight: bold">class</span><span style="color:black;">&nbsp;WebViewDemo&nbsp;</span><span style="color:#7f055;font-weight: bold">extends</span><span style="color:black;">&nbsp;Activity&nbsp;{&nbsp;&nbsp;</span></span></li><li style="border-left: #d1d7dc 1px solid; padding-bottom: 0px; line-height: 18px; background-color: #fafafa; margin: 0px 0px 0px 38px; padding-left: 10px; padding-right: 0px; font-size: 1em; padding-top: 0px"><span style="color:black;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#7f055;font-weight: bold">private</span><span style="color:black;">&nbsp;WebView&nbsp;mWebView;&nbsp;&nbsp;</span></span></li><li style="border-left: #d1d7dc 1px solid; padding-bottom: 0px; line-height: 18px; background-color: #fafafa; margin: 0px 0px 0px 38px; padding-left: 10px; padding-right: 0px; font-size: 1em; padding-top: 0px"><span style="color:black;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#7f055;font-weight: bold">private</span><span style="color:black;">&nbsp;Handler&nbsp;mHandler&nbsp;=&nbsp;</span><span style="color:#7f055;font-weight: bold">new</span><span style="color:black;">&nbsp;Handler();&nbsp;&nbsp;</span></span></li><li style="border-left: #d1d7dc 1px solid; padding-bottom: 0px; line-height: 18px; background-color: #fafafa; margin: 0px 0px 0px 38px; padding-left: 10px; padding-right: 0px; font-size: 1em; padding-top: 0px"><span style="color:black;">&nbsp;&nbsp;</span></li><li style="border-left: #d1d7dc 1px solid; padding-bottom: 0px; line-height: 18px; background-color: #fafafa; margin: 0px 0px 0px 38px; padding-left: 10px; padding-right: 0px; font-size: 1em; padding-top: 0px"><span style="color:black;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#7f055;font-weight: bold">public</span>&nbsp;<span style="color:#7f055;font-weight: bold">void</span><span style="color:black;">&nbsp;onCreate(Bundle&nbsp;icicle)&nbsp;{&nbsp;&nbsp;</span></span></li><li style="border-left: #d1d7dc 1px solid; padding-bottom: 0px; line-height: 18px; background-color: #fafafa; margin: 0px 0px 0px 38px; padding-left: 10px; padding-right: 0px; font-size: 1em; padding-top: 0px"><span style="color:black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#7f055;font-weight: bold">super</span><span style="color:black;">.onCreate(icicle);&nbsp;&nbsp;</span></span></li><li style="border-left: #d1d7dc 1px solid; padding-bottom: 0px; line-height: 18px; background-color: #fafafa; margin: 0px 0px 0px 38px; padding-left: 10px; padding-right: 0px; font-size: 1em; padding-top: 0px"><span style="color:black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setContentView(R.layout.webviewdemo);&nbsp;&nbsp;</span></li><li style="border-left: #d1d7dc 1px solid; padding-bottom: 0px; line-height: 18px; background-color: #fafafa; margin: 0px 0px 0px 38px; padding-left: 10px; padding-right: 0px; font-size: 1em; padding-top: 0px"><span style="color:black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mWebView&nbsp;=&nbsp;(WebView)&nbsp;findViewById(R.id.webview);&nbsp;&nbsp;</span></li><li style="border-left: #d1d7dc 1px solid; padding-bottom: 0px; line-height: 18px; background-color: #fafafa; margin: 0px 0px 0px 38px; padding-left: 10px; padding-right: 0px; font-size: 1em; padding-top: 0px"><span style="color:black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WebSettings&nbsp;webSettings&nbsp;=&nbsp;mWebView.getSettings();&nbsp;&nbsp;</span></li><li style="border-left: #d1d7dc 1px solid; padding-bottom: 0px; line-height: 18px; background-color: #fafafa; margin: 0px 0px 0px 38px; padding-left: 10px; padding-right: 0px; font-size: 1em; padding-top: 0px"><span style="color:black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;webSettings.setJavaScriptEnabled(<span style="color:#7f055;font-weight: bold">true</span><span style="color:black;">);&nbsp;&nbsp;</span></span></li><li style="border-left: #d1d7dc 1px solid; padding-bottom: 0px; line-height: 18px; background-color: #fafafa; margin: 0px 0px 0px 38px; padding-left: 10px; padding-right: 0px; font-size: 1em; padding-top: 0px"><span style="color:black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mWebView.addJavascriptInterface(<span style="color:#7f055;font-weight: bold">new</span><span style="color:black;">&nbsp;Object()&nbsp;{&nbsp;&nbsp;</span></span></li><li style="border-left: #d1d7dc 1px solid; padding-bottom: 0px; line-height: 18px; background-color: #fafafa; margin: 0px 0px 0px 38px; padding-left: 10px; padding-right: 0px; font-size: 1em; padding-top: 0px"><span style="color:black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#7f055;font-weight: bold">public</span>&nbsp;<span style="color:#7f055;font-weight: bold">void</span><span style="color:black;">&nbsp;clickOnAndroid()&nbsp;{&nbsp;&nbsp;</span></span></li><li style="border-left: #d1d7dc 1px solid; padding-bottom: 0px; line-height: 18px; background-color: #fafafa; margin: 0px 0px 0px 38px; padding-left: 10px; padding-right: 0px; font-size: 1em; padding-top: 0px"><span style="color:black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mHandler.post(<span style="color:#7f055;font-weight: bold">new</span><span style="color:black;">&nbsp;Runnable()&nbsp;{&nbsp;&nbsp;</span></span></li><li style="border-left: #d1d7dc 1px solid; padding-bottom: 0px; line-height: 18px; background-color: #fafafa; margin: 0px 0px 0px 38px; padding-left: 10px; padding-right: 0px; font-size: 1em; padding-top: 0px"><span style="color:black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#7f055;font-weight: bold">public</span>&nbsp;<span style="color:#7f055;font-weight: bold">void</span><span style="color:black;">&nbsp;run()&nbsp;{&nbsp;&nbsp;</span></span></li><li style="border-left: #d1d7dc 1px solid; padding-bottom: 0px; line-height: 18px; background-color: #fafafa; margin: 0px 0px 0px 38px; padding-left: 10px; padding-right: 0px; font-size: 1em; padding-top: 0px"><span style="color:black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mWebView.loadUrl(<span style="color:blue;">"javascript:wave()"</span><span style="color:black;">);&nbsp;&nbsp;</span></span></li><li style="border-left: #d1d7dc 1px solid; padding-bottom: 0px; line-height: 18px; background-color: #fafafa; margin: 0px 0px 0px 38px; padding-left: 10px; padding-right: 0px; font-size: 1em; padding-top: 0px"><span style="color:black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li style="border-left: #d1d7dc 1px solid; padding-bottom: 0px; line-height: 18px; background-color: #fafafa; margin: 0px 0px 0px 38px; padding-left: 10px; padding-right: 0px; font-size: 1em; padding-top: 0px"><span style="color:black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});&nbsp;&nbsp;</span></li><li style="border-left: #d1d7dc 1px solid; padding-bottom: 0px; line-height: 18px; background-color: #fafafa; margin: 0px 0px 0px 38px; padding-left: 10px; padding-right: 0px; font-size: 1em; padding-top: 0px"><span style="color:black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li style="border-left: #d1d7dc 1px solid; padding-bottom: 0px; line-height: 18px; background-color: #fafafa; margin: 0px 0px 0px 38px; padding-left: 10px; padding-right: 0px; font-size: 1em; padding-top: 0px"><span style="color:black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;},&nbsp;<span style="color:blue;">"demo"</span><span style="color:black;">);&nbsp;&nbsp;</span></span></li><li style="border-left: #d1d7dc 1px solid; padding-bottom: 0px; line-height: 18px; background-color: #fafafa; margin: 0px 0px 0px 38px; padding-left: 10px; padding-right: 0px; font-size: 1em; padding-top: 0px"><span style="color:black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mWebView.loadUrl(<span style="color:blue;">"file:///android_asset/demo.html"</span><span style="color:black;">);&nbsp;&nbsp;</span></span></li><li style="border-left: #d1d7dc 1px solid; padding-bottom: 0px; line-height: 18px; background-color: #fafafa; margin: 0px 0px 0px 38px; padding-left: 10px; padding-right: 0px; font-size: 1em; padding-top: 0px"><span style="color:black;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li style="border-left: #d1d7dc 1px solid; padding-bottom: 0px; line-height: 18px; background-color: #fafafa; margin: 0px 0px 0px 38px; padding-left: 10px; padding-right: 0px; font-size: 1em; padding-top: 0px"><span style="color:black;">}&nbsp;&nbsp;</span></li></ol></div><p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">这 里的重点是addJavascriptInterface(Object obj,String  interfaceName)方法，该方法将一个java对象绑定到一个javascript对象中，javascript对象名就是 interfaceName，作用域是Global。这样初始化webview后，在webview加载的页面中就可以直接通过 javascript:window.demo访问到绑定的java对象了。来看看在html中是怎样调用的：</p><div style="padding-bottom: 1px; overflow-x: auto; overflow-y: auto; background-color: transparent; padding-left: 1px; width: 766px; padding-right: 1px; font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; word-wrap: break-word; margin-left: 9px; font-size: 12px; word-break: break-all; padding-top: 1px"><div><div style="text-align: left; padding-bottom: 3px; margin: 0px; padding-left: 3px; padding-right: 3px; color: black; font-weight: bold; padding-top: 3px">Html代码&nbsp;&nbsp;<a style="color: #006699; text-decoration: underline" title="收藏这段代码" href="http://www.iteye.com/topic/376674"><img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" alt="收藏代码" src="http://www.iteye.com/images/icon_star.png" /></a></div></div><ol style="border-bottom: #d1d7dc 1px solid; border-left: #d1d7dc 1px solid; padding-bottom: 2px; line-height: 1.4em; background-color: #ffffff; list-style-type: decimal; margin: 0px 0px 1px; padding-left: 0px; padding-right: 0px; color: #2b91af; font-size: 1em; border-top: #d1d7dc 1px solid; border-right: #d1d7dc 1px solid; padding-top: 2px"><li style="border-left: #d1d7dc 1px solid; padding-bottom: 0px; line-height: 18px; background-color: #fafafa; margin: 0px 0px 0px 38px; padding-left: 10px; padding-right: 0px; font-size: 1em; padding-top: 0px"><span style="color:black;"><span style="color:#06699;font-weight: bold">&lt;</span><span style="color:#06699;font-weight: bold">html</span><span style="color:#06699;font-weight: bold">&gt;</span><span style="color:black;">&nbsp;&nbsp;</span></span></li><li style="border-left: #d1d7dc 1px solid; padding-bottom: 0px; line-height: 18px; background-color: #fafafa; margin: 0px 0px 0px 38px; padding-left: 10px; padding-right: 0px; font-size: 1em; padding-top: 0px"><span style="color:black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#06699;font-weight: bold">&lt;</span><span style="color:#06699;font-weight: bold">script</span>&nbsp;<span style="color:red;">language</span><span style="color:black;">=</span><span style="color:blue;">"javascript"</span><span style="color:#06699;font-weight: bold">&gt;</span><span style="color:black;">&nbsp;&nbsp;</span></span></li><li style="border-left: #d1d7dc 1px solid; padding-bottom: 0px; line-height: 18px; background-color: #fafafa; margin: 0px 0px 0px 38px; padding-left: 10px; padding-right: 0px; font-size: 1em; padding-top: 0px"><span style="color:black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;wave()&nbsp;{&nbsp;&nbsp;</span></li><li style="border-left: #d1d7dc 1px solid; padding-bottom: 0px; line-height: 18px; background-color: #fafafa; margin: 0px 0px 0px 38px; padding-left: 10px; padding-right: 0px; font-size: 1em; padding-top: 0px"><span style="color:black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;document.getElementById("droid")<span style="color:red;">.src</span><span style="color:black;">=</span><span style="color:blue;">"android_waving.png"</span><span style="color:black;">;&nbsp;&nbsp;</span></span></li><li style="border-left: #d1d7dc 1px solid; padding-bottom: 0px; line-height: 18px; background-color: #fafafa; margin: 0px 0px 0px 38px; padding-left: 10px; padding-right: 0px; font-size: 1em; padding-top: 0px"><span style="color:black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li style="border-left: #d1d7dc 1px solid; padding-bottom: 0px; line-height: 18px; background-color: #fafafa; margin: 0px 0px 0px 38px; padding-left: 10px; padding-right: 0px; font-size: 1em; padding-top: 0px"><span style="color:black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#06699;font-weight: bold">&lt;/</span><span style="color:#06699;font-weight: bold">script</span><span style="color:#06699;font-weight: bold">&gt;</span><span style="color:black;">&nbsp;&nbsp;</span></span></li><li style="border-left: #d1d7dc 1px solid; padding-bottom: 0px; line-height: 18px; background-color: #fafafa; margin: 0px 0px 0px 38px; padding-left: 10px; padding-right: 0px; font-size: 1em; padding-top: 0px"><span style="color:black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#06699;font-weight: bold">&lt;</span><span style="color:#06699;font-weight: bold">body</span><span style="color:#06699;font-weight: bold">&gt;</span><span style="color:black;">&nbsp;&nbsp;</span></span></li><li style="border-left: #d1d7dc 1px solid; padding-bottom: 0px; line-height: 18px; background-color: #fafafa; margin: 0px 0px 0px 38px; padding-left: 10px; padding-right: 0px; font-size: 1em; padding-top: 0px"><span style="color:black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#06699;font-weight: bold">&lt;</span><span style="color:#06699;font-weight: bold">a</span>&nbsp;<span style="color:red;">onClick</span><span style="color:black;">=</span><span style="color:blue;">"window.demo.clickOnAndroid()"</span><span style="color:#06699;font-weight: bold">&gt;</span><span style="color:black;">&nbsp;&nbsp;</span></span></li><li style="border-left: #d1d7dc 1px solid; padding-bottom: 0px; line-height: 18px; background-color: #fafafa; margin: 0px 0px 0px 38px; padding-left: 10px; padding-right: 0px; font-size: 1em; padding-top: 0px"><span style="color:black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#06699;font-weight: bold">&lt;</span><span style="color:#06699;font-weight: bold">img</span>&nbsp;<span style="color:red;">id</span><span style="color:black;">=</span><span style="color:blue;">"droid"</span>&nbsp;<span style="color:red;">src</span><span style="color:black;">=</span><span style="color:blue;">"android_normal.png"</span><span style="color:#06699;font-weight: bold">/&gt;</span><span style="color:#06699;font-weight: bold">&lt;</span><span style="color:#06699;font-weight: bold">br</span><span style="color:#06699;font-weight: bold">&gt;</span><span style="color:black;">&nbsp;&nbsp;</span></span></li><li style="border-left: #d1d7dc 1px solid; padding-bottom: 0px; line-height: 18px; background-color: #fafafa; margin: 0px 0px 0px 38px; padding-left: 10px; padding-right: 0px; font-size: 1em; padding-top: 0px"><span style="color:black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Click&nbsp;me!&nbsp;&nbsp;</span></li><li style="border-left: #d1d7dc 1px solid; padding-bottom: 0px; line-height: 18px; background-color: #fafafa; margin: 0px 0px 0px 38px; padding-left: 10px; padding-right: 0px; font-size: 1em; padding-top: 0px"><span style="color:black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#06699;font-weight: bold">&lt;/</span><span style="color:#06699;font-weight: bold">a</span><span style="color:#06699;font-weight: bold">&gt;</span><span style="color:black;">&nbsp;&nbsp;</span></span></li><li style="border-left: #d1d7dc 1px solid; padding-bottom: 0px; line-height: 18px; background-color: #fafafa; margin: 0px 0px 0px 38px; padding-left: 10px; padding-right: 0px; font-size: 1em; padding-top: 0px"><span style="color:black;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color:#06699;font-weight: bold">&lt;/</span><span style="color:#06699;font-weight: bold">body</span><span style="color:#06699;font-weight: bold">&gt;</span><span style="color:black;">&nbsp;&nbsp;</span></span></li><li style="border-left: #d1d7dc 1px solid; padding-bottom: 0px; line-height: 18px; background-color: #fafafa; margin: 0px 0px 0px 38px; padding-left: 10px; padding-right: 0px; font-size: 1em; padding-top: 0px"><span style="color:black;"><span style="color:#06699;font-weight: bold">&lt;/</span><span style="color:#06699;font-weight: bold">html</span><span style="color:#06699;font-weight: bold">&gt;</span><span style="color:black;">&nbsp;&nbsp;</span></span></li></ol></div><p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">&nbsp;这样在javascript中就可以调用java对象的clickOnAndroid()方法了，wave()方法是java中调用javascript的例子。</p><p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">这里还有几个知识点：</p><p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">1) 为了让WebView从apk文件中加载assets，Android  SDK提供了一个schema，前缀为"file:///android_asset/"。WebView遇到这样的schema，就去当前包中的 assets目录中找内容。如上面的"file:///android_asset/demo.html"</p><p style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px">2)addJavascriptInterface方法中要绑定的Java对象及方法要运行另外的线程中，不能运行在构造他的线程中，这也是使用Handler的目的。</p></div><img src ="http://www.blogjava.net/oathleo/aggbug/357274.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2011-08-25 15:36 <a href="http://www.blogjava.net/oathleo/archive/2011/08/25/357274.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>proguard ant 混淆</title><link>http://www.blogjava.net/oathleo/archive/2011/08/24/357190.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Wed, 24 Aug 2011 06:39:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2011/08/24/357190.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/357190.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2011/08/24/357190.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/357190.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/357190.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">property&nbsp;name</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">proguard-home</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;value</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">D:/proguard4.4/lib</span><span style="color: #000000; ">"</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">property&nbsp;name</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">android-jar</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;value</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">D:\android3.0\android-sdk_r12-windows\android-sdk-windows\platforms\android-8\android.jar</span><span style="color: #000000; ">"</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; "><br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">指定&nbsp;proguard&nbsp;地址和&nbsp;android地址</span><span style="color: #008000; "><br />
</span><span style="color: #000000; "><br />
<br />
</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">java&nbsp;jar</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">${proguard-home}/proguard.jar</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;fork</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">true</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;failonerror</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">true</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">jvmarg&nbsp;value</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">-Dmaximum.inlined.code.length=32</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">arg&nbsp;value</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">-injars&nbsp;${target_temp_jar}</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">arg&nbsp;value</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">-outjars&nbsp;${target_jar}</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">第三方包</span><span style="color: #008000; "><br />
</span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">arg&nbsp;value</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">-libraryjars&nbsp;${android-jar}</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">arg&nbsp;value</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">-libraryjars&nbsp;lib/android_script.jar</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; "><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;!--</span><span style="color: #000000; ">&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">arg&nbsp;value</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">-libraryjars&nbsp;${external-libs}/*.jar</span><span style="color: #000000; ">"</span><span style="color: #000000; ">/&gt;--&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">arg&nbsp;value</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">-dontpreverify</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">arg&nbsp;value</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">-dontoptimize</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">arg&nbsp;value</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">-dontusemixedcaseclassnames</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">arg&nbsp;value</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">-repackageclasses&nbsp;''</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">arg&nbsp;value</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">-allowaccessmodification</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;!--</span><span style="color: #000000; ">保护public字段</span><span style="color: #000000; ">--&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">arg&nbsp;value</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">-keepclassmembers&nbsp;public&nbsp;class&nbsp;*&nbsp;{&nbsp;public&nbsp;protected&nbsp;*;&nbsp;}</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;!--</span><span style="color: #000000; ">保护泛型</span><span style="color: #000000; ">--&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">arg&nbsp;value</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">-keepattributes&nbsp;Signature</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; "><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">arg&nbsp;value</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">-keep&nbsp;public&nbsp;class&nbsp;com.xxxcore.*</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">arg&nbsp;value</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">-keep&nbsp;public&nbsp;class&nbsp;com.xxxviewer.**</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; "><br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">arg&nbsp;value</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">-optimizationpasses&nbsp;7</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">arg&nbsp;value</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">-verbose</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">arg&nbsp;value</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">-dontskipnonpubliclibraryclasses</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">arg&nbsp;value</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">-dontskipnonpubliclibraryclassmembers</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;/</span><span style="color: #000000; ">java</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">signjar&nbsp;jar</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">${target_jar}</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;keystore</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">${sign.keystore}</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;alias</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">${sign.alias}</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;keypass</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">${sign.keypass}</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;storepass</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">${sign.storepass}</span><span style="color: #000000; ">"</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">delete&nbsp;file</span><span style="color: #000000; ">=</span><span style="color: #000000; ">"</span><span style="color: #000000; ">${target_temp_jar}</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">/&gt;</span><span style="color: #000000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">&lt;/</span><span style="color: #000000; ">target</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; "><br />
</span></div>
<br /><br /><br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">参数：<br /><br /></span><span style="color: #000000; ">-</span><span style="color: #000000; ">include&nbsp;{filename}&nbsp;&nbsp;&nbsp;&nbsp;从给定的文件中读取配置参数<br /><br /></span><span style="color: #000000; ">-</span><span style="color: #000000; ">basedirectory&nbsp;{directoryname}&nbsp;&nbsp;&nbsp;&nbsp;指定基础目录为以后相对的档案名称<br /><br /></span><span style="color: #000000; ">-</span><span style="color: #000000; ">injars&nbsp;{class_path}&nbsp;&nbsp;&nbsp;&nbsp;指定要处理的应用程序jar,war,ear和目录<br /><br /></span><span style="color: #000000; ">-</span><span style="color: #000000; ">outjars&nbsp;{class_path}&nbsp;&nbsp;&nbsp;&nbsp;指定处理完后要输出的jar,war,ear和目录的名称<br /><br /></span><span style="color: #000000; ">-</span><span style="color: #000000; ">libraryjars&nbsp;{classpath}&nbsp;&nbsp;&nbsp;&nbsp;指定要处理的应用程序jar,war,ear和目录所需要的程序库文件<br /><br /></span><span style="color: #000000; ">-</span><span style="color: #000000; ">dontskipnonpubliclibraryclasses&nbsp;&nbsp;&nbsp;&nbsp;指定不去忽略非公共的库类。<br /><br /></span><span style="color: #000000; ">-</span><span style="color: #000000; ">dontskipnonpubliclibraryclassmembers&nbsp;&nbsp;&nbsp;&nbsp;指定不去忽略包可见的库类的成员。<br /><br /><br />保留选项<br /></span><span style="color: #000000; ">-</span><span style="color: #000000; ">keep&nbsp;{Modifier}&nbsp;{class_specification}&nbsp;&nbsp;&nbsp;&nbsp;保护指定的类文件和类的成员<br /><br /></span><span style="color: #000000; ">-</span><span style="color: #000000; ">keepclassmembers&nbsp;{modifier}&nbsp;{class_specification}&nbsp;&nbsp;&nbsp;&nbsp;保护指定类的成员，如果此类受到保护他们会保护的更好<br /><br /></span><span style="color: #000000; ">-</span><span style="color: #000000; ">keepclasseswithmembers&nbsp;{class_specification}&nbsp;&nbsp;&nbsp;&nbsp;保护指定的类和类的成员，但条件是所有指定的类和类成员是要存在。<br /><br /></span><span style="color: #000000; ">-</span><span style="color: #000000; ">keepnames&nbsp;{class_specification}&nbsp;&nbsp;&nbsp;&nbsp;保护指定的类和类的成员的名称（如果他们不会压缩步骤中删除）<br /><br /></span><span style="color: #000000; ">-</span><span style="color: #000000; ">keepclassmembernames&nbsp;{class_specification}&nbsp;&nbsp;&nbsp;&nbsp;保护指定的类的成员的名称（如果他们不会压缩步骤中删除）<br /><br /></span><span style="color: #000000; ">-</span><span style="color: #000000; ">keepclasseswithmembernames&nbsp;{class_specification}&nbsp;&nbsp;&nbsp;&nbsp;保护指定的类和类的成员的名称，如果所有指定的类成员出席（在压缩步骤之后）<br /><br /></span><span style="color: #000000; ">-</span><span style="color: #000000; ">printseeds&nbsp;{filename}&nbsp;&nbsp;&nbsp;&nbsp;列出类和类的成员</span><span style="color: #000000; ">-</span><span style="color: #000000; ">keep选项的清单，标准输出到给定的文件<br /><br />压缩<br /></span><span style="color: #000000; ">-</span><span style="color: #000000; ">dontshrink&nbsp;&nbsp;&nbsp;&nbsp;不压缩输入的类文件<br /><br /></span><span style="color: #000000; ">-</span><span style="color: #000000; ">printusage&nbsp;{filename}<br /><br /></span><span style="color: #000000; ">-</span><span style="color: #000000; ">whyareyoukeeping&nbsp;{class_specification}&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />优化<br /></span><span style="color: #000000; ">-</span><span style="color: #000000; ">dontoptimize&nbsp;&nbsp;&nbsp;&nbsp;不优化输入的类文件<br /><br /></span><span style="color: #000000; ">-</span><span style="color: #000000; ">assumenosideeffects&nbsp;{class_specification}&nbsp;&nbsp;&nbsp;&nbsp;优化时假设指定的方法，没有任何副作用<br /><br /></span><span style="color: #000000; ">-</span><span style="color: #000000; ">allowaccessmodification&nbsp;&nbsp;&nbsp;&nbsp;优化时允许访问并修改有修饰符的类和类的成员<br /><br />混淆<br /></span><span style="color: #000000; ">-</span><span style="color: #000000; ">dontobfuscate&nbsp;&nbsp;&nbsp;&nbsp;不混淆输入的类文件<br /><br /></span><span style="color: #000000; ">-</span><span style="color: #000000; ">printmapping&nbsp;{filename}<br /><br /></span><span style="color: #000000; ">-</span><span style="color: #000000; ">applymapping&nbsp;{filename}&nbsp;&nbsp;&nbsp;&nbsp;重用映射增加混淆<br /><br /></span><span style="color: #000000; ">-</span><span style="color: #000000; ">obfuscationdictionary&nbsp;{filename}&nbsp;&nbsp;&nbsp;&nbsp;使用给定文件中的关键字作为要混淆方法的名称<br /><br /></span><span style="color: #000000; ">-</span><span style="color: #000000; ">overloadaggressively&nbsp;&nbsp;&nbsp;&nbsp;混淆时应用侵入式重载<br /><br /></span><span style="color: #000000; ">-</span><span style="color: #000000; ">useuniqueclassmembernames&nbsp;&nbsp;&nbsp;&nbsp;确定统一的混淆类的成员名称来增加混淆<br /><br /></span><span style="color: #000000; ">-</span><span style="color: #000000; ">flattenpackagehierarchy&nbsp;{package_name}&nbsp;&nbsp;&nbsp;&nbsp;重新包装所有重命名的包并放在给定的单一包中<br /><br /></span><span style="color: #000000; ">-</span><span style="color: #000000; ">repackageclass&nbsp;{package_name}&nbsp;&nbsp;&nbsp;&nbsp;重新包装所有重命名的类文件中放在给定的单一包中<br /><br /></span><span style="color: #000000; ">-</span><span style="color: #000000; ">dontusemixedcaseclassnames&nbsp;&nbsp;&nbsp;&nbsp;混淆时不会产生形形色色的类名<br /><br /></span><span style="color: #000000; ">-</span><span style="color: #000000; ">keepattributes&nbsp;{attribute_name,<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />}&nbsp;&nbsp;&nbsp;&nbsp;保护给定的可选属性，例如LineNumberTable,&nbsp;LocalVariableTable,&nbsp;SourceFile,&nbsp;Deprecated,&nbsp;Synthetic,&nbsp;Signature,&nbsp;and&nbsp;InnerClasses.<br /><br /></span><span style="color: #000000; ">-</span><span style="color: #000000; ">renamesourcefileattribute&nbsp;{string}&nbsp;&nbsp;&nbsp;&nbsp;设置源文件中给定的字符串常量</span></div><img src ="http://www.blogjava.net/oathleo/aggbug/357190.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2011-08-24 14:39 <a href="http://www.blogjava.net/oathleo/archive/2011/08/24/357190.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>android GestureListener 手势 多指缩放</title><link>http://www.blogjava.net/oathleo/archive/2011/08/21/356978.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Sun, 21 Aug 2011 03:59:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2011/08/21/356978.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/356978.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2011/08/21/356978.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/356978.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/356978.html</trackback:ping><description><![CDATA[<div>注意<br />1.onDown 多指事件仍然响应成单指<br />2.onScroll滑动时触发,e1只能获得一个点 ，而e2却能获得多点。（搞不清楚为什么怎么设计）<br />3.想在view上加 GestureListener <br />可以使用下面的代码：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;ViewerInnerTouchListener&nbsp;</span><span style="color: #0000FF; ">implements</span><span style="color: #000000; ">&nbsp;OnTouchListener&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">private</span><span style="color: #000000; ">&nbsp;GestureDetector&nbsp;gestureDetector;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;ViewerInnerTouchListener(GAViewer&nbsp;viewer)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gestureDetector&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;GestureDetector(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;GestureListener(viewer));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">boolean</span><span style="color: #000000; ">&nbsp;onTouch(View&nbsp;v,&nbsp;MotionEvent&nbsp;event)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gestureDetector.onTouchEvent(event);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;setOnTouchListener(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ViewerInnerTouchListener(</span><span style="color: #0000FF; ">this</span><span style="color: #000000; ">));</span></div><br />判断手势：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">boolean</span><span style="color: #000000; ">&nbsp;onFling(MotionEvent&nbsp;e1,&nbsp;MotionEvent&nbsp;e2,&nbsp;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&nbsp;velocityX,&nbsp;</span><span style="color: #0000FF; ">float</span><span style="color: #000000; ">&nbsp;velocityY)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(e1.getX()&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;e2.getX()&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;SWIPE_MIN_DISTANCE&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;Math.abs(velocityX)&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;SWIPE_THRESHOLD_VELOCITY)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.i(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">onFling</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">onFling</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">true</span><span style="color: #000000; ">;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Right&nbsp;to&nbsp;left</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(e2.getX()&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;e1.getX()&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;SWIPE_MIN_DISTANCE&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;Math.abs(velocityX)&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;SWIPE_THRESHOLD_VELOCITY)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Left&nbsp;to&nbsp;right</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(e1.getY()&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;e2.getY()&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;SWIPE_MIN_DISTANCE&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;Math.abs(velocityY)&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;SWIPE_THRESHOLD_VELOCITY)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Bottom&nbsp;to&nbsp;top</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: #0000FF; ">else</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(e2.getY()&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">&nbsp;e1.getY()&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;SWIPE_MIN_DISTANCE&nbsp;</span><span style="color: #000000; ">&amp;&amp;</span><span style="color: #000000; ">&nbsp;Math.abs(velocityY)&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;SWIPE_THRESHOLD_VELOCITY)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Top&nbsp;to&nbsp;bottom</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">false</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}</span></div><br /><br />GestureListener 的几个方法要理解<br />&nbsp;&nbsp; &nbsp; //Touch down时触发，不论是touch (包括long) ，scroll<br />&nbsp;&nbsp; &nbsp; public boolean onDown(MotionEvent e) {<br />&nbsp;&nbsp; &nbsp; return false;<br />&nbsp;&nbsp; &nbsp; }<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; //Touch了还没有滑动时触发<br />&nbsp;&nbsp; &nbsp; //（与onDown，onLongPress比较<br />&nbsp;&nbsp; &nbsp; //onDown只要Touch down一定立刻触发。<br />&nbsp;&nbsp; &nbsp; public void onShowPress(MotionEvent e) {<br />&nbsp;&nbsp; &nbsp; }<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; //Touch了不移动一直Touch down时触发<br />&nbsp;&nbsp; &nbsp; //Touchdown后过一会没有滑动先触发onShowPress再是onLongPress。<br />&nbsp;&nbsp; &nbsp; public void onLongPress(MotionEvent e) {<br />&nbsp;&nbsp; &nbsp; }<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; //上面这两个函数都是在touch down后又没有滑动（onScroll），又没有长按（onLongPress），然后Touchup时触发。<br />&nbsp;&nbsp; &nbsp; /**<br />&nbsp;&nbsp; &nbsp; * 点击一下非常快的（不滑动）Touchup： onDown-&gt;onSingleTapUp-&gt;onSingleTapConfirmed<br />&nbsp;&nbsp; &nbsp; *<br />&nbsp;&nbsp; &nbsp; 点击一下稍微慢点的（不滑动）Touchup：onDown-&gt;onShowPress-&gt;onSingleTapUp-&gt;onSingleTapConfirmed<br />&nbsp;&nbsp; &nbsp; * 点击longpress ，onScroll 时 不触发 onSingleTapUp<br />&nbsp;&nbsp; &nbsp; */<br />&nbsp;&nbsp; &nbsp; public boolean onSingleTapUp(MotionEvent e) {<br />&nbsp;&nbsp; &nbsp; Log.i("onSingleTapUp", "onSingleTapUp");<br />&nbsp;&nbsp; &nbsp; return false;<br />&nbsp;&nbsp; &nbsp; }<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; //Touch了滑动时触发<br />&nbsp;&nbsp; &nbsp; public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,<br />&nbsp;&nbsp; &nbsp; float distanceY) {<br />&nbsp;&nbsp; &nbsp; return true;<br />&nbsp;&nbsp; &nbsp; }<br />&nbsp;&nbsp; &nbsp;<br />&nbsp;&nbsp; &nbsp; //Touch了滑动一点距离后，up时触发<br />&nbsp;&nbsp; &nbsp; public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,<br />&nbsp;&nbsp; &nbsp; float velocityY) {<br />&nbsp;&nbsp; &nbsp; return true;<br />&nbsp;&nbsp; &nbsp; }</div><img src ="http://www.blogjava.net/oathleo/aggbug/356978.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2011-08-21 11:59 <a href="http://www.blogjava.net/oathleo/archive/2011/08/21/356978.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>android:padding和android:layout_margin的区别 </title><link>http://www.blogjava.net/oathleo/archive/2011/08/18/356794.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Thu, 18 Aug 2011 08:33:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2011/08/18/356794.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/356794.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2011/08/18/356794.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/356794.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/356794.html</trackback:ping><description><![CDATA[<div><span style="word-spacing: 0px; font: medium simsun; text-transform: none; color: #000000; text-indent: 0px; white-space: normal; letter-spacing: normal; border-collapse: separate; orphans: 2; widows: 2; webkit-border-horizontal-spacing: 0px; webkit-border-vertical-spacing: 0px; webkit-text-decorations-in-effect: none; webkit-text-size-adjust: auto; webkit-text-stroke-width: 0px"><span style="font-size: 14px; line-height: 21px; font-family: verdana, sans-serif;">之 前一直没有搞懂android:padding和android:layout_margin的区别，其实概念很简单，padding是站在父view的 角度描述问题，它规定它里面的内容必须与这个父view边界的距离。margin则是站在自己的角度描述问题，规定自己和其他（上下左右）的view之间 的距离，如果同一级只有一个view，那么它的效果基本上就和padding一样了</span></span></div><img src ="http://www.blogjava.net/oathleo/aggbug/356794.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2011-08-18 16:33 <a href="http://www.blogjava.net/oathleo/archive/2011/08/18/356794.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>android layout xml</title><link>http://www.blogjava.net/oathleo/archive/2011/08/16/356623.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Tue, 16 Aug 2011 04:53:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2011/08/16/356623.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/356623.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2011/08/16/356623.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/356623.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/356623.html</trackback:ping><description><![CDATA[<div><span>layout在xml里是无法使用findView 找到的<br /><br />只能使用：<br /><div><span style="color: red;">View menu = inflater.inflate(R.layout.main_left_layout, null);</span></div><br />获得<div>LayoutInflater 的方法：<br /></div>1.Activity<br />LayoutInflater&nbsp;inflater&nbsp;=&nbsp;getLayoutInflater();&nbsp; <br />2.<br /><div>LayoutInflater inflater = LayoutInflater.from(context);</div><br /><br /></span></div><br /><img src ="http://www.blogjava.net/oathleo/aggbug/356623.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2011-08-16 12:53 <a href="http://www.blogjava.net/oathleo/archive/2011/08/16/356623.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>android 内部资源获取</title><link>http://www.blogjava.net/oathleo/archive/2011/08/08/356003.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Mon, 08 Aug 2011 03:24:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2011/08/08/356003.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/356003.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2011/08/08/356003.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/356003.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/356003.html</trackback:ping><description><![CDATA[<div>1、XML资源文件可以被AAPT打包进应用程序包，如果需要被打包，放置在/res/xml目录下，如果不需要被打包，放置在/res/raw下。<br /><br />2、对/res/xml的支持<br /><br />以读取/res/xml/test.xml为例<br /><br />Resources res=activity.getResources();<br /><br />XmlResourceParser xpp=res.getxml(R.xml.test);<br /><br />inet eventType=xpp.getEventType();<br /><br />再根据evenType的类型，判断读取了什么内容，比如说，读到了文档的开头，XmlPullParser.START_DOCUMENT等<br /><br />使用xpp.getName()取得标志名称，使用xpp.getText()取得文本内容<br /><br />最后<br /><br />eventType=xpp.next();来读取下一行内容<br /><br />3、对/res/raw的支持<br /><br />以读取/res/raw/test.txt为例<br /><br />Resources r=activity.getResources();<br /><br />InputStream is=r.openRawResource(R.raw.test);<br /><br />4、资产<br /><br />/assets不会在R.java中生成资源ID，必须指定文件路径才能读取它们。文件路径是以/assets开头的相对路径。<br /><br />AssetManger am=activity.getAssets();<br /><br />InputStream is=am.open("test.txt");</div><img src ="http://www.blogjava.net/oathleo/aggbug/356003.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2011-08-08 11:24 <a href="http://www.blogjava.net/oathleo/archive/2011/08/08/356003.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>终于把script包源码扒出来了</title><link>http://www.blogjava.net/oathleo/archive/2011/08/01/355481.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Mon, 01 Aug 2011 03:08:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2011/08/01/355481.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/355481.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2011/08/01/355481.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/355481.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/355481.html</trackback:ping><description><![CDATA[script包源码包括：<br /><div>sun\script\javascript</div><div>script</div>和<br /><div>org\mozilla\javascript<br /><br />其中<div>org\mozilla\javascript</div>是真正的javascript实现 源码1M多<br /><br />一起打包完大概860K</div><img src ="http://www.blogjava.net/oathleo/aggbug/355481.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2011-08-01 11:08 <a href="http://www.blogjava.net/oathleo/archive/2011/08/01/355481.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>编写高效的Android代码(Designing for Performance) </title><link>http://www.blogjava.net/oathleo/archive/2011/07/31/355428.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Sun, 31 Jul 2011 00:31:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2011/07/31/355428.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/355428.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2011/07/31/355428.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/355428.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/355428.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp; 中文: http://www.chinaup.org/docs/toolbox/performance.html 英文: /android-sdk/docs/guide/guide_toc.html &nbsp;  尽量避免创建对象  使用自身方法  使用虚拟优于使用接口  使用静态优于使用虚拟  避免内部使用Setter和Getter  缓冲属性调用  声明Final常量  慎重使...&nbsp;&nbsp;<a href='http://www.blogjava.net/oathleo/archive/2011/07/31/355428.html'>阅读全文</a><img src ="http://www.blogjava.net/oathleo/aggbug/355428.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2011-07-31 08:31 <a href="http://www.blogjava.net/oathleo/archive/2011/07/31/355428.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Can't create handler inside thread that has not called Looper.prepare() 异常问题</title><link>http://www.blogjava.net/oathleo/archive/2011/07/30/355382.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Sat, 30 Jul 2011 02:04:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2011/07/30/355382.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/355382.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2011/07/30/355382.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/355382.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/355382.html</trackback:ping><description><![CDATA[遇到的情况<br /><div>AsyncTask</div><div>protected GAViewer doInBackground(Activity... params) {<br />&nbsp;&nbsp;&nbsp; ......<br /><div>&nbsp;&nbsp;&nbsp; GAViewer viewer = new GAViewer(result, drawActivity.getApplicationContext());<br />&nbsp;&nbsp;&nbsp; return viewer;</div>}<br /><br />产生<div>Can't create handler inside thread that has not called Looper.prepare()</div>异常<br /><br />原因估计<br />1.viewer 是个 SurfaceView ，而doInBackground是不允许操作UI的<br />2.drawActivity.getApplicationContext() 已经操作了UI ？maybe</div><img src ="http://www.blogjava.net/oathleo/aggbug/355382.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2011-07-30 10:04 <a href="http://www.blogjava.net/oathleo/archive/2011/07/30/355382.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>XmlPullParser 效率问题</title><link>http://www.blogjava.net/oathleo/archive/2011/07/30/355381.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Sat, 30 Jul 2011 02:00:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2011/07/30/355381.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/355381.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2011/07/30/355381.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/355381.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/355381.html</trackback:ping><description><![CDATA[3000行的多层次XML，<br />环境2.2，Xoom<br /><br /><div>XmlPullParser&nbsp; 2000ms 以上<br /><div>SAXParser&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 200ms 不到<br /><br />原因不知道~暂时没空深层研究了</div>&nbsp;</div><img src ="http://www.blogjava.net/oathleo/aggbug/355381.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2011-07-30 10:00 <a href="http://www.blogjava.net/oathleo/archive/2011/07/30/355381.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>高级画布绘图（3）</title><link>http://www.blogjava.net/oathleo/archive/2011/07/26/355043.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Tue, 26 Jul 2011 03:35:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2011/07/26/355043.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/355043.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2011/07/26/355043.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/355043.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/355043.html</trackback:ping><description><![CDATA[<div><strong>高级画布绘图（3）</strong> <p>DashPathEffect&nbsp; 可以使用DashPathEffect来创建一个虚线的轮廓(短横线/小圆点)，而不是使用实线。你还可以指定任意的虚/实线段的重复模式。</p> <p>DiscretePathEffect&nbsp; 与DashPathEffect相似，但是添加了随机性。当绘制它的时候，需要指定每一段的长度和与原始路径的偏离度。</p> <p>PathDashPathEffect&nbsp; 这种效果可以定义一个新的形状(路径)并将其用作原始路径的轮廓标记。</p> <p>下面的效果可以在一个Paint中组合使用多个Path Effect。</p> <p>SumPathEffect&nbsp; 顺序地在一条路径中添加两种效果，这样每一种效果都可以应用到原始路径中，而且两种结果可以结合起来。</p> <p>ComposePathEffect&nbsp; 将两种效果组合起来应用，先使用第一种效果，然后在这种效果的基础上应用第二种效果。</p> <p>对象形状的PathEffect的改变会影响到形状的区域。这就能够保证应用到相同形状的填充效果将会绘制到新的边界中。</p> <p>使用setPathEffect方法可以把PathEffect应用到Paint对象中，如下所示:</p><pre><ol><li><span>borderPaint.setPathEffect(new&nbsp;CornerPathEffect(5));&nbsp;</span></li></ol></pre> <p>PathEffect API示例给出了如何应用每一种效果的指导说明。</p> <p>修改Xfermode</p> <p>可以通过修改Paint的Xfermode来影响在Canvas已有的图像上面绘制新的颜色的方式。</p> <p>在正常的情况下，在已有的图像上绘图将会在其上面添加一层新的形状。如果新的Paint是完全不透明的，那么它将完全遮挡住下面的Paint；如果它是部分透明的，那么它将会被染上下面的颜色。</p> <p>下面的Xfermode子类可以改变这种行为：</p> <p>AvoidXfermode&nbsp; 指定了一个颜色和容差，强制Paint避免在它上面绘图(或者只在它上面绘图)。</p> <p>PixelXorXfermode&nbsp; 当覆盖已有的颜色时，应用一个简单的像素XOR操作。</p> <p>PorterDuffXfermode&nbsp; 这是一个非常强大的转换模式，使用它，可以使用图像合成的16条Porter-Duff规则的任意一条来控制Paint如何与已有的Canvas图像进行交互。</p> <p>要应用转换模式，可以使用setXferMode方法，如下所示：</p><pre><ol><li><span>AvoidXfermode&nbsp;avoid&nbsp;=&nbsp;new&nbsp;AvoidXfermode(Color.BLUE,&nbsp;10,&nbsp;AvoidXfermode.Mode.&nbsp;AVOID); &nbsp;</span></li><li>borderPen.setXfermode(avoid);&nbsp;</li></ol></pre> <p><strong>3. 使用抗锯齿效果提高Paint质量</strong></p> <p>在绘制一个新的Paint对象时，可以通过传递给它一些标记来影响它被渲染的方式。ANTI_ALIAS_FLAG是其中一种很有趣的标记，它可以保证在绘制斜线的时候使用抗锯齿效果来平滑该斜线的外观。</p> <p>在绘制文本的时候，抗锯齿效果尤为重要，因为经过抗锯齿效果处理之后的文本非常容易阅读。要创建更加平滑的文本效果，可以应用SUBPIXEL_TEXT_FLAG，它将会应用子像素抗锯齿效果。</p> <p>也可以手工地使用setSubpixelText和setAntiAlias方法来设置这些标记，如下所示：<br /></p><pre><ol><li><span>myPaint.setSubpixelText(true); &nbsp;</span></li><li>myPaint.setAntiAlias(true);&nbsp;</li></ol></pre> <p><strong>4. 2D图形的硬件加速</strong></p> <p>在当前这个到处都是2D图形爱好者的时代，Android允许你使用硬件加速来渲染你的应用程序。</p> <p>如果设备可以使用硬件加速，那么通过设置这个标记可以让活动中的每一个View都能使用硬件渲染。尽管减少了系统处理程序的负载，但在极大地提高了图像处理速度的同时，硬件加速也带来了相应的负面效果。</p> <p>使用requestWindowFeature方法，可以在你的活动中应用Window.FEATURE_OPENGL标记来打开硬件加速，如下所示：</p><pre><ol><li><span>myActivity.requestWindowFeature(Window.FEATURE_OPENGL);&nbsp;</span></li></ol></pre> <p>遗憾的是，天上不会掉馅饼，这次也不例外。</p> <p>并不是Android中所有的2D绘图基本图形都被硬件支持(特别是前面描述的大部分PathEffect)。</p> <p>与此同时，由于整个活动实际上是作为一个Canvas进行渲染的，所以对任何View的无效请求都将会导致整个活动被重新绘制。</p> <p><strong>5. Canvas绘图最佳实践经验</strong></p> <p>2D自绘操作是非常耗费处理程序资源的；低效的绘图方法会阻塞GUI线程，并且会对应用程序的响应造成不利的影响。对于那些只有一个处理程序的资源受限的环境来说，这一点就更加现实了。</p> <p>这里需要注意onDraw方法的资源消耗以及CPU周期的耗费，这样才能保证不会把一个看起来很吸引人的应用程序变得完全没有响应。</p> <p>目前有很多技术可以帮助将与自绘控件相关的资源消耗最小化。我们关心的不是一般的原则，而是某些Android特定的注意事项，从而保证你可以创建外观时尚、而且能够保持交互的活动(注意，以下这个列表并不完整)：</p> <p>考虑硬件加速&nbsp; OpenGL硬件加速对2D图形的支持是非常好的，所以你总是应该考虑它是否适合你的活动。另一种比较优秀的方法是只用一个单独的View和迅速的、耗时的更新来组成活动。一定要保证你使用的基本图形能够被硬件支持。</p> <p>考虑大小和方向&nbsp; 当在设计View和布局的时候，一定要保证考虑(和测试)它们在不同的分辨率和大小下的外观。</p> <p>只创建一次静态对象&nbsp; 在Android中对象的创建是相当昂贵的。因此，在可能的地方，应用只创建一次像Paint对象、Path和Shader这样的绘图对象，而不是在View每次无效的时候都重新创建它们。</p> <p>记住onDraw是很消耗资源的&nbsp; 执行onDraw方法是很消耗资源的处理，它会强制Android执行多个图片组合和位图构建操作。下面有几点建议可以让你修改Canvas的外观，而不用重新绘制它：</p> <p>使用Canvas转换&nbsp; 可以使用像rotate和translate这样的转换，来简化Canvas中元素复杂的相关位置。例如，相比放置和旋转一个表盘周围的每一个文本元素，你可以简单地将canvas旋转22.5?，然后在相同的位置绘制文本。</p> <p>使用动画&nbsp; 可以考虑使用动画来执行View的预设置的转换，而不是手动地重新绘制它。在活动的View中可以执行缩放、旋转和转换动画，并可以提供一种能够有效利用资源的方式来提供缩放、旋转或者抖动效果。</p> <p>考虑使用位图和9 Patch&nbsp; 如果View使用了静态背景，那么你应该考虑使用一个图片，如位图或者9 patch，而不是手动地重新绘制。</p></div><img src ="http://www.blogjava.net/oathleo/aggbug/355043.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2011-07-26 11:35 <a href="http://www.blogjava.net/oathleo/archive/2011/07/26/355043.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>高级画布绘图（2）</title><link>http://www.blogjava.net/oathleo/archive/2011/07/26/355042.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Tue, 26 Jul 2011 03:33:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2011/07/26/355042.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/355042.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2011/07/26/355042.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/355042.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/355042.html</trackback:ping><description><![CDATA[<div><p><strong>11.4.3&nbsp; 高级画布绘图（2）</strong></p> <p>提示：</p> <p>图11-1中没有包含的是ComposerShader，它可以创建多个Shader和BitmapShader的组合，从而可以在一个位图图像的基础上创建一个绘图刷。</p> <p>要在绘图的时候使用一个Shader，可以使用setShader方法将其应用到一个Paint中，如下面的代码所示：</p><pre><ol><li><span>Paint&nbsp;shaderPaint&nbsp;=&nbsp;new&nbsp;Paint(); &nbsp;</span></li><li>shaderPaint.setShader(myLinearGradient);&nbsp;</li></ol></pre> <p>你使用这个Paint所绘制的任何东西都将使用你指定的Shader进行填充，而不是使用Paint本身的颜色进行填充。</p> <p>定义渐变Shader</p> <p>如上所示，使用渐变Shader可以让你使用交替改变的颜色来填充图片；你可以将颜色渐变定义为两种颜色的简单交替，如下所示：</p><pre><ol><li><span>int&nbsp;colorFrom&nbsp;=&nbsp;Color.BLACK; &nbsp;</span></li><li>int&nbsp;colorTo&nbsp;=&nbsp;Color.WHITE; &nbsp;</li><li>&nbsp;</li><li>LinearGradient&nbsp;linearGradientShader&nbsp;=&nbsp;new&nbsp;LinearGradient(x1,&nbsp;y1,&nbsp;x2,&nbsp;y2, &nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;colorFrom, &nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;colorTo, &nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TileMode.CLAMP);&nbsp;</li></ol></pre> <p>或者，你还可以定义更复杂的按照设定比例进行分布的颜色序列，如下面的RadialGradientShader例子所示：</p><pre><ol><li><span>int[]&nbsp;gradientColors&nbsp;=&nbsp;new&nbsp;int[3]; &nbsp;</span></li><li>gradientColors[0]&nbsp;=&nbsp;Color.GREEN; &nbsp;</li><li>gradientColors[1]&nbsp;=&nbsp;Color.YELLOW; &nbsp;</li><li>gradientColors[2]&nbsp;=&nbsp;Color.RED; &nbsp;</li><li>&nbsp;</li><li>float[]&nbsp;gradientPositions&nbsp;=&nbsp;new&nbsp;float[3]; &nbsp;</li><li>gradientPositions[0]&nbsp;=&nbsp;0.0f; &nbsp;</li><li>gradientPositions[1]&nbsp;=&nbsp;0.5f; &nbsp;</li><li>gradientPositions[2]&nbsp;=&nbsp;1.0f; &nbsp;</li><li>&nbsp;</li><li>RadialGradient&nbsp;radialGradientShader=new&nbsp;RadialGradient(centerX,centerY,&nbsp;radius, &nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gradientColors, &nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gradientPositions, &nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TileMode.CLAMP);&nbsp;</li></ol></pre> <p>每一种渐变Shader(线性的、辐射形的和扫描状的)都可以使用以上这两种技术来定义渐变填充。</p> <p>使用Shader TileModes</p> <p>渐变Shader的画刷大小既可以显式地使用有边界的矩形来定义，也可以使用中心点和半径长度来定义。Bitmap Shader可以通过它的位图大小来决定它的画刷大小。</p> <p>如果Shader画刷所定义的区域比要填充的区域小，那么TileMode将会决定如何处理剩余的区域：</p> <p>CLAMP&nbsp; 使用Shader的边界颜色来填充剩余的空间。</p> <p>MIRROR&nbsp; 在水平和垂直方向上拉伸Shader图像，这样每一个图像就都能与上一个缝合了。</p> <p>REPEAT&nbsp; 在水平和垂直方向上重复Shader图像，但不拉伸它。</p> <p>使用MaskFilter</p> <p>MaskFilter类可以为Paint分配边缘效果。</p> <p>对MaskFilter的扩展可以对一个Paint边缘的alpha通道应用转换。Android包含了下面几种MaskFilter：</p> <p>BlurMaskFilter&nbsp;&nbsp; 指定了一个模糊的样式和半径来处理Paint的边缘。</p> <p>EmbossMaskFilter&nbsp; 指定了光源的方向和环境光强度来添加浮雕效果。</p> <p>要应用一个MaskFilter，可以使用setMaskFilter方法，并传递给它一个MaskFilter对象。下面的例子是对一个已经存在的Paint应用一个EmbossMaskFilter：</p><pre><ol><li><span>//&nbsp;设置光源的方向 &nbsp;</span></li><li>float[]&nbsp;direction&nbsp;=&nbsp;new&nbsp;float[]{&nbsp;1,&nbsp;1,&nbsp;1&nbsp;}; &nbsp;</li><li>//设置环境光亮度 &nbsp;</li><li>float&nbsp;light&nbsp;=&nbsp;0.4f; &nbsp;</li><li>//&nbsp;选择要应用的反射等级 &nbsp;</li><li>float&nbsp;specular&nbsp;=&nbsp;6; &nbsp;</li><li>//&nbsp;向mask应用一定级别的模糊 &nbsp;</li><li>float&nbsp;blur&nbsp;=&nbsp;3.5f; &nbsp;</li><li>EmbossMaskFilter&nbsp;emboss=new&nbsp;EmbossMaskFilter(direction,light,specular,blur); &nbsp;</li><li>&nbsp;</li><li>//&nbsp;应用mask &nbsp;</li><li>myPaint.setMaskFilter(emboss);&nbsp;</li></ol></pre> <p>SDK中包含的FingerPaint API demo是说明如何使用MaskFilter的一个非常好的例子。它展示了这两种filter的效果。</p> <p><strong>使用ColorFilter</strong></p> <p>MaskFilter是对一个Paint的alpha通道的转换，而ColorFilter则是对每一个RGB通道应用转换。所有由ColorFilter所派生的类在执行它们的转换时，都会忽略alpha通道。</p> <p>Android包含三个ColorFilter：</p> <p>ColorMatrixColorFilter&nbsp; 可以指定一个4&#215;5的ColorMatrix并将其应用到一个Paint中。ColorMatrixes通常在程序中用于对图像进行处理，而且由于它们支持使用矩阵相乘的方法来执行链接转换，所以它们很有用。</p> <p>LightingColorFilter&nbsp; 乘以第一个颜色的RGB通道，然后加上第二个颜色。每一次转换的结果都限制在0到255之间。</p> <p>PorterDuffColorFilter&nbsp; 可以使用数字图像合成的16条Porter-Duff 规则中的任意一条来向Paint应用一个指定的颜色。</p> <p>使用setColorFilter方法应用ColorFilter，如下所示：</p> <p>myPaint.setColorFilter(new LightingColorFilter(Color.BLUE, Color.RED));</p> <p>API中的ColorMatrixSample是说明如何使用ColorFilter和Color Matrix的非常好的例子。</p> <p><strong>使用PathEffect</strong></p> <p>到目前为止，所有的效应都会影响到Paint填充图像的方式；PathEffect是用来控制绘制轮廓(线条)的方式。</p> <p>PathEffect对于绘制Path基本图形特别有用，但是它们也可以应用到任何Paint中从而影响线条绘制的方式。</p> <p>使用PathEffect，可以改变一个形状的边角的外观并且控制轮廓的外表。Android包含了多个PathEffect，包括：</p> <p>CornerPathEffect&nbsp; 可以使用圆角来代替尖锐的角从而对基本图形的形状尖锐的边角进行平滑。</p></div><img src ="http://www.blogjava.net/oathleo/aggbug/355042.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2011-07-26 11:33 <a href="http://www.blogjava.net/oathleo/archive/2011/07/26/355042.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>高级画布绘图（1）</title><link>http://www.blogjava.net/oathleo/archive/2011/07/26/355039.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Tue, 26 Jul 2011 03:14:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2011/07/26/355039.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/355039.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2011/07/26/355039.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/355039.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/355039.html</trackback:ping><description><![CDATA[<div><p><strong>11.4.3&nbsp; 高级画布绘图（1）</strong></p> <p>我们已经在第4章中介绍了Canvas，在那里，已经学习了如何创建自己的View。在第7章中也使用了Canvas来为MapView标注覆盖。</p> <p>画布(Canvas)是图形编程中一个很普通的概念，通常由三个基本的绘图组件组成：</p> <p>Canvas&nbsp; 提供了绘图方法，可以向底层的位图绘制基本图形。</p> <p>Paint&nbsp; 也称为"刷子"，Paint可以指定如何将基本图形绘制到位图上。</p> <p>Bitmap&nbsp; 绘图的表面。</p> <p>这一章中描述的大部分高级技术都涉及到了对Paint对象的变化和修改，从而可以向那些平面的光栅图片添加深度和纹理。</p> <p>Android绘图API支持透明度、渐变填充、圆边矩形和抗锯齿。遗憾的是，由于资源限制，它还不支持矢量图形，它使用的是传统光栅样式的重新绘图。</p> <p>这种光栅方法的结果是提高了效率，但是改变一个Paint对象不会影响已经画好的基本图形，它只会影响新的元素。</p> <p>提示：</p> <p>如果你拥有Windows开发背景，那么Android的2D绘图能力大致相当于GDI+的能力。</p> <p><strong>1. 可以画什么？</strong></p> <p>Canvas类封装了用作绘图表面的位图；它还提供了draw*方法来实现设计。</p> <p>下面的列表提供了对可用的基本图形的简要说明，但并没有深入地探讨每一个draw方法的详细内容：</p> <p>drawARGB / drawRGB / drawColor&nbsp; 使用单一的颜色填充画布。</p> <p>drawArc&nbsp; 在一个矩形区域的两个角之间绘制一个弧。</p> <p>drawBitmap&nbsp; 在画布上绘制一个位图。可以通过指定目标大小或者使用一个矩阵来改变目标位图的外观。</p> <p>drawBitmapMesh&nbsp; 使用一个mesh(网)来绘制一个位图，它可以通过移动网中的点来操作目标的外观。</p> <p>drawCircle&nbsp; 以给定的点为圆心，绘制一个指定半径的圆。</p> <p>drawLine(s)&nbsp; 在两个点之间画一条(多条)直线。</p> <p>drawOval&nbsp; 以指定的矩形为边界，画一个椭圆。</p> <p>drawPaint&nbsp; 使用指定的Paint填充整个Canvas</p> <p>drawPath&nbsp; 绘制指定的Path。Path对象经常用来保存一个对象中基本图形的集合。</p> <p>drawPicture&nbsp; 在指定的矩形中绘制一个Picture对象。</p> <p>drawPosText&nbsp; 绘制指定了每一个字符的偏移量的文本字符串。</p> <p>drawRect&nbsp; 绘制一个矩形。</p> <p>drawRoundRect&nbsp; 绘制一个圆角矩形。</p> <p>drawText&nbsp; 在Canvas上绘制一个文本串。文本的字体、大小和渲染属性都设置在用来渲染文本的Paint对象中。</p> <p>drawTextOnPath&nbsp; 在一个指定的path上绘制文本。</p> <p>drawVertices&nbsp; 绘制一系列三角形面片，通过一系列顶点来指定它们。</p> <p>这些绘图方法中的每一个都需要指定一个Paint对象来渲染它。在下面的部分中，将学习如何创建和修改Paint对象，从而在绘图中完成大部分工作。</p> <p><strong>2. 从Paint中完成工作</strong></p> <p>Paint类相当于一个笔刷和调色板。它可以选择如何使用上面描述的draw方法来渲染绘制在画布上的基本图形。通过修改Paint对象，可以在绘 图的时候控制颜色、样式、字体和特殊效果。最简单地，setColor可以让你选择一个Paint的颜色，而Paint对象的样式(使用setStyle 控制)则可以决定是绘制绘图对象的轮廓(STROKE)，还是只填充每一部分(FILL)，或者是两者都做(STROKE_AND_FILL)</p> <p>除了这些简单的控制之外，Paint类还支持透明度，另外，它也可以通过使用各种各样的阴影、过滤器和效果进行修改，从而提供由更丰富的、复杂的画笔和颜料组成的调色板。</p> <p>Android SDK包含了一些非常好的实例，它们说明了Paint类中可用的大部分功能。你可以在API demos的graphics子目录中找到它们：</p><pre><ol><li><span>[sdk&nbsp;root&nbsp;folder]\samples\ApiDemos\src\com\android\samples\graphics&nbsp;</span></li></ol></pre> <p>在下面的部分中，将学习和使用其中的部分功能。这些部分只是简单地罗列了它们能实现的效果(例如渐变和边缘浮雕)，而没有详细地列出所有可能的情况。</p> <p><strong>使用透明度</strong></p> <p>Android中的所有颜色都包含了一个不透明组件(alpha通道)。</p> <p>当创建一个颜色的时候，可以使用argb或者parseColor方法来定义它的alpha值，如下所示：</p><pre><ol><li><span>//&nbsp;使用红色，并让它50%透明 &nbsp;</span></li><li>int&nbsp;opacity&nbsp;=&nbsp;127; &nbsp;</li><li>int&nbsp;intColor&nbsp;=&nbsp;Color.argb(opacity,&nbsp;255,&nbsp;0,&nbsp;0); &nbsp;</li><li>int&nbsp;parsedColor&nbsp;=&nbsp;Color.parseColor("#7FFF0000");&nbsp;</li></ol></pre> <p>或者，也可以使用setAlpha方法来设置已存在的Paint对象的透明度：</p><pre><ol><li><span>//&nbsp;让颜色50%透明 &nbsp;</span></li><li>int&nbsp;opacity&nbsp;=&nbsp;127; &nbsp;</li><li>myPaint.setAlpha(opacity);&nbsp;</li></ol></pre> <p>创建一个不是100%透明的颜色意味着，使用它绘制的任何基本图形都将是部分透明的--也就是说，在它下面绘制的所有基本图形都是部分可见的。</p> <p>可以在任何使用了颜色的类或者方法中使用透明效果，包括Paint、Shader和Mask Filter。</p> <p><strong>Shader介绍</strong></p> <p>Shader类的派生类可以创建允许使用多种固体颜色填充绘图对象的Paint。</p> <p>对Shader最常见的使用是定义渐变填充；渐变是在2D图像中添加深度和纹理的最佳方式之一。Android包含了一个Bitmap Shader和一个Compose Shader，同时，还包含了三个渐变的Shader。</p> <p>试图用语言来描述绘图的效果本来就是没有意义的，所以看一下图11-1就应该可以知道每一种Shader是如何工作的。图中从左到右依次代表的是LinearGradient、RadialGradient和 SweepGradient.</p>   <table align="center" bgcolor="#ddddd" border="1" cellspacing="0"><tbody><tr> <td bgcolor="#ffffff"><a href="http://images.51cto.com/files/uploadimg/20100723/211019400.jpg" target="_blank"><img alt="" src="http://images.51cto.com/files/uploadimg/20100723/211019400.jpg" border="0" height="292" width="498" /></a>&nbsp;</td></tr> <tr> <td align="center" bgcolor="#dddddd">（点击查看大图）图11-1</td></tr></tbody></table></div><img src ="http://www.blogjava.net/oathleo/aggbug/355039.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2011-07-26 11:14 <a href="http://www.blogjava.net/oathleo/archive/2011/07/26/355039.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android 渐变 -- Shader</title><link>http://www.blogjava.net/oathleo/archive/2011/07/25/354969.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Mon, 25 Jul 2011 03:41:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2011/07/25/354969.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/354969.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2011/07/25/354969.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/354969.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/354969.html</trackback:ping><description><![CDATA[<div><ol start="1"><span style="font-family: Arial, sans-serif, Helvetica, Tahoma; font-size: 12px; line-height: 18px;"><div><p><span style="font-family: mceinline;">大家好，今天和大家分享的是Android中渲染图像和图形的类，这也是我第一次在Linux上写Android程序，呵呵，感觉还不错！</span></p> <p><span style="font-family: mceinline;">切入正题：Shader有几个直接子类：</span></p> <p><span style="font-family: mceinline;">	BitmapShader &nbsp; &nbsp;: 图像渲染</span></p> <p><span style="font-family: mceinline;">	LinearGradient &nbsp;: 线性渐变</span></p> <p><span style="font-family: mceinline;">	RadialGradient &nbsp;: 环形渐变</span></p> <p><span style="font-family: mceinline;">	SweepGradient &nbsp; : 扫描渐变---围绕一个中心点扫描渐变就像电影里那种雷达扫描</span></p> <p><span style="font-family: mceinline;">	ComposeShader &nbsp; : 组合渲染</span></p> <p><span style="font-family: mceinline;">先看效果图：</span></p> <p><span style="font-family: mceinline;"><img src="http://hi.csdn.net/attachment/201101/27/3529054_1296097885S0rY.png" alt="" width="337" height="490" /></span></p> <p><span style="font-family: mceinline;"><br /></span></p> <p><span style="font-family: mceinline;">先保存好你要在</span>BitmapShader中显示的图片.</p> <p>&nbsp;</p> <p><span style="font-family: mceinline;">看代码(代码中带有注释)：</span></p> <p><span style="font-family: mceinline;">我采用的还是SurefaceView框架,</span></p> <p>&nbsp;</p> <p><span style="font-family: monospace; font-size: x-small;"><span style="white-space: pre-wrap;"><div bg_java=""><div><div><a href="http://blog.csdn.net/ldj299/article/details/6166071#" title="view plain"><span style="font-size: 12pt;">view plain</span></a></div></div><ol start="1"><li><span style="font-size: 12pt;">package&nbsp;com.ldj.helloshader;&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">import&nbsp;android.content.Context;&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">import&nbsp;android.graphics.*;&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">import&nbsp;android.graphics.Shader.TileMode;&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">import&nbsp;android.graphics.drawable.BitmapDrawable;&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">import&nbsp;android.graphics.drawable.ShapeDrawable;&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">import&nbsp;android.graphics.drawable.shapes.OvalShape;&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">import&nbsp;android.view.*;&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">public&nbsp;class&nbsp;ShaderView&nbsp;extends&nbsp;SurfaceView&nbsp;implements&nbsp;SurfaceHolder.Callback,Runnable{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">//声明渐变的颜色数组&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">private&nbsp;int[]&nbsp;color&nbsp;=&nbsp;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">new&nbsp;int[]{Color.GREEN,Color.GRAY,Color.MAGENTA,Color.RED,Color.WHITE};&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">private&nbsp;boolean&nbsp;loop&nbsp;=&nbsp;false;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">private&nbsp;SurfaceHolder&nbsp;surfaceHolder;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">private&nbsp;Bitmap&nbsp;bitPic&nbsp;=&nbsp;null;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">int&nbsp;bitPicWidth&nbsp;=&nbsp;0;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">int&nbsp;bitPicHeight&nbsp;=&nbsp;0;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">//声明一个图片渲染&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;BitmapShader&nbsp;bitmapShader&nbsp;=&nbsp;</span><span style="font-size: 12pt;">null;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">//声明一个线性渐变&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;LinearGradient&nbsp;linearGradient&nbsp;=&nbsp;</span><span style="font-size: 12pt;">null;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">//声明一个环形渐变&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;RadialGradient&nbsp;radialGradient&nbsp;=&nbsp;</span><span style="font-size: 12pt;">null;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">//声明一个扫描渐变&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">//-围绕一个中心点扫描渐变就像电影里那种雷达扫描&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;SweepGradient&nbsp;sweepGradient&nbsp;=&nbsp;</span><span style="font-size: 12pt;">null;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">//声明一个组合渲染&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;ComposeShader&nbsp;composeShader&nbsp;=&nbsp;</span><span style="font-size: 12pt;">null;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">//定义画笔&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;Paint&nbsp;paint&nbsp;=&nbsp;</span><span style="font-size: 12pt;">null;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">//利用这个类也可以实现绘制图像的功能&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;ShapeDrawable&nbsp;shapeDrawable&nbsp;=&nbsp;</span><span style="font-size: 12pt;">null;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">public&nbsp;ShaderView(Context&nbsp;context)&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">super(context);&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;surfaceHolder&nbsp;=&nbsp;</span><span style="font-size: 12pt;">this.getHolder();&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">//增加回调&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;surfaceHolder.addCallback(</span><span style="font-size: 12pt;">this);&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loop&nbsp;=&nbsp;</span><span style="font-size: 12pt;">true;&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paint&nbsp;=&nbsp;</span><span style="font-size: 12pt;">new&nbsp;Paint();&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">//获取图像资源&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bitPic&nbsp;=&nbsp;&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((BitmapDrawable)</span><span style="font-size: 12pt;">this.getResources().getDrawable(R.drawable.screenshot))&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getBitmap();&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">//将图片的长和高的值赋给变量&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bitPicWidth&nbsp;=&nbsp;bitPic.getWidth();&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bitPicHeight&nbsp;=&nbsp;bitPic.getHeight();&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">/*&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;~~~BitmapShader(Bitmap,TileMode,TileMode)~~~&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bitmapShader&nbsp;=&nbsp;</span><span style="font-size: 12pt;">new&nbsp;BitmapShader(bitPic,&nbsp;TileMode.REPEAT,&nbsp;TileMode.MIRROR);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">/*&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;~~~LinearGradient(x0,y0,x1,y1,int[Color],float[],TileMode)~~~&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;linearGradient&nbsp;=&nbsp;</span><span style="font-size: 12pt;">new&nbsp;LinearGradient(0,0,100,100,color,null,TileMode.REPEAT);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">/*&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;~~~RadialGradient~~~&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;radialGradient&nbsp;=&nbsp;</span><span style="font-size: 12pt;">new&nbsp;RadialGradient(160,240,66,color,null,TileMode.MIRROR);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">/*&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;~~~SweepGradient~~~&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sweepGradient&nbsp;=&nbsp;</span><span style="font-size: 12pt;">new&nbsp;SweepGradient(100,350,color,null);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">//~~~ComposeShader（shaderA,shaderB,Mode）~~~&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">//组合线性和环形两种渐变,当然其他的也可以的&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;composeShader&nbsp;&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;</span><span style="font-size: 12pt;">new&nbsp;ComposeShader(linearGradient,radialGradient,PorterDuff.Mode.DARKEN);&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">@Override&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">public&nbsp;void&nbsp;run()&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">while(loop)&nbsp;{&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;draw();&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">try&nbsp;{&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(</span><span style="font-size: 12pt;">100);&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="font-size: 12pt;">catch&nbsp;(InterruptedException&nbsp;e)&nbsp;{&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">@Override&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">public&nbsp;void&nbsp;surfaceChanged(SurfaceHolder&nbsp;arg0,&nbsp;int&nbsp;arg1,&nbsp;int&nbsp;arg2,&nbsp;int&nbsp;arg3)&nbsp;{&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">@Override&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">public&nbsp;void&nbsp;surfaceCreated(SurfaceHolder&nbsp;arg0)&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">new&nbsp;Thread(this).start();&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">@Override&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">public&nbsp;void&nbsp;surfaceDestroyed(SurfaceHolder&nbsp;arg0)&nbsp;{&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loop&nbsp;=&nbsp;</span><span style="font-size: 12pt;">false;&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">private&nbsp;void&nbsp;draw()&nbsp;{&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Canvas&nbsp;canvas&nbsp;=&nbsp;surfaceHolder.lockCanvas();&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">/*&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;~~~BitmapShader&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">//构造形状为椭圆的shapeDrawable对象&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shapeDrawable&nbsp;=&nbsp;</span><span style="font-size: 12pt;">new&nbsp;ShapeDrawable(new&nbsp;OvalShape());&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">//设置显示的图片&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shapeDrawable.getPaint().setShader(bitmapShader);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">//设置显示的长和高&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shapeDrawable.setBounds(</span><span style="font-size: 12pt;">0,&nbsp;0,&nbsp;bitPicWidth,&nbsp;bitPicHeight);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">//绘制图像&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shapeDrawable.draw(canvas);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">//~~~LinearGradient~~~&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">//设置画笔的渲染类型&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paint.setShader(linearGradient);&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;canvas.drawRect(</span><span style="font-size: 12pt;">0,&nbsp;bitPicHeight,&nbsp;320,&nbsp;150,&nbsp;paint);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">//~~~RadialGradient~~~&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paint.setShader(radialGradient);&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;canvas.drawCircle(</span><span style="font-size: 12pt;">160,&nbsp;240,&nbsp;66,&nbsp;paint);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">//~~~SweepGradient&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paint.setShader(sweepGradient);&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;canvas.drawCircle(</span><span style="font-size: 12pt;">100,&nbsp;350,&nbsp;66,&nbsp;paint);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-size: 12pt;">//~~~ComposeShader~~~&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paint.setShader(composeShader);&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;canvas.drawRect(bitPicWidth,&nbsp;</span><span style="font-size: 12pt;">320,&nbsp;320,&nbsp;480,&nbsp;paint);&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;surfaceHolder.unlockCanvasAndPost(canvas);&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li><span style="font-size: 12pt;">}&nbsp;&nbsp;</span></li></ol></div><br /></span></span></p> <p>&nbsp;</p> <p>总结：</p> <p>配色弄的不是很好看，大家可别见怪，大体来说渲染图像或图形三步：</p> <p>首先是声明渲染或渐变类。</p> <p>然后将画笔setShader为声明的类。</p> <p>最后绘制的时候用此画笔即可。</p> <p>好了，今天到这里了，谢谢大家阅读。</p></div><br /></span></ol></div><img src ="http://www.blogjava.net/oathleo/aggbug/354969.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2011-07-25 11:41 <a href="http://www.blogjava.net/oathleo/archive/2011/07/25/354969.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>  Paint类常用方法</title><link>http://www.blogjava.net/oathleo/archive/2011/07/25/354961.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Mon, 25 Jul 2011 02:52:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2011/07/25/354961.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/354961.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2011/07/25/354961.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/354961.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/354961.html</trackback:ping><description><![CDATA[<div><p>&nbsp;void&nbsp; setARGB(int a, int r, int g, int b)&nbsp; 设置Paint对象颜色，参数一为alpha透明通道<br /><br />void&nbsp; setAlpha(int a)&nbsp; 设置alpha不透明度，范围为0~255</p> <p>void&nbsp; setAntiAlias(boolean aa)&nbsp; //是否抗锯齿</p> <p>void&nbsp; setColor(int color)&nbsp; //设置颜色，这里Android内部定义的有Color类包含了一些常见颜色定义<br />&nbsp;. <br />void&nbsp; setFakeBoldText(boolean fakeBoldText)&nbsp; //设置伪粗体文本<br />&nbsp;&nbsp;<br />void&nbsp; setLinearText(boolean linearText)&nbsp; //设置线性文本<br />&nbsp;<br />PathEffect&nbsp; setPathEffect(PathEffect effect)&nbsp; //设置路径效果<br />&nbsp;<br />Rasterizer&nbsp; setRasterizer(Rasterizer rasterizer) //设置光栅化<br />&nbsp;<br />Shader&nbsp; setShader(Shader shader)&nbsp; //设置阴影&nbsp;</p> <p>void&nbsp; setTextAlign(Paint.Align align)&nbsp; //设置文本对齐<br /><br />void&nbsp; setTextScaleX(float scaleX)&nbsp; //设置文本缩放倍数，1.0f为原始<br />&nbsp; <br />void&nbsp; setTextSize(float textSize)&nbsp; //设置字体大小<br />&nbsp;<br />Typeface&nbsp; setTypeface(Typeface typeface)&nbsp; //设置字体，Typeface包含了字体的类型，粗细，还有倾斜、颜色等。</p> &nbsp;void&nbsp; setUnderlineText(boolean underlineText)&nbsp; //设置下划线<br /><br /><br /><div>Paint paint = new Paint();<br /> &nbsp;<div id="sina_keyword_ad_area2"><wbr>&nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> paint.setAntiAlias(true);&nbsp;<wbr>&nbsp;<wbr> &nbsp;<wbr> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> //防锯齿<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> paint.setDither(true);&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> //防抖动<br /> &nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> paint.setStyle(Paint.Style.STROKE);&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr>&nbsp;<wbr> //画笔类型 STROKE空心 FILL 实心 </div></div></div><img src ="http://www.blogjava.net/oathleo/aggbug/354961.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2011-07-25 10:52 <a href="http://www.blogjava.net/oathleo/archive/2011/07/25/354961.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SurfaceView 翻转</title><link>http://www.blogjava.net/oathleo/archive/2011/07/21/354787.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Thu, 21 Jul 2011 07:18:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2011/07/21/354787.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/354787.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2011/07/21/354787.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/354787.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/354787.html</trackback:ping><description><![CDATA[触发 <div>&nbsp;android.view.SurfaceHolder.Callback</div><div>1.surfaceDestroyed</div>2.surfaceCreated<br />3.surfaceChanged<img src ="http://www.blogjava.net/oathleo/aggbug/354787.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2011-07-21 15:18 <a href="http://www.blogjava.net/oathleo/archive/2011/07/21/354787.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>android中context</title><link>http://www.blogjava.net/oathleo/archive/2011/07/21/354784.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Thu, 21 Jul 2011 06:57:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2011/07/21/354784.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/354784.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2011/07/21/354784.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/354784.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/354784.html</trackback:ping><description><![CDATA[<div><br />在android中context可以作很多操作，但是最主要的功能是加载和访问资源。在android中有两种context，<br />一种是 application context，一种是activity context，通常我们在各种类和方法间传递的是activity context。<br />比如一个activity的onCreate：<br />protected void onCreate(Bundle state) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super.onCreate(state);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TextView label = new TextView(this); //传递context给view control<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; label.setText("Leaks are bad");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setContentView(label);<br />}<br />把activity context传递给view，意味着view拥有一个指向activity的引用，进而引用activity占有的资源：view hierachy, resource等。<br />这样如果context发生内存泄露的话，就会泄露很多内存。<br />这里泄露的意思是gc没有办法回收activity的内存。<br /><br />Leaking an entire activity是很容易的一件事。<br /><br />当屏幕旋转的时候，系统会销毁当前的activity，保存状态信息，再创建一个新的。<br /><br />比如我们写了一个应用程序，它需要加载一个很大的图片，我们不希望每次旋转屏 幕的时候都销毁这个图片，重新加载。<br />实现这个要求的简单想法就是定义一个静态的Drawable，这样Activity 类创建销毁它始终保存在内存中。<br />实现类似：<br />public class myactivity extends Activity {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private static Drawable sBackground;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; protected void onCreate(Bundle state) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super.onCreate(state);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TextView label = new TextView(this);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; label.setText("Leaks are bad");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (sBackground == null) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sBackground = getDrawable(R.drawable.large_bitmap);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; label.setBackgroundDrawable(sBackground);//drawable attached to a view<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setContentView(label);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />}<br />这段程序看起来很简单，但是却问题很大。当屏幕旋转的时候会有leak（即gc没法销毁activity）。<br />我们刚才说过，屏幕旋转的时候系统会销毁当前的activity。但是当drawable和view关联后，drawable保存了view的 reference，即sBackground保存了label的引用，<br />而label保存了activity的引用。既然drawable不能销毁，它所 引用和间接引用的都不能销毁，这样系统就没有办法销毁当前的activity，于是造成了内存泄露。<br />gc对这种类型的内存泄露是无能为力的。<br /><br />避免这种内存泄露的方法是避免activity中的任何对象的生命周期长过activity，避免由于对象对 activity的引用导致activity不能正常被销毁。<br />我们可以使用application context。application context伴随application的一生，与activity的生命周期无关。<br />application context可以通过Context.getApplicationContext或者Activity.getApplication方法获取。<br /><br />避免context相关的内存泄露，记住以下几点：<br />1. 不要让生命周期长的对象引用activity context，即保证引用activity的对象要与activity本身生命周期是一样的<br />2. 对于生命周期长的对象，可以使用application context<br />3. 避免非静态的内部类，尽量使用静态类，避免生命周期问题，注意内部类对外部对象引用导致的生命周期变化</div><img src ="http://www.blogjava.net/oathleo/aggbug/354784.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2011-07-21 14:57 <a href="http://www.blogjava.net/oathleo/archive/2011/07/21/354784.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android提高第三篇之SurfaceView与多线程的混搭 转载</title><link>http://www.blogjava.net/oathleo/archive/2011/07/21/354758.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Thu, 21 Jul 2011 02:11:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2011/07/21/354758.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/354758.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2011/07/21/354758.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/354758.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/354758.html</trackback:ping><description><![CDATA[<div>http://blog.csdn.net/hellogv/article/details/5986835<br /></div><div>&nbsp; <a href="http://blog.csdn.net/hellogv/archive/2010/11/03/5985090.aspx"><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;">上一篇</span></span></a><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;">简 单介绍了SurfaceView的基本使用，这次就介绍SurfaceView与多线程的混搭。SurfaceView与多线程混搭，是为了防止动画闪烁 而实现的一种多线程应用。android的多线程用法与JAVA的多线程用法完全一样，本文不做多线程方面的介绍了。直接讲解SurfaceView与多 线程的混合使用，即开一条线程专门读取图片，另外一条线程专门绘图。</span></span> <p><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;">本文程序运行截图如下，左边是开单个线程读取并绘图，右边是开两个线程，一个专门读取图片，一个专门绘图：</span></span></p> <p><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;"><img src="http://hi.csdn.net/attachment/201011/4/0_1288839944GqAR.gif" alt="" /></span></span></p> <p><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;">对 比一下，右边动画的帧速明显比左边的快，左右两者都没使用Thread.sleep()。为什么要开两个线程一个读一个画，而不去开两个线程像左边那样都 &#8220;边读边画&#8221;呢？因为SurfaceView每次绘图都会锁定Canvas,也就是说同一片区域这次没画完下次就不能画，<span style="color: #ff0000;">因此要提高动画播放的效率，就得开一条线程专门画图，开另外一条线程做预处理的工作。</span></span></span></p> <p><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;">main.xml的源码：</span></span></p> <p><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;"><div bg_xhtml=""><div><div><a href="http://blog.csdn.net/hellogv/article/details/5986835#" title="view plain">view plain</a></div></div><ol start="1"><li><span>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="utf-8"?&gt;&nbsp;&nbsp;</span></li><li><span>&lt;LinearLayout&nbsp;xmlns:android="http://schemas.android.com/apk/res/android"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>android:layout_width="fill_parent"&nbsp;android:layout_height="fill_parent"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>android:orientation="vertical"&gt;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;LinearLayout&nbsp;android:id="@+id/LinearLayout01"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>android:layout_width="wrap_content"&nbsp;android:layout_height="wrap_content"&gt;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;Button&nbsp;android:id="@+id/Button01"&nbsp;android:layout_width="wrap_content"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>android:layout_height="wrap_content"&nbsp;android:text="单个独立线程"&gt;&lt;/Button&gt;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;Button&nbsp;android:id="@+id/Button02"&nbsp;android:layout_width="wrap_content"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>android:layout_height="wrap_content"&nbsp;android:text="两个独立线程"&gt;&lt;/Button&gt;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;/LinearLayout&gt;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;SurfaceView&nbsp;android:id="@+id/SurfaceView01"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>android:layout_width="fill_parent"&nbsp;android:layout_height="fill_parent"&gt;&lt;/SurfaceView&gt;&nbsp;&nbsp;</span></li><li><span>&lt;/LinearLayout&gt;&nbsp;&nbsp;</span></li></ol></div> </span></span></p> <p><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;">本文程序的源码：</span></span></p> <p><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;">&nbsp;<div bg_java=""><div><div><a href="http://blog.csdn.net/hellogv/article/details/5986835#" title="view plain">view plain</a></div></div><ol start="1"><li><span>package&nbsp;com.testSurfaceView;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;</li><li><span>import&nbsp;java.lang.reflect.Field;&nbsp;&nbsp;</span></li><li><span>import&nbsp;java.util.ArrayList;&nbsp;&nbsp;</span></li><li><span>import&nbsp;android.app.Activity;&nbsp;&nbsp;</span></li><li><span>import&nbsp;android.graphics.Bitmap;&nbsp;&nbsp;</span></li><li><span>import&nbsp;android.graphics.BitmapFactory;&nbsp;&nbsp;</span></li><li><span>import&nbsp;android.graphics.Canvas;&nbsp;&nbsp;</span></li><li><span>import&nbsp;android.graphics.Paint;&nbsp;&nbsp;</span></li><li><span>import&nbsp;android.graphics.Rect;&nbsp;&nbsp;</span></li><li><span>import&nbsp;android.os.Bundle;&nbsp;&nbsp;</span></li><li><span>import&nbsp;android.util.Log;&nbsp;&nbsp;</span></li><li><span>import&nbsp;android.view.SurfaceHolder;&nbsp;&nbsp;</span></li><li><span>import&nbsp;android.view.SurfaceView;&nbsp;&nbsp;</span></li><li><span>import&nbsp;android.view.View;&nbsp;&nbsp;</span></li><li><span>import&nbsp;android.widget.Button;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;</li><li><span>public&nbsp;class&nbsp;testSurfaceView&nbsp;extends&nbsp;Activity&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>/**&nbsp;Called&nbsp;when&nbsp;the&nbsp;activity&nbsp;is&nbsp;first&nbsp;created.&nbsp;*/&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;Button&nbsp;btnSingleThread,&nbsp;btnDoubleThread;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;SurfaceView&nbsp;sfv;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;SurfaceHolder&nbsp;sfh;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;ArrayList&lt;Integer&gt;&nbsp;imgList&nbsp;=&nbsp;<span>new&nbsp;ArrayList&lt;Integer&gt;();&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>int&nbsp;imgWidth,&nbsp;imgHeight;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;Bitmap&nbsp;bitmap;<span>//独立线程读取，独立线程绘图&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>@Override&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;void&nbsp;onCreate(Bundle&nbsp;savedInstanceState)&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>super.onCreate(savedInstanceState);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setContentView(R.layout.main);&nbsp;&nbsp;</li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;btnSingleThread&nbsp;=&nbsp;(Button)&nbsp;<span>this.findViewById(R.id.Button01);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;btnDoubleThread&nbsp;=&nbsp;(Button)&nbsp;<span>this.findViewById(R.id.Button02);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;btnSingleThread.setOnClickListener(<span>new&nbsp;ClickEvent());&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;btnDoubleThread.setOnClickListener(<span>new&nbsp;ClickEvent());&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sfv&nbsp;=&nbsp;(SurfaceView)&nbsp;<span>this.findViewById(R.id.SurfaceView01);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sfh&nbsp;=&nbsp;sfv.getHolder();&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sfh.addCallback(<span>new&nbsp;MyCallBack());//&nbsp;自动运行surfaceCreated以及surfaceChanged&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>class&nbsp;ClickEvent&nbsp;implements&nbsp;View.OnClickListener&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>@Override&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;void&nbsp;onClick(View&nbsp;v)&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>if&nbsp;(v&nbsp;==&nbsp;btnSingleThread)&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>new&nbsp;Load_DrawImage(0,&nbsp;0).start();//开一条线程读取并绘图&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span>else&nbsp;if&nbsp;(v&nbsp;==&nbsp;btnDoubleThread)&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>new&nbsp;LoadImage().start();//开一条线程读取&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>new&nbsp;DrawImage(imgWidth&nbsp;+&nbsp;10,&nbsp;0).start();//开一条线程绘图&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>class&nbsp;MyCallBack&nbsp;implements&nbsp;SurfaceHolder.Callback&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>@Override&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;void&nbsp;surfaceChanged(SurfaceHolder&nbsp;holder,&nbsp;int&nbsp;format,&nbsp;int&nbsp;width,&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>int&nbsp;height)&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.i(<span>"Surface:",&nbsp;"Change");&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>@Override&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;void&nbsp;surfaceCreated(SurfaceHolder&nbsp;holder)&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.i(<span>"Surface:",&nbsp;"Create");&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>//&nbsp;用反射机制来获取资源中的图片ID和尺寸&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field[]&nbsp;fields&nbsp;=&nbsp;R.drawable.<span>class.getDeclaredFields();&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>for&nbsp;(Field&nbsp;field&nbsp;:&nbsp;fields)&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>if&nbsp;(!"icon".equals(field.getName()))//&nbsp;除了icon之外的图片&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>int&nbsp;index&nbsp;=&nbsp;0;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>try&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;index&nbsp;=&nbsp;field.getInt(R.drawable.<span>class);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span>catch&nbsp;(IllegalArgumentException&nbsp;e)&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>//&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span>catch&nbsp;(IllegalAccessException&nbsp;e)&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>//&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>//&nbsp;保存图片ID&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imgList.add(index);&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>//&nbsp;取得图像大小&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bitmap&nbsp;bmImg&nbsp;=&nbsp;BitmapFactory.decodeResource(getResources(),&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imgList.get(<span>0));&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imgWidth&nbsp;=&nbsp;bmImg.getWidth();&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imgHeight&nbsp;=&nbsp;bmImg.getHeight();&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>@Override&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;void&nbsp;surfaceDestroyed(SurfaceHolder&nbsp;holder)&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.i(<span>"Surface:",&nbsp;"Destroy");&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>/*&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;读取并显示图片的线程&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>class&nbsp;Load_DrawImage&nbsp;extends&nbsp;Thread&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>int&nbsp;x,&nbsp;y;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>int&nbsp;imgIndex&nbsp;=&nbsp;0;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;Load_DrawImage(int&nbsp;x,&nbsp;int&nbsp;y)&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>this.x&nbsp;=&nbsp;x;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>this.y&nbsp;=&nbsp;y;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;void&nbsp;run()&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>while&nbsp;(true)&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Canvas&nbsp;c&nbsp;=&nbsp;sfh.lockCanvas(<span>new&nbsp;Rect(this.x,&nbsp;this.y,&nbsp;this.x&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;imgWidth,&nbsp;<span>this.y&nbsp;+&nbsp;imgHeight));&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bitmap&nbsp;bmImg&nbsp;=&nbsp;BitmapFactory.decodeResource(getResources(),&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imgList.get(imgIndex));&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.drawBitmap(bmImg,&nbsp;<span>this.x,&nbsp;this.y,&nbsp;new&nbsp;Paint());&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imgIndex++;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>if&nbsp;(imgIndex&nbsp;==&nbsp;imgList.size())&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imgIndex&nbsp;=&nbsp;<span>0;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sfh.unlockCanvasAndPost(c);<span>//&nbsp;更新屏幕显示内容&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;&nbsp;</li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>/*&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;只负责绘图的线程&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>class&nbsp;DrawImage&nbsp;extends&nbsp;Thread&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>int&nbsp;x,&nbsp;y;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;DrawImage(int&nbsp;x,&nbsp;int&nbsp;y)&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>this.x&nbsp;=&nbsp;x;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>this.y&nbsp;=&nbsp;y;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;void&nbsp;run()&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>while&nbsp;(true)&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>if&nbsp;(bitmap&nbsp;!=&nbsp;null)&nbsp;{//如果图像有效&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Canvas&nbsp;c&nbsp;=&nbsp;sfh.lockCanvas(<span>new&nbsp;Rect(this.x,&nbsp;this.y,&nbsp;this.x&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;imgWidth,&nbsp;<span>this.y&nbsp;+&nbsp;imgHeight));&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.drawBitmap(bitmap,&nbsp;<span>this.x,&nbsp;this.y,&nbsp;new&nbsp;Paint());&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sfh.unlockCanvasAndPost(c);<span>//&nbsp;更新屏幕显示内容&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;&nbsp;</li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>/*&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;只负责读取图片的线程&nbsp;</span></li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>class&nbsp;LoadImage&nbsp;extends&nbsp;Thread&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>int&nbsp;imgIndex&nbsp;=&nbsp;0;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;void&nbsp;run()&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>while&nbsp;(true)&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bitmap&nbsp;=&nbsp;BitmapFactory.decodeResource(getResources(),&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imgList.get(imgIndex));&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imgIndex++;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>if&nbsp;(imgIndex&nbsp;==&nbsp;imgList.size())//如果到尽头则重新读取&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imgIndex&nbsp;=&nbsp;<span>0;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;&nbsp;</li><li>}&nbsp;&nbsp;</li></ol></div> </span></span></p><br /> </div><img src ="http://www.blogjava.net/oathleo/aggbug/354758.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2011-07-21 10:11 <a href="http://www.blogjava.net/oathleo/archive/2011/07/21/354758.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android提高第五篇之Service 转载</title><link>http://www.blogjava.net/oathleo/archive/2011/07/21/354757.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Thu, 21 Jul 2011 02:10:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2011/07/21/354757.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/354757.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2011/07/21/354757.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/354757.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/354757.html</trackback:ping><description><![CDATA[<div>     <h3>         <a href="http://blog.csdn.net/hellogv/article/details/5994952" title="Android提高第五篇之Service">Android提高第五篇之Service</a>              </h3>                <div>             <span>             分类：                 <a href="http://blog.csdn.net/hellogv/article/category/761980">Android提高</a>              </span>         2010-11-08 11:48         <span title="阅读次数">5360人阅读</span>         <span title="评论次数"><a href="http://blog.csdn.net/hellogv/article/details/5994952#comments">评论</a>(11)</span>         <a>收藏</a>         <a>举报</a>      </div>       <div>     <p><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;">本文来自</span></span><a style="font-family: " href="http://blog.csdn.net/hellogv/"><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;"><span style="font-family: comic sans ms,sans-serif;">http://blog.csdn.net/hellogv/</span></span></span></a><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;"><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;"> ，引用必须注明出处！</span></span></span></span></p> <p style="font-family: "><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;"><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上次介绍了</span></span><a style="font-family: " href="http://blog.csdn.net/hellogv/archive/2010/11/06/5992198.aspx"><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;">Activity以及Intent的使用</span></span></a><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;">， 这次就介绍Service，如果把Activity比喻为前台程序，那么Service就是后台程序，Service的整个生命周期都只会在后台执行。 Service跟Activity一样也由Intent调用。在工程里想要添加一个Service，先新建继承Service的类，然后到 AndroidManifest.xml -&gt; Application -&gt;Application  Nodes中的Service标签中添加。</span></span></span></span></p> <p style="font-family: "><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;"><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Service要由Activity通过startService 或者 bindService来启动，Intent负责传递参数。先贴出本文程序运行截图：</span></span></span></span></p> <p style="font-family: "><span style="font-family: comic sans ms,sans-serif;"></span>&nbsp;</p> <p style="text-align: center; font-family: "><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;"><img src="http://hi.csdn.net/attachment/201011/8/0_1289187061hq8H.gif" alt="" /></span></span></p> <p style="text-align: left; font-family: "><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;">本文主要讲解Service的调用，以及其生命周期。</span></span></p> <p style="text-align: left; font-family: "><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;"><img src="http://hi.csdn.net/attachment/201011/8/0_1289187163Ls3L.gif" alt="" /></span></span></p> <p style="text-align: left; font-family: "><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;">上图是startService之后再stopService的Service状态变化。</span></span></p> <p style="text-align: left; font-family: "><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;"><img src="http://hi.csdn.net/attachment/201011/8/0_1289187315xRDc.gif" alt="" /></span></span></p> <p style="text-align: left; font-family: "><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;">上图是bindService之后再unbindService的Service状态变化。</span></span></p> <p><span style="font-family: Comic Sans MS; font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; startService与bindService都可以启动Service，那么它们之间有什么区别呢？它们两者的区别就是使Service的周期改变。<span style="color: #ff0000;">由 startService启动的Service必须要有stopService来结束Service，不调用stopService则会造成 Activity结束了而Service还运行着。bindService启动的Service可以由unbindService来结束，也可以在 Activity结束之后(onDestroy)自动结束。</span></span></p> <p><img src="http://hi.csdn.net/attachment/201011/8/0_1289187762x0OU.gif" alt="" /></p> <p style="text-align: left; font-family: ">&nbsp;<span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;">上图是startService之后再Activity.finish()的Service状态变化，Service还在跑着。</span></span></p> <p style="text-align: left; font-family: "><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;"><img src="http://hi.csdn.net/attachment/201011/8/0_1289187846oAFa.gif" alt="" /></span></span></p> <p style="text-align: left; font-family: "><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;"><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;">上图是bindService之后再Activity.finish()的Service状态变化，Service最后自动unbindService。</span></span></span></span></p> <p style="text-align: left; font-family: "><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;"><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;">main.xml代码：</span></span></span></span></p> <p style="text-align: left; font-family: "><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;"><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;"><div bg_xhtml=""><div><div><a href="http://blog.csdn.net/hellogv/article/details/5994952#" title="view plain">view plain</a></div></div><ol start="1"><li><span>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="utf-8"?&gt;&nbsp;&nbsp;</span></li><li><span>&lt;LinearLayout&nbsp;xmlns:android="http://schemas.android.com/apk/res/android"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>android:orientation="vertical"&nbsp;android:layout_width="fill_parent"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>android:layout_height="fill_parent"&gt;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;Button&nbsp;android:layout_width="wrap_content"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>android:layout_height="wrap_content"&nbsp;android:id="@+id/btnStartMyService"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>android:text="StartMyService"&gt;&lt;/Button&gt;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;Button&nbsp;android:layout_width="wrap_content"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>android:layout_height="wrap_content"&nbsp;android:id="@+id/btnStopMyService"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>android:text="StopMyService"&gt;&lt;/Button&gt;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;Button&nbsp;android:layout_width="wrap_content"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>android:layout_height="wrap_content"&nbsp;android:id="@+id/btnBindMyService"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>android:text="BindMyService"&gt;&lt;/Button&gt;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;Button&nbsp;android:layout_width="wrap_content"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>android:layout_height="wrap_content"&nbsp;android:id="@+id/btnUnbindMyService"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>android:text="UnbindMyService"&gt;&lt;/Button&gt;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;Button&nbsp;android:layout_width="wrap_content"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>android:layout_height="wrap_content"&nbsp;android:id="@+id/btnExit"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>android:text="退出程序"&gt;&lt;/Button&gt;&nbsp;&nbsp;</span></li><li><span>&lt;/LinearLayout&gt;&nbsp;&nbsp;</span></li></ol></div> </span></span></span></span></p> <p style="text-align: left; font-family: "><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;"><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;">testService.java的源码：</span></span></span></span></p> <p style="text-align: left; font-family: "><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;"><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;"><div bg_java=""><div><div><a href="http://blog.csdn.net/hellogv/article/details/5994952#" title="view plain">view plain</a></div></div><ol start="1"><li><span>package&nbsp;com.testService;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;</li><li><span>import&nbsp;android.app.Activity;&nbsp;&nbsp;</span></li><li><span>import&nbsp;android.app.Service;&nbsp;&nbsp;</span></li><li><span>import&nbsp;android.content.ComponentName;&nbsp;&nbsp;</span></li><li><span>import&nbsp;android.content.Intent;&nbsp;&nbsp;</span></li><li><span>import&nbsp;android.content.ServiceConnection;&nbsp;&nbsp;</span></li><li><span>import&nbsp;android.os.Bundle;&nbsp;&nbsp;</span></li><li><span>import&nbsp;android.os.IBinder;&nbsp;&nbsp;</span></li><li><span>import&nbsp;android.util.Log;&nbsp;&nbsp;</span></li><li><span>import&nbsp;android.view.View;&nbsp;&nbsp;</span></li><li><span>import&nbsp;android.widget.Button;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;</li><li><span>public&nbsp;class&nbsp;testService&nbsp;extends&nbsp;Activity&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;Button&nbsp;btnStartMyService,btnStopMyService,btnBindMyService,btnUnbindMyService,btnExit;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>@Override&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;void&nbsp;onCreate(Bundle&nbsp;savedInstanceState)&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>super.onCreate(savedInstanceState);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setContentView(R.layout.main);&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;btnStartMyService=(Button)<span>this.findViewById(R.id.btnStartMyService);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;btnStartMyService.setOnClickListener(<span>new&nbsp;ClickEvent());&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;btnStopMyService=(Button)<span>this.findViewById(R.id.btnStopMyService);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;btnStopMyService.setOnClickListener(<span>new&nbsp;ClickEvent());&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;btnBindMyService=(Button)<span>this.findViewById(R.id.btnBindMyService);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;btnBindMyService.setOnClickListener(<span>new&nbsp;ClickEvent());&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;btnUnbindMyService=(Button)<span>this.findViewById(R.id.btnUnbindMyService);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;btnUnbindMyService.setOnClickListener(<span>new&nbsp;ClickEvent());&nbsp;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;btnExit=(Button)<span>this.findViewById(R.id.btnExit);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;btnExit.setOnClickListener(<span>new&nbsp;ClickEvent());&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>@Override&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;void&nbsp;onDestroy()&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>super.onDestroy();&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.e(<span>"Activity","onDestroy");&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>private&nbsp;ServiceConnection&nbsp;_connection&nbsp;=&nbsp;new&nbsp;ServiceConnection()&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>@Override&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;void&nbsp;onServiceConnected(ComponentName&nbsp;arg0,&nbsp;IBinder&nbsp;arg1)&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>//&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>@Override&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;void&nbsp;onServiceDisconnected(ComponentName&nbsp;name)&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>//&nbsp;TODO&nbsp;Auto-generated&nbsp;method&nbsp;stub&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;};&nbsp;&nbsp;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>class&nbsp;ClickEvent&nbsp;implements&nbsp;View.OnClickListener{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>@Override&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;void&nbsp;onClick(View&nbsp;v)&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Intent&nbsp;intent=<span>new&nbsp;Intent(testService.this,MyService.class);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>if(v==btnStartMyService){&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;testService.<span>this.startService(intent);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>else&nbsp;if(v==btnStopMyService){&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;testService.<span>this.stopService(intent);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>else&nbsp;if(v==btnBindMyService){&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;testService.<span>this.bindService(intent,&nbsp;_connection,&nbsp;Service.BIND_AUTO_CREATE);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>else&nbsp;if(v==btnUnbindMyService){&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>if(MyService.ServiceState=="onBind")//Service绑定了之后才能解绑&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;testService.<span>this.unbindService(_connection);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>else&nbsp;if(v==btnExit)&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;testService.<span>this.finish();&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>}&nbsp;&nbsp;</li></ol></div> </span></span></span></span></p> <p style="text-align: left; font-family: "><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;"><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;">MyService.java的源码：</span></span></span></span></p> <p style="text-align: left; font-family: "><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;"><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;"><div bg_java=""><div><div><a href="http://blog.csdn.net/hellogv/article/details/5994952#" title="view plain">view plain</a></div></div><ol start="1"><li><span>package&nbsp;com.testService;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;</li><li><span>import&nbsp;android.app.Service;&nbsp;&nbsp;</span></li><li><span>import&nbsp;android.content.Intent;&nbsp;&nbsp;</span></li><li><span>import&nbsp;android.os.IBinder;&nbsp;&nbsp;</span></li><li><span>import&nbsp;android.util.Log;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;</li><li><span>public&nbsp;class&nbsp;MyService&nbsp;extends&nbsp;Service&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>static&nbsp;public&nbsp;String&nbsp;ServiceState="";&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>@Override&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;IBinder&nbsp;onBind(Intent&nbsp;arg0)&nbsp;{&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.e(<span>"Service",&nbsp;"onBind");&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServiceState=<span>"onBind";&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>return&nbsp;null;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>@Override&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;boolean&nbsp;onUnbind(Intent&nbsp;intent){&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>super.onUnbind(intent);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.e(<span>"Service",&nbsp;"onUnbind");&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServiceState=<span>"onUnbind";&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>return&nbsp;false;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>@Override&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;void&nbsp;onCreate(){&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>super.onCreate();&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.e(<span>"Service",&nbsp;"onCreate");&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServiceState=<span>"onCreate";&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>@Override&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;void&nbsp;onDestroy(){&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>super.onDestroy();&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.e(<span>"Service",&nbsp;"onDestroy");&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServiceState=<span>"onDestroy";&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>@Override&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>public&nbsp;void&nbsp;onStart(Intent&nbsp;intent,int&nbsp;startid){&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>super.onStart(intent,&nbsp;startid);&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Log.e(<span>"Service",&nbsp;"onStart");&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServiceState=<span>"onStart";&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</li><li>&nbsp;&nbsp;</li><li>}&nbsp;&nbsp;</li></ol></div> </span></span></span></span></p> </div> <br /> </div><img src ="http://www.blogjava.net/oathleo/aggbug/354757.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2011-07-21 10:10 <a href="http://www.blogjava.net/oathleo/archive/2011/07/21/354757.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android入门第十六篇之Style与Theme 转载</title><link>http://www.blogjava.net/oathleo/archive/2011/07/21/354756.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Thu, 21 Jul 2011 02:04:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2011/07/21/354756.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/354756.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2011/07/21/354756.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/354756.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/354756.html</trackback:ping><description><![CDATA[<div>     <h3>         <a href="http://blog.csdn.net/hellogv/article/details/6128594" title="Android入门第十六篇之Style与Theme">Android入门第十六篇之Style与Theme</a>              </h3>                <div>             <span>             分类：                 <a href="http://blog.csdn.net/hellogv/article/category/588885">Android入门</a>              </span>         2011-01-11 11:16         <span title="阅读次数">10361人阅读</span>         <span title="评论次数"><a href="http://blog.csdn.net/hellogv/article/details/6128594#comments">评论</a>(28)</span>         <a>收藏</a>         <a>举报</a>      </div>       <div>     <p><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;">&nbsp;本文来自</span></span><a style="font-family: " href="http://blog.csdn.net/hellogv/"><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;">http://blog.csdn.net/hellogv/</span></span></a><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;"> ，引用必须注明出处！</span></span></p> <p style="font-family: "><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 越来越多互联网企业都在Android平台上部署其客户端，为了提升用户体验，这些客户端都做得布局合理而且美观.......Android的Style设计就是提升用户体验的关键之一。Android上的Style分为了两个方面：</span></span></p> <ol><li> <div style="font-family: "><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;">Theme是针对窗体级别的，改变窗体样式；</span></span></div> </li><li> <div style="font-family: "><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;">Style是针对窗体元素级别的，改变指定控件或者Layout的样式。</span></span></div> </li></ol> <p style="font-family: "><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;">Android 系统的themes.xml和style.xml(位于/base/core/res/res/values/)包含了很多系统定义好的style，建议 在里面挑个合适的，然后再继承修改。以下属性是在Themes中比较常见的，源自Android系统本身的themes.xml：</span></span></p> <p style="font-family: "><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;"><div bg_xhtml=""><div><div><a href="http://blog.csdn.net/hellogv/article/details/6128594#" title="view plain">view plain</a></div></div><ol start="1"><li><span>&lt;!--&nbsp;Window&nbsp;attributes&nbsp;--&gt;&nbsp;&nbsp;</span></li><li><span>&lt;item&nbsp;name="windowBackground"&gt;@android:drawable/screen_background_dark&lt;/item&gt;&nbsp;&nbsp;</span></li><li><span>&lt;item&nbsp;name="windowFrame"&gt;@null&lt;/item&gt;&nbsp;&nbsp;</span></li><li><span>&lt;item&nbsp;name="windowNoTitle"&gt;false&lt;/item&gt;&nbsp;&nbsp;</span></li><li><span>&lt;item&nbsp;name="windowFullscreen"&gt;false&lt;/item&gt;&nbsp;&nbsp;</span></li><li><span>&lt;item&nbsp;name="windowIsFloating"&gt;false&lt;/item&gt;&nbsp;&nbsp;</span></li><li><span>&lt;item&nbsp;name="windowContentOverlay"&gt;@android:drawable/title_bar_shadow&lt;/item&gt;&nbsp;&nbsp;</span></li><li><span>&lt;item&nbsp;name="windowTitleStyle"&gt;@android:style/WindowTitle&lt;/item&gt;&nbsp;&nbsp;</span></li><li><span>&lt;item&nbsp;name="windowTitleSize"&gt;25dip&lt;/item&gt;&nbsp;&nbsp;</span></li><li><span>&lt;item&nbsp;name="windowTitleBackgroundStyle"&gt;@android:style/WindowTitleBackground&lt;/item&gt;&nbsp;&nbsp;</span></li><li><span>&lt;item&nbsp;name="android:windowAnimationStyle"&gt;@android:style/Animation.Activity&lt;/item&gt;&nbsp;&nbsp;</span></li></ol></div> </span></span></p> <p style="font-family: "><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;">至于控件的Style设计就范围大多了，<strong>看看Eclipse的Android控件属性编辑器[Properties]就大概知道有哪些条目</strong>， 而Android内置的style.xml也只是定义每个控件的默认样式而已....不过控件的style不建议大改，耐看的style更能让用户长时间 使用软件。另外，控件的Style在很多情况下都用到9.png，学习9.png就必须到/base/core/res/res/drawable- hdpi里面看看，里面有很多系统内置的9.png。</span></span></p> <p style="font-family: "><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;"><span style="color: #ff0000;">PS:为了研究Android的Style和Theme，强烈建议下载Android的base.git！</span></span></span></p> <p> </p><p style="font-family: "><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;">接下来看看本文程序的效果图：</span></span></p> <p style="text-align: center; font-family: "><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;"><img src="http://hi.csdn.net/attachment/201101/11/0_1294713950Y5Yu.gif" alt="" /></span></span></p> <p style="text-align: left; font-family: "><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;">本文程序的themes.xml代码如下，自定义了WindowTitle,：</span></span></p> <p style="text-align: left; font-family: ">&nbsp;</p> <p style="text-align: left; font-family: ">&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;resources&gt;<br />&nbsp;&lt;!--继承Android内置的Theme.Light，位于/base/core/res/res/values/themes.xml --&gt;<br />&nbsp;&lt;style name="Theme" parent="android:Theme.Light"&gt;<br />&nbsp;&nbsp;&lt;item name="android:windowFullscreen"&gt;true&lt;/item&gt;<br />&nbsp;&nbsp;&lt;item name="android:windowTitleSize"&gt;60dip&lt;/item&gt;<br />&nbsp;&nbsp;&lt;item name="android:windowTitleStyle"&gt;@style/WindowTitle&lt;/item&gt;<br />&nbsp;&lt;/style&gt;</p> <p style="text-align: left; font-family: ">&nbsp;&lt;style name="WindowTitle" parent="android:WindowTitle"&gt;<br />&nbsp;&nbsp;&lt;item name="android:singleLine"&gt;true&lt;/item&gt;<br />&nbsp;&nbsp;&lt;item name="android:shadowColor"&gt;#BB000000&lt;/item&gt;<br />&nbsp;&nbsp;&lt;item name="android:shadowRadius"&gt;2.75&lt;/item&gt;<br />&nbsp;&lt;/style&gt;<br />&lt;/resources&gt;</p> <p style="text-align: left; font-family: ">&nbsp;</p>  <p style="text-align: left; font-family: ">&nbsp;</p>  <p> </p><p style="text-align: left; font-family: "><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;">要为Activity使用theme，要么使用代码 setTheme(R.style.Theme)，要么在Application Manifest里面设置<img src="http://hi.csdn.net/attachment/201101/11/0_1294715580UPzt.gif" alt="" />。</span></span></p> <p style="text-align: left; font-family: "><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;">本文程序的styles.xml代码如下,background默认使用的是9.png,xml定义在/base/core/res/res/drawable/之下：</span></span></p>  <p>&nbsp;</p> <p style="text-align: left; font-family: ">&nbsp;</p> <p style="text-align: left; font-family: ">&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />&lt;resources&gt;<br />&nbsp;&lt;style name="TextView"&gt;<br />&nbsp;&nbsp;&lt;item name="android:textSize"&gt;18sp&lt;/item&gt;<br />&nbsp;&nbsp;&lt;item name="android:textColor"&gt;#008&lt;/item&gt;<br />&nbsp;&nbsp;&lt;item name="android:shadowColor"&gt;@android:color/black&lt;/item&gt;<br />&nbsp;&nbsp;&lt;item name="android:shadowRadius"&gt;2.0&lt;/item&gt;<br />&nbsp;&lt;/style&gt;</p> <p style="text-align: left; font-family: ">&nbsp;&lt;style name="EditText"&gt;<br />&nbsp;&nbsp;&lt;item name="android:shadowColor"&gt;@android:color/black&lt;/item&gt;<br />&nbsp;&nbsp;&lt;item name="android:shadowRadius"&gt;1.0&lt;/item&gt;<br />&nbsp;&nbsp;&lt;item name="android:background"&gt;@android:drawable/btn_default&lt;/item&gt;<br />&nbsp;&nbsp;&lt;item name="android:textAppearance"&gt;?android:attr/textAppearanceMedium&lt;/item&gt;<br />&nbsp;&lt;/style&gt;</p> <p style="text-align: left; font-family: ">&nbsp;&nbsp;&nbsp; &lt;style name="Button"&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;item name="android:background"&gt;@android:drawable/edit_text&lt;/item&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;item name="android:textAppearance"&gt;?android:attr/textAppearanceMedium&lt;/item&gt;<br />&nbsp;&nbsp;&nbsp; &lt;/style&gt;<br />&lt;/resources&gt;</p> <p style="text-align: left; font-family: ">&nbsp;</p> <p style="text-align: left; font-family: "><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;">main.xml代码如下：</span></span></p> <p style="text-align: left; font-family: "><span style="font-family: comic sans ms,sans-serif;"><span style="font-size: medium;"><div bg_xhtml=""><div><div><a href="http://blog.csdn.net/hellogv/article/details/6128594#" title="view plain">view plain</a></div></div><ol start="1"><li><span>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="utf-8"?&gt;&nbsp;&nbsp;</span></li><li><span>&lt;LinearLayout&nbsp;xmlns:android="http://schemas.android.com/apk/res/android"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>android:orientation="vertical"&nbsp;android:layout_width="fill_parent"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>android:layout_height="fill_parent"&gt;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;TextView&nbsp;android:layout_width="fill_parent"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>android:layout_height="wrap_content"&nbsp;android:text="@string/hello"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>style="@style/TextView"&nbsp;/&gt;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;EditText&nbsp;android:id="@+id/EditText01"&nbsp;android:layout_height="wrap_content"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>style="@style/EditText"&nbsp;android:layout_width="fill_parent"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>android:text="类似Button的EditText"&gt;&lt;/EditText&gt;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;EditText&nbsp;android:id="@+id/EditText02"&nbsp;android:layout_height="wrap_content"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>android:layout_width="fill_parent"&nbsp;android:text="普通的EditText"&gt;&lt;/EditText&gt;&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;<span>&lt;Button&nbsp;android:id="@+id/Button01"&nbsp;android:layout_height="wrap_content"&nbsp;&nbsp;</span></li><li>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>style="@style/Button"&nbsp;android:layout_width="fill_parent"&nbsp;android:text="类似EditText的Button"&gt;&lt;/Button&gt;&nbsp;&nbsp;</span></li><li><span>&lt;/LinearLayout&gt;&nbsp;&nbsp;</span></li></ol></div> </span></span></p> </div> <br /> </div><img src ="http://www.blogjava.net/oathleo/aggbug/354756.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2011-07-21 10:04 <a href="http://www.blogjava.net/oathleo/archive/2011/07/21/354756.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>android中使用2D动画 — SurfaceView 转载</title><link>http://www.blogjava.net/oathleo/archive/2011/07/21/354755.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Thu, 21 Jul 2011 01:45:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2011/07/21/354755.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/354755.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2011/07/21/354755.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/354755.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/354755.html</trackback:ping><description><![CDATA[<div><h1>	<a href="http://www.android777.com/index.php/tutorial/android-graphics/use-of-2d-animation-surfaceview.html" title="Permalink to android中使用2D动画 &#8212; SurfaceView" rel="bookmark">android中使用2D动画 &#8212; SurfaceView</a> 	</h1>  			        <div> <span meta-prep-author="">Posted on</span> <a href="http://www.android777.com/index.php/tutorial/android-graphics/use-of-2d-animation-surfaceview.html" title="13:44" rel="bookmark">2011 年 04 月 25 日</a> by <span vcard=""><a fn="" n="" href="http://www.android777.com/index.php/author/mr-cai" title="View all posts by Mr.Cai">Mr.Cai</a></span>         </div>  			 			    <p>&nbsp;</p> <p>通过之前介绍的如何<a title="自定义View对象" href="http://www.android777.com/index.php/tutorial/android-view/custom-view-objects-2.html" target="_blank">自定义View</a>， 我们知道使用它可以做一些简单的动画效果。它通过不断循环的执行View.onDraw方法，每次执行都对内部显示的图形做一些调整，我们假设 onDraw方法每秒执行20次，这样就会形成一个20帧的补间动画效果。但是现实情况是你无法简单的控制View.onDraw的执行帧数，这边说的执 行帧数是指每秒View.onDraw方法被执行多少次，这是为什么呢？首先我们知道，onDraw方法是由系统帮我们调用的，我们是通过调用View的 invalidate方法通知系统需要重新绘制View，然后它就会调用View.onDraw方法。这些都是由系统帮我们实现的，所以我们很难精确去定 义View.onDraw的执行帧数，这个就是为什么我们这边要了解SurfaceView了，它能弥补View的一些不足。</p> <p>首先我们先写一个自定义View实现动画效果，AnimateViewActivity.java：</p> <div><div id="highlighter_527409" java=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0="" alt2="">1</div><div number2="" index1="" alt1="">2</div><div number3="" index2="" alt2="">3</div><div number4="" index3="" alt1="">4</div><div number5="" index4="" alt2="">5</div><div number6="" index5="" alt1="">6</div><div number7="" index6="" alt2="">7</div><div number8="" index7="" alt1="">8</div><div number9="" index8="" alt2="">9</div><div number10="" index9="" alt1="">10</div><div number11="" index10="" alt2="">11</div><div number12="" index11="" alt1="">12</div><div number13="" index12="" alt2="">13</div><div number14="" index13="" alt1="">14</div><div number15="" index14="" alt2="">15</div><div number16="" index15="" alt1="">16</div><div number17="" index16="" alt2="">17</div><div number18="" index17="" alt1="">18</div><div number19="" index18="" alt2="">19</div><div number20="" index19="" alt1="">20</div><div number21="" index20="" alt2="">21</div><div number22="" index21="" alt1="">22</div><div number23="" index22="" alt2="">23</div><div number24="" index23="" alt1="">24</div><div number25="" index24="" alt2="">25</div><div number26="" index25="" alt1="">26</div><div number27="" index26="" alt2="">27</div><div number28="" index27="" alt1="">28</div><div number29="" index28="" alt2="">29</div><div number30="" index29="" alt1="">30</div><div number31="" index30="" alt2="">31</div><div number32="" index31="" alt1="">32</div><div number33="" index32="" alt2="">33</div><div number34="" index33="" alt1="">34</div><div number35="" index34="" alt2="">35</div><div number36="" index35="" alt1="">36</div><div number37="" index36="" alt2="">37</div><div number38="" index37="" alt1="">38</div><div number39="" index38="" alt2="">39</div><div number40="" index39="" alt1="">40</div><div number41="" index40="" alt2="">41</div><div number42="" index41="" alt1="">42</div><div number43="" index42="" alt2="">43</div><div number44="" index43="" alt1="">44</div><div number45="" index44="" alt2="">45</div><div number46="" index45="" alt1="">46</div><div number47="" index46="" alt2="">47</div><div number48="" index47="" alt1="">48</div></td><td><div><div number1="" index0="" alt2=""><code keyword="">package</code> <code plain="">com.android777.demo.uicontroller.graphics;</code></div><div number2="" index1="" alt1="">&nbsp;</div><div number3="" index2="" alt2=""><code keyword="">import</code> <code plain="">android.app.Activity;</code></div><div number4="" index3="" alt1=""><code keyword="">import</code> <code plain="">android.content.Context;</code></div><div number5="" index4="" alt2=""><code keyword="">import</code> <code plain="">android.graphics.Canvas;</code></div><div number6="" index5="" alt1=""><code keyword="">import</code> <code plain="">android.graphics.Color;</code></div><div number7="" index6="" alt2=""><code keyword="">import</code> <code plain="">android.graphics.Paint;</code></div><div number8="" index7="" alt1=""><code keyword="">import</code> <code plain="">android.os.Bundle;</code></div><div number9="" index8="" alt2=""><code keyword="">import</code> <code plain="">android.view.View;</code></div><div number10="" index9="" alt1="">&nbsp;</div><div number11="" index10="" alt2=""><code keyword="">public</code> <code keyword="">class</code> <code plain="">AnimateViewActivity </code><code keyword="">extends</code> <code plain="">Activity {</code></div><div number12="" index11="" alt1="">&nbsp;</div><div number13="" index12="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code color1="">@Override</code></div><div number14="" index13="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword="">protected</code> <code keyword="">void</code> <code plain="">onCreate(Bundle savedInstanceState) {</code></div><div number15="" index14="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword="">super</code><code plain="">.onCreate(savedInstanceState);</code></div><div number16="" index15="" alt1="">&nbsp;</div><div number17="" index16="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">setContentView(</code><code keyword="">new</code> <code plain="">AnimateView(</code><code keyword="">this</code><code plain="">));</code></div><div number18="" index17="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">}</code></div><div number19="" index18="" alt2="">&nbsp;</div><div number20="" index19="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword="">class</code> <code plain="">AnimateView </code><code keyword="">extends</code> <code plain="">View{</code></div><div number21="" index20="" alt2="">&nbsp;</div><div number22="" index21="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword="">float</code> <code plain="">radius = </code><code value="">10</code><code plain="">;</code></div><div number23="" index22="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">Paint paint;</code></div><div number24="" index23="" alt1="">&nbsp;</div><div number25="" index24="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword="">public</code> <code plain="">AnimateView(Context context) {</code></div><div number26="" index25="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword="">super</code><code plain="">(context);</code></div><div number27="" index26="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">paint = </code><code keyword="">new</code> <code plain="">Paint();</code></div><div number28="" index27="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">paint.setColor(Color.YELLOW);</code></div><div number29="" index28="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">paint.setStyle(Paint.Style.STROKE);</code></div><div number30="" index29="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">}</code></div><div number31="" index30="" alt2="">&nbsp;</div><div number32="" index31="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code color1="">@Override</code></div><div number33="" index32="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword="">protected</code> <code keyword="">void</code> <code plain="">onDraw(Canvas canvas) {</code></div><div number34="" index33="" alt1="">&nbsp;</div><div number35="" index34="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">canvas.translate(</code><code value="">200</code><code plain="">, </code><code value="">200</code><code plain="">);</code></div><div number36="" index35="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">canvas.drawCircle(</code><code value="">0</code><code plain="">, </code><code value="">0</code><code plain="">, radius++, paint);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </code></div><div number37="" index36="" alt2="">&nbsp;</div><div number38="" index37="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword="">if</code><code plain="">(radius &gt; </code><code value="">100</code><code plain="">){</code></div><div number39="" index38="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">radius = </code><code value="">10</code><code plain="">;</code></div><div number40="" index39="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">}</code></div><div number41="" index40="" alt2="">&nbsp;</div><div number42="" index41="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">invalidate();</code><code comments="">//通过调用这个方法让系统自动刷新视图</code></div><div number43="" index42="" alt2="">&nbsp;</div><div number44="" index43="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">}</code></div><div number45="" index44="" alt2="">&nbsp;</div><div number46="" index45="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">}</code></div><div number47="" index46="" alt2="">&nbsp;</div><div number48="" index47="" alt1=""><code plain="">}</code></div></div></td></tr></tbody></table></div></div> <p>运行上面的Activity，你将看到一个圆圈，它原始半径是10，然后不断的变大，直到达到100后又恢复到10，这样循环显示，视觉效果上说你将看到一个逐渐变大的圆圈。</p> <p><a href="http://www.android777.com/wp-content/uploads/2011/04/g15.png"><img size-full="" wp-image-780="" title="g15" src="http://www.android777.com/wp-content/uploads/2011/04/g15.png" alt="" width="320" height="480" /></a></p> <p>上面就是一个简单的自定义View实现的动画效果，它能做的只是简单的动画效果，具有一些局限性。首先你无法控制动画的显示速度，目前它是以最快的 速度显示，但是当你要更快，获取帧数更高的动画呢？  因为View的帧数是由系统控制的，所以你没办法完成上面的操作。如果你需要编写一个游戏，它需要的帧数比较高，那么View就无能为力了，因为它被设计 出来时本来就不是用来处理一些高帧数显示的。你可以把View理解为一个经过系统优化的，可以用来高效的执行一些帧数比较低动画的对象，它具有特定的使用 场景，比如有一些帧数较低的游戏就可以使用它来完成：贪吃蛇、俄罗斯方块、棋牌类等游戏，因为这些游戏执行的帧数都很低。但是如果是一些实时类的游戏，如 射击游戏、塔防游戏、RPG游戏等就没办法使用View来做，因为它的帧数太低了，会导致动画执行不顺畅。所以我们需要一个能自己控制执行帧数的对 象，SurfaceView因此诞生了。</p> <h3>什么是SurfaceView呢？</h3> <p>为什么是SurfaceView呢？Surface的意思是表层，表面的意思，那么SurfaceView就是指一个在表层的View对象。为什么 说是在表层呢，这是因为它有点特殊跟其他View不一样，其他View是绘制在表层外，而它就是充当表层对象。假设你要在一个球上画画，那么球的表层就当 做你的画布对象，你画的东西会挡住它的表层，我们默认没使用SurfaceView，那么球的表层就是空白的，如果我们使用了SurfaceView，我 们可以理解为我们拿来的球本身表面就具有纹路，你是画再纹路之上的，如果你画的是半透明的，那么你将可以透过你画的东西看到球面本身的纹路。SDK的文档 说到：SurfaceView就是在Window上挖一个洞，它就是显示在这个洞里，其他的View是显示在Window上，所以View可以显式在 SurfaceView之上，你也可以添加一些层在SurfaceView之上。</p> <p>SurfaceView还有其他的特性，上面我们讲了它可以控制帧数，那它是什么控制的呢？这就需要了解它的使用机制。一般在很多游戏设计中，我们都是开辟一个后台线程计算游戏相关的数据，然后根据这些计算完的新数据再刷新视图对象，由于<a title="Android应用程序原理" href="http://www.android777.com/index.php/tutorial/android-to-new/principles-of-android-applications.html" target="_blank">对View执行绘制操作只能在UI线程上</a>， 所以当你在另外一个线程计算完数据后，你需要调用View.invalidate方法通知系统刷新View对象，所以游戏相关的数据也需要让UI线程能访 问到，这样的设计架构比较复杂，要是能让后台计算的线程能直接访问数据，然后更新View对象那改多好。我们知道View的更新只能在UI线程中，所以使 用自定义View没办法这么做，但是SurfaceView就可以了。它一个很好用的地方就是<strong>允许其他线程(不是UI线程)绘制图形(使用Canvas)</strong>，根据它这个特性，你就可以控制它的帧数，你如果让这个线程1秒执行50次绘制，那么最后显示的就是50帧。</p> <p>&nbsp;</p> <h3>如何使用SurfaceView？</h3> <p>首先SurfaceView也是一个View，它也有自己的生命周期。因为它需要另外一个线程来执行绘制操作，所以我们可以在它生命周期的初始化阶 段开辟一个新线程，然后开始执行绘制，当生命周期的结束阶段我们插入结束绘制线程的操作。这些是由其内部一个SurfaceHolder对象完成的。 SurfaceHolder，顾名思义，它里面保存了一个队Surface对象的引用，而我们执行绘制方法就是操作这个 Surface，SurfaceHolder因为保存了对Surface的引用，所以使用它来处理Surface的生命周期，说到底 SurfaceView的生命周期其实就是Surface的生命周期，因为SurfaceHolder保存对Surface的引用，所以使用 SurfaceHolder来处理生命周期的初始化。首先我们先看看建立一个SurfaceView的大概步骤，先看看代码：</p> <p>DemoSurfaceView.java：</p> <div><div id="highlighter_369329" java=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0="" alt2="">1</div><div number2="" index1="" alt1="">2</div><div number3="" index2="" alt2="">3</div><div number4="" index3="" alt1="">4</div><div number5="" index4="" alt2="">5</div><div number6="" index5="" alt1="">6</div><div number7="" index6="" alt2="">7</div><div number8="" index7="" alt1="">8</div><div number9="" index8="" alt2="">9</div><div number10="" index9="" alt1="">10</div><div number11="" index10="" alt2="">11</div><div number12="" index11="" alt1="">12</div><div number13="" index12="" alt2="">13</div><div number14="" index13="" alt1="">14</div><div number15="" index14="" alt2="">15</div><div number16="" index15="" alt1="">16</div><div number17="" index16="" alt2="">17</div><div number18="" index17="" alt1="">18</div><div number19="" index18="" alt2="">19</div><div number20="" index19="" alt1="">20</div><div number21="" index20="" alt2="">21</div><div number22="" index21="" alt1="">22</div><div number23="" index22="" alt2="">23</div><div number24="" index23="" alt1="">24</div><div number25="" index24="" alt2="">25</div><div number26="" index25="" alt1="">26</div><div number27="" index26="" alt2="">27</div><div number28="" index27="" alt1="">28</div><div number29="" index28="" alt2="">29</div><div number30="" index29="" alt1="">30</div><div number31="" index30="" alt2="">31</div><div number32="" index31="" alt1="">32</div><div number33="" index32="" alt2="">33</div><div number34="" index33="" alt1="">34</div><div number35="" index34="" alt2="">35</div><div number36="" index35="" alt1="">36</div><div number37="" index36="" alt2="">37</div></td><td><div><div number1="" index0="" alt2=""><code keyword="">package</code> <code plain="">com.android777.demo.uicontroller.graphics;</code></div><div number2="" index1="" alt1="">&nbsp;</div><div number3="" index2="" alt2=""><code keyword="">import</code> <code plain="">android.content.Context;</code></div><div number4="" index3="" alt1=""><code keyword="">import</code> <code plain="">android.view.SurfaceHolder;</code></div><div number5="" index4="" alt2=""><code keyword="">import</code> <code plain="">android.view.SurfaceHolder.Callback;</code></div><div number6="" index5="" alt1=""><code keyword="">import</code> <code plain="">android.view.SurfaceView;</code></div><div number7="" index6="" alt2="">&nbsp;</div><div number8="" index7="" alt1=""><code keyword="">public</code> <code keyword="">class</code> <code plain="">DemoSurfaceView </code><code keyword="">extends</code> <code plain="">SurfaceView&nbsp; </code><code keyword="">implements</code> <code plain="">Callback{</code></div><div number9="" index8="" alt2="">&nbsp;</div><div number10="" index9="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword="">public</code> <code plain="">DemoSurfaceView(Context context) {</code></div><div number11="" index10="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword="">super</code><code plain="">(context);</code></div><div number12="" index11="" alt1="">&nbsp;</div><div number13="" index12="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">init(); </code><code comments="">//初始化,设置生命周期回调方法</code></div><div number14="" index13="" alt1="">&nbsp;</div><div number15="" index14="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">}</code></div><div number16="" index15="" alt1="">&nbsp;</div><div number17="" index16="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword="">private</code> <code keyword="">void</code> <code plain="">init(){</code></div><div number18="" index17="" alt1="">&nbsp;</div><div number19="" index18="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">SurfaceHolder holder = getHolder();</code></div><div number20="" index19="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">holder.addCallback(</code><code keyword="">this</code><code plain="">); </code><code comments="">//设置Surface生命周期回调</code></div><div number21="" index20="" alt2="">&nbsp;</div><div number22="" index21="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">}</code></div><div number23="" index22="" alt2="">&nbsp;</div><div number24="" index23="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code color1="">@Override</code></div><div number25="" index24="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword="">public</code> <code keyword="">void</code> <code plain="">surfaceChanged(SurfaceHolder holder, </code><code keyword="">int</code> <code plain="">format, </code><code keyword="">int</code> <code plain="">width,</code></div><div number26="" index25="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword="">int</code> <code plain="">height) {</code></div><div number27="" index26="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">}</code></div><div number28="" index27="" alt1="">&nbsp;</div><div number29="" index28="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code color1="">@Override</code></div><div number30="" index29="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword="">public</code> <code keyword="">void</code> <code plain="">surfaceCreated(SurfaceHolder holder) {</code></div><div number31="" index30="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">}</code></div><div number32="" index31="" alt1="">&nbsp;</div><div number33="" index32="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code color1="">@Override</code></div><div number34="" index33="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword="">public</code> <code keyword="">void</code> <code plain="">surfaceDestroyed(SurfaceHolder holder) {</code></div><div number35="" index34="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">}</code></div><div number36="" index35="" alt1="">&nbsp;</div><div number37="" index36="" alt2=""><code plain="">}</code></div></div></td></tr></tbody></table></div></div> <p>上面代码我们在SurfaceView的构造方法中执行了init初始化方法，在这个方法里，我们先获取SurfaceView里的 SurfaceHolder对象，然后通过它设置Surface的生命周期回调方法，使用DemoSurfaceView类本身作为回调方法代理类。 surfaceCreated方法，是当SurfaceView被显示时会调用的方法，所以你需要再这边开启绘制的线 程，surfaceDestroyed方法是当SurfaceView被隐藏会销毁时调用的方法，在这里你可以关闭绘制的线程。上面的例子运行后什么也不 显示，因为还没定义一个执行绘制的线程。下面我们修改下代码，使用一个线程绘制一个逐渐变大的圆圈：</p> <div><div id="highlighter_718632" java=""><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td><div number1="" index0="" alt2="">1</div><div number2="" index1="" alt1="">2</div><div number3="" index2="" alt2="">3</div><div number4="" index3="" alt1="">4</div><div number5="" index4="" alt2="">5</div><div number6="" index5="" alt1="">6</div><div number7="" index6="" alt2="">7</div><div number8="" index7="" alt1="">8</div><div number9="" index8="" alt2="">9</div><div number10="" index9="" alt1="">10</div><div number11="" index10="" alt2="">11</div><div number12="" index11="" alt1="">12</div><div number13="" index12="" alt2="">13</div><div number14="" index13="" alt1="">14</div><div number15="" index14="" alt2="">15</div><div number16="" index15="" alt1="">16</div><div number17="" index16="" alt2="">17</div><div number18="" index17="" alt1="">18</div><div number19="" index18="" alt2="">19</div><div number20="" index19="" alt1="">20</div><div number21="" index20="" alt2="">21</div><div number22="" index21="" alt1="">22</div><div number23="" index22="" alt2="">23</div><div number24="" index23="" alt1="">24</div><div number25="" index24="" alt2="">25</div><div number26="" index25="" alt1="">26</div><div number27="" index26="" alt2="">27</div><div number28="" index27="" alt1="">28</div><div number29="" index28="" alt2="">29</div><div number30="" index29="" alt1="">30</div><div number31="" index30="" alt2="">31</div><div number32="" index31="" alt1="">32</div><div number33="" index32="" alt2="">33</div><div number34="" index33="" alt1="">34</div><div number35="" index34="" alt2="">35</div><div number36="" index35="" alt1="">36</div><div number37="" index36="" alt2="">37</div><div number38="" index37="" alt1="">38</div><div number39="" index38="" alt2="">39</div><div number40="" index39="" alt1="">40</div><div number41="" index40="" alt2="">41</div><div number42="" index41="" alt1="">42</div><div number43="" index42="" alt2="">43</div><div number44="" index43="" alt1="">44</div><div number45="" index44="" alt2="">45</div><div number46="" index45="" alt1="">46</div><div number47="" index46="" alt2="">47</div><div number48="" index47="" alt1="">48</div><div number49="" index48="" alt2="">49</div><div number50="" index49="" alt1="">50</div><div number51="" index50="" alt2="">51</div><div number52="" index51="" alt1="">52</div><div number53="" index52="" alt2="">53</div><div number54="" index53="" alt1="">54</div><div number55="" index54="" alt2="">55</div><div number56="" index55="" alt1="">56</div><div number57="" index56="" alt2="">57</div><div number58="" index57="" alt1="">58</div><div number59="" index58="" alt2="">59</div><div number60="" index59="" alt1="">60</div><div number61="" index60="" alt2="">61</div><div number62="" index61="" alt1="">62</div><div number63="" index62="" alt2="">63</div><div number64="" index63="" alt1="">64</div><div number65="" index64="" alt2="">65</div><div number66="" index65="" alt1="">66</div><div number67="" index66="" alt2="">67</div><div number68="" index67="" alt1="">68</div><div number69="" index68="" alt2="">69</div><div number70="" index69="" alt1="">70</div><div number71="" index70="" alt2="">71</div><div number72="" index71="" alt1="">72</div><div number73="" index72="" alt2="">73</div><div number74="" index73="" alt1="">74</div><div number75="" index74="" alt2="">75</div><div number76="" index75="" alt1="">76</div><div number77="" index76="" alt2="">77</div><div number78="" index77="" alt1="">78</div><div number79="" index78="" alt2="">79</div><div number80="" index79="" alt1="">80</div><div number81="" index80="" alt2="">81</div><div number82="" index81="" alt1="">82</div><div number83="" index82="" alt2="">83</div><div number84="" index83="" alt1="">84</div><div number85="" index84="" alt2="">85</div><div number86="" index85="" alt1="">86</div><div number87="" index86="" alt2="">87</div><div number88="" index87="" alt1="">88</div><div number89="" index88="" alt2="">89</div><div number90="" index89="" alt1="">90</div><div number91="" index90="" alt2="">91</div><div number92="" index91="" alt1="">92</div><div number93="" index92="" alt2="">93</div><div number94="" index93="" alt1="">94</div><div number95="" index94="" alt2="">95</div><div number96="" index95="" alt1="">96</div><div number97="" index96="" alt2="">97</div><div number98="" index97="" alt1="">98</div><div number99="" index98="" alt2="">99</div><div number100="" index99="" alt1="">100</div><div number101="" index100="" alt2="">101</div><div number102="" index101="" alt1="">102</div><div number103="" index102="" alt2="">103</div><div number104="" index103="" alt1="">104</div><div number105="" index104="" alt2="">105</div><div number106="" index105="" alt1="">106</div><div number107="" index106="" alt2="">107</div><div number108="" index107="" alt1="">108</div><div number109="" index108="" alt2="">109</div><div number110="" index109="" alt1="">110</div><div number111="" index110="" alt2="">111</div><div number112="" index111="" alt1="">112</div><div number113="" index112="" alt2="">113</div><div number114="" index113="" alt1="">114</div><div number115="" index114="" alt2="">115</div></td><td><div><div number1="" index0="" alt2=""><code keyword="">package</code> <code plain="">com.android777.demo.uicontroller.graphics;</code></div><div number2="" index1="" alt1="">&nbsp;</div><div number3="" index2="" alt2=""><code keyword="">import</code> <code plain="">android.content.Context;</code></div><div number4="" index3="" alt1=""><code keyword="">import</code> <code plain="">android.graphics.Canvas;</code></div><div number5="" index4="" alt2=""><code keyword="">import</code> <code plain="">android.graphics.Color;</code></div><div number6="" index5="" alt1=""><code keyword="">import</code> <code plain="">android.graphics.Paint;</code></div><div number7="" index6="" alt2=""><code keyword="">import</code> <code plain="">android.view.SurfaceHolder;</code></div><div number8="" index7="" alt1=""><code keyword="">import</code> <code plain="">android.view.SurfaceHolder.Callback;</code></div><div number9="" index8="" alt2=""><code keyword="">import</code> <code plain="">android.view.SurfaceView;</code></div><div number10="" index9="" alt1="">&nbsp;</div><div number11="" index10="" alt2=""><code keyword="">public</code> <code keyword="">class</code> <code plain="">DemoSurfaceView </code><code keyword="">extends</code> <code plain="">SurfaceView&nbsp; </code><code keyword="">implements</code> <code plain="">Callback{</code></div><div number12="" index11="" alt1="">&nbsp;</div><div number13="" index12="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">LoopThread thread;</code></div><div number14="" index13="" alt1="">&nbsp;</div><div number15="" index14="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword="">public</code> <code plain="">DemoSurfaceView(Context context) {</code></div><div number16="" index15="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword="">super</code><code plain="">(context);</code></div><div number17="" index16="" alt2="">&nbsp;</div><div number18="" index17="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">init(); </code><code comments="">//初始化,设置生命周期回调方法</code></div><div number19="" index18="" alt2="">&nbsp;</div><div number20="" index19="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">}</code></div><div number21="" index20="" alt2="">&nbsp;</div><div number22="" index21="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword="">private</code> <code keyword="">void</code> <code plain="">init(){</code></div><div number23="" index22="" alt2="">&nbsp;</div><div number24="" index23="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">SurfaceHolder holder = getHolder();</code></div><div number25="" index24="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">holder.addCallback(</code><code keyword="">this</code><code plain="">); </code><code comments="">//设置Surface生命周期回调</code></div><div number26="" index25="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">thread = </code><code keyword="">new</code> <code plain="">LoopThread(holder, getContext());</code></div><div number27="" index26="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">}</code></div><div number28="" index27="" alt1="">&nbsp;</div><div number29="" index28="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code color1="">@Override</code></div><div number30="" index29="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword="">public</code> <code keyword="">void</code> <code plain="">surfaceChanged(SurfaceHolder holder, </code><code keyword="">int</code> <code plain="">format, </code><code keyword="">int</code> <code plain="">width,</code></div><div number31="" index30="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword="">int</code> <code plain="">height) {</code></div><div number32="" index31="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">}</code></div><div number33="" index32="" alt2="">&nbsp;</div><div number34="" index33="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code color1="">@Override</code></div><div number35="" index34="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword="">public</code> <code keyword="">void</code> <code plain="">surfaceCreated(SurfaceHolder holder) {</code></div><div number36="" index35="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">thread.isRunning = </code><code keyword="">true</code><code plain="">;</code></div><div number37="" index36="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">thread.start();</code></div><div number38="" index37="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">}</code></div><div number39="" index38="" alt2="">&nbsp;</div><div number40="" index39="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code color1="">@Override</code></div><div number41="" index40="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword="">public</code> <code keyword="">void</code> <code plain="">surfaceDestroyed(SurfaceHolder holder) {</code></div><div number42="" index41="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">thread.isRunning = </code><code keyword="">false</code><code plain="">;</code></div><div number43="" index42="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword="">try</code> <code plain="">{</code></div><div number44="" index43="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">thread.join();</code></div><div number45="" index44="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">} </code><code keyword="">catch</code> <code plain="">(InterruptedException e) {</code></div><div number46="" index45="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">e.printStackTrace();</code></div><div number47="" index46="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">}</code></div><div number48="" index47="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">}</code></div><div number49="" index48="" alt2="">&nbsp;</div><div number50="" index49="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code preprocessor="">/**</code></div><div number51="" index50="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code preprocessor="">* 执行绘制的绘制线程</code></div><div number52="" index51="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code preprocessor="">* @author Administrator</code></div><div number53="" index52="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code preprocessor="">*</code></div><div number54="" index53="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code preprocessor="">*/</code></div><div number55="" index54="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword="">class</code> <code plain="">LoopThread </code><code keyword="">extends</code> <code plain="">Thread{</code></div><div number56="" index55="" alt1="">&nbsp;</div><div number57="" index56="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">SurfaceHolder surfaceHolder;</code></div><div number58="" index57="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">Context context;</code></div><div number59="" index58="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword="">boolean</code> <code plain="">isRunning;</code></div><div number60="" index59="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword="">float</code> <code plain="">radius = 10f;</code></div><div number61="" index60="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">Paint paint;</code></div><div number62="" index61="" alt1="">&nbsp;</div><div number63="" index62="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword="">public</code> <code plain="">LoopThread(SurfaceHolder surfaceHolder,Context context){</code></div><div number64="" index63="" alt1="">&nbsp;</div><div number65="" index64="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword="">this</code><code plain="">.surfaceHolder = surfaceHolder;</code></div><div number66="" index65="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword="">this</code><code plain="">.context = context;</code></div><div number67="" index66="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">isRunning = </code><code keyword="">false</code><code plain="">;</code></div><div number68="" index67="" alt1="">&nbsp;</div><div number69="" index68="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">paint = </code><code keyword="">new</code> <code plain="">Paint();</code></div><div number70="" index69="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">paint.setColor(Color.YELLOW);</code></div><div number71="" index70="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">paint.setStyle(Paint.Style.STROKE);</code></div><div number72="" index71="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">}</code></div><div number73="" index72="" alt2="">&nbsp;</div><div number74="" index73="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code color1="">@Override</code></div><div number75="" index74="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword="">public</code> <code keyword="">void</code> <code plain="">run() {</code></div><div number76="" index75="" alt1="">&nbsp;</div><div number77="" index76="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">Canvas c = </code><code keyword="">null</code><code plain="">;</code></div><div number78="" index77="" alt1="">&nbsp;</div><div number79="" index78="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword="">while</code><code plain="">(isRunning){</code></div><div number80="" index79="" alt1="">&nbsp;</div><div number81="" index80="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword="">try</code><code plain="">{</code></div><div number82="" index81="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword="">synchronized</code> <code plain="">(surfaceHolder) {</code></div><div number83="" index82="" alt2="">&nbsp;</div><div number84="" index83="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">c = surfaceHolder.lockCanvas(</code><code keyword="">null</code><code plain="">);</code></div><div number85="" index84="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">doDraw(c);</code></div><div number86="" index85="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code comments="">//通过它来控制帧数执行一次绘制后休息50ms</code></div><div number87="" index86="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">Thread.sleep(</code><code value="">50</code><code plain="">);</code></div><div number88="" index87="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">}</code></div><div number89="" index88="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">} </code><code keyword="">catch</code> <code plain="">(InterruptedException e) {</code></div><div number90="" index89="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">e.printStackTrace();</code></div><div number91="" index90="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">} </code><code keyword="">finally</code> <code plain="">{</code></div><div number92="" index91="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">surfaceHolder.unlockCanvasAndPost(c);</code></div><div number93="" index92="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">}</code></div><div number94="" index93="" alt1="">&nbsp;</div><div number95="" index94="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">}</code></div><div number96="" index95="" alt1="">&nbsp;</div><div number97="" index96="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">}</code></div><div number98="" index97="" alt1="">&nbsp;</div><div number99="" index98="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword="">public</code> <code keyword="">void</code> <code plain="">doDraw(Canvas c){</code></div><div number100="" index99="" alt1="">&nbsp;</div><div number101="" index100="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code comments="">//这个很重要，清屏操作，清楚掉上次绘制的残留图像</code></div><div number102="" index101="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">c.drawColor(Color.BLACK);</code></div><div number103="" index102="" alt2="">&nbsp;</div><div number104="" index103="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">c.translate(</code><code value="">200</code><code plain="">, </code><code value="">200</code><code plain="">);</code></div><div number105="" index104="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">c.drawCircle(</code><code value="">0</code><code plain="">,</code><code value="">0</code><code plain="">, radius++, paint);</code></div><div number106="" index105="" alt1="">&nbsp;</div><div number107="" index106="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code keyword="">if</code><code plain="">(radius &gt; </code><code value="">100</code><code plain="">){</code></div><div number108="" index107="" alt1=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">radius = 10f;</code></div><div number109="" index108="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">}</code></div><div number110="" index109="" alt1="">&nbsp;</div><div number111="" index110="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">}</code></div><div number112="" index111="" alt1="">&nbsp;</div><div number113="" index112="" alt2=""><code spaces="">&nbsp;&nbsp;&nbsp;&nbsp;</code><code plain="">}</code></div><div number114="" index113="" alt1="">&nbsp;</div><div number115="" index114="" alt2=""><code plain="">}</code></div></div></td></tr></tbody></table></div></div> <p>上面代码编写了一个使用SurfaceView制作的动画效果，它的效果跟上面自定义View的一样，但是这边的SurfaceView可以控制动 画的帧数。在SurfaceView中内置一个LoopThread线程，这个线程的作用就是用来绘制图形，在SurfaceView中实例化一个 LoopThread实例，一般这个操作会放在SurfaceView的构造方法中。然后通过在SurfaceView中的SurfaceHolder的 生命周期回调方法中插入一些操作，当Surface被创建时(SurfaceView显示在屏幕中时)，开启LoopThread执行绘 制，LoopThread会一直刷新SurfaceView对象，当SurfaceView被隐藏时就停止改线程释放资源。这边有几个地方要注意下：</p> <p>1.因为SurfaceView允许自定义的线程操作Surface对象执行绘制方法，而你可能同时定义多个线程执行绘制，所以当你获取 SurfaceHolder中的Canvas对象时记得加同步操作，避免两个不同的线程同时操作同一个Canvas对象，当操作完成后记得调用 SurfaceHolder.unlockCanvasAndPost方法释放掉Canvas锁。</p> <p>2.在调用doDraw执行绘制时，因为SurfaceView的特点，它会保留之前绘制的图形，所以你需要先清空掉上一次绘制时留下的图形。(View则不会，它默认在调用View.onDraw方法时就自动清空掉视图里的东西)。</p> <p>3.  记得在回调方法：onSurfaceDestroyed方法里将后台执行绘制的LoopThread关闭，这里是使用join方法。这涉及到线程如何关闭 的问题，多数人建议是通过一个标志位：isRunning来判断线程是否该停止运行，如果你想关闭线程只需要将isRunning改成false即可，线 程会自动执行完run方法后退出。</p> <p>&nbsp;</p> <h3>总结：</h3> <p>通过上面的分析，现在大家应该会简单使用SurfaceView了，总的归纳起来SurfaceView和View不同之处有：</p> <p>1. SurfaceView允许其他线程更新视图对象(执行绘制方法)而View不允许这么做，它只允许UI线程更新视图对象。</p> <p>2. SurfaceView是放在其他最底层的视图层次中，所有其他视图层都在它上面，所以在它之上可以添加一些层，而且它不能是透明的。</p> <p>3. 它执行动画的效率比View高，而且你可以控制帧数。</p> <p>4. 因为它的定义和使用比View复杂，占用的资源也比较多，除非使用View不能完成，再用SurfaceView否则最好用View就可以。(贪吃蛇，俄罗斯方块，棋牌类这种帧数比较低的可以使用View做就好)</p></div><img src ="http://www.blogjava.net/oathleo/aggbug/354755.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2011-07-21 09:45 <a href="http://www.blogjava.net/oathleo/archive/2011/07/21/354755.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android surfaceView 与View 的区别  (转载)</title><link>http://www.blogjava.net/oathleo/archive/2011/07/21/354754.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Thu, 21 Jul 2011 01:36:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2011/07/21/354754.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/354754.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2011/07/21/354754.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/354754.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/354754.html</trackback:ping><description><![CDATA[<div>                  	                    <div>             <h1>Android surfaceView 与View 的区别&nbsp;&nbsp;<span id="lockimage"> 						</span></h1> 			 				如果你的游戏不吃CPU，用View就比较好，符合标准<a href="http://dev.10086.cn/cmdn/wiki/index.php?doc-view-1789">Android</a>操作方式，由系统决定刷新surface的时机。</div>		   		              		   			 				 									 				<div><span style="font-size:14px"><p>　　但如果很不幸的，你做不到不让你的程序吃CPU，你就只好使用SurfaceView来强制刷新surface了，不然系统的<a href="http://dev.10086.cn/cmdn/wiki/index.php?doc-view-1788">UI</a>进程很可能抢不过你那些吃CPU的线程。</p><p>　　当然其实不止这两种方法来刷新Surface的，这两种只是纯<a href="http://dev.10086.cn/cmdn/wiki/index.php?doc-view-1306">Java</a>应用比较常见的方法。</p><p>　　SurfaceView和View最本质的区别在于，surfaceView是在一个新起的单独线程中可以重新绘制画面而View必须在UI的主线程中更新画面。</p><p>　　那么在UI的主线程中更新画面 可能会引发问题，比如你更新画面的时间过长，那么你的主UI线程会被你正在画的函数阻塞。那么将无法响应按键，触屏等消息。</p><p>　 　当使用surfaceView  由于是在新的线程中更新画面所以不会阻塞你的UI主线程。但这也带来了另外一个问题，就是事件同步。比如你触屏了一下，你需要surfaceView中  thread处理，一般就需要有一个event queue的设计来保存touch event，这会稍稍复杂一点，因为涉及到线程同步。</p><p>　　所以基于以上，根据游戏特点，一般分成两类。</p><p>　　1 被动更新画面的。比如棋类，这种用view就好了。因为画面的更新是依赖于 onTouch 来更新，可以直接使用 invalidate。 因为这种情况下，这一次Touch和下一次的Touch需要的时间比较长些，不会产生影响。</p><p>　　2 主动更新。比如一个人在一直跑动。这就需要一个单独的thread不停的重绘人的状态，避免阻塞main UI thread。所以显然view不合适，需要surfaceView来控制。</p></span></div></div><img src ="http://www.blogjava.net/oathleo/aggbug/354754.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2011-07-21 09:36 <a href="http://www.blogjava.net/oathleo/archive/2011/07/21/354754.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android 1.5 1.6 2.0 2.1 2.2 2.3 3.0的区别 (转载)</title><link>http://www.blogjava.net/oathleo/archive/2011/07/15/354372.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Fri, 15 Jul 2011 01:32:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2011/07/15/354372.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/354372.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2011/07/15/354372.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/354372.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/354372.html</trackback:ping><description><![CDATA[<div>Android 1.5 API变更概要: <br />UI framework <br />&#183; Framework for easier background/UI thread interaction <br />&#183; 新SlidingDrawer 组件 <br />&#183; 新HorizontalScrollview 组件 <br />AppWidget framework <br />&#183; 一些关于创建桌面AppWidget 的API.  <br />&#183; 提供根据自定义的内容创建LiveFolders的API <br />Media framework <br />&#183; 原声录音和回放 APIs  <br />&#183; 交互式的MIDI 回放引擎 <br />&#183; 开发者使用的视频录像API (3GP format).  <br />&#183; 视频相片分享 Intents  <br />&#183; 媒体搜索Intent  <br />Input Method framework <br />&#183; 输入法服务framework <br />&#183; 文本预测引擎 <br />&#183; 提供具有下载能力的IME给使用者 <br />Android软键盘的隐藏显示研究： <br /><a href="http://winuxxan.blog.51cto.com/2779763/522810" target="_blank">http://winuxxan.blog.51cto.com/2779763/522810</a> <br />android软键盘出来的时候覆盖底部的tab导航: <br /><a href="http://www.eoeandroid.com/thread-67098-1-1.html" target="_blank">http://www.eoeandroid.com/thread-67098-1-1.html</a> <br />android 软键盘Enter键图标的设置: <br /><a href="http://archive.cnblogs.com/a/1994418/" target="_blank">http://archive.cnblogs.com/a/1994418/</a> <br />Application-defined hardware requirements <br />应用可定义硬件需求,应用程序可以定义&nbsp; 说明此程序需要什么硬件需求.比如是否需要物理键盘或者轨迹球. <br />Speech recognition framework <br />&#183; 支持语音识别库. <br />Miscellaneous API additions <br />&#183; LocationManager -应用可以接收到位置改变的信息. <br />&#183; WebView - 触摸start/end/move/cancel&nbsp;&nbsp; DOM 事件的支持 <br />&#183; 重建Sensor Manager APIs <br />&#183; GLSurfaceView - 创建OpenGL 应用更加方便的framework . <br />&#183; 软件升级安装成功的Broadcast Intent - 更加平和优秀的软件升级体验 <br /> <br />Android 1.6 API变更概要: <br />UI framework <br />&#183; 新的类 android.view.animation 控制动画行为:  <br />o AnticipateInterpolator <br />o AnticipateOvershootInterpolator <br />o BounceInterpolator <br />o OvershootInterpolator <br />&#183; 新的XML 属性android:onClick ,从一个layout文件描述一个view的 View.OnClickListener. <br />&#183; 对不同分辨率的屏幕的新的支持. 对于Bitmap和Canvas会执行有针对性的缩放行为.该框架会根据屏幕分辨率和其他内容自动缩放bitmap等. <br />要在你的应用中使用Android 1.6包含的API的话你必须要设置 &amp;quot;4&amp;quot;属性在manifest的 元素中 <br />Search framework <br />&#183; 应用程序现在可以公开的有关内容，作为建议放入快速搜索框，新的设备范围内的搜索功能，是可从主屏幕搜索。为了支持这一点，搜索框架增加了新的属性，可搜索的元数据文件。有关完整的信息，请参阅SearchManager <br />文档。 <br />Accessibility framework <br />&#183; New android.accessibility package that includes classes for  capturing accessibility events and forwarding them to an  AccessibilityService handler. <br />&#183; New AccessibilityService package that lets your application track  user events and provide visual, audible, or haptic feedback to the user. <br />Gesture Input <br />&#183; 新的gesture API :创建,识别,读取,保存手势. <br />Text-to-speech <br />&#183; 新的android.speech.tts 包提供了TTS文本朗读功能,从一个文本生成一个声音文件的回放. <br /><a href="http://blog.csdn.net/CBirdLG/archive/2010/10/10/5931728.aspx" target="_blank">http://blog.csdn.net/CBirdLG/archive/2010/10/10/5931728.aspx</a> <br />Graphics <br />&#183; android.graphics 中的类,现在支持为不同的屏幕尺寸进行缩放. <br />Telephony <br />&#183; 新的SmsManager 发送和接受短信. <br />Utilities <br />&#183; 新的DisplayMetrics 字段决定当前设备屏幕的密度. <br />Android Manifest elements <br />o 新的 元素 <br />o 新的 标签 <br />o glEsVersion: 指定最小openGL ES的版本 <br />&#183;  <br />元素的新的属性:  <br />o 目标SDK版本: 应用程序能够指定目标版本. 它能够运行在旧版本（低至minSdkVersion）,  他是按照应用程序的指定版本开发的. Specifying this version allows the platform to disable  compatibility code that is not required or enable newer features that  are not available to older applications. <br />o maxSdkVersion: 指定设计这个程序运行的最高版本 重要: 当使用&nbsp; 这些属性前请认真阅读文档. <br />New Permissions <br />&#183; CHANGE_WIFI_MULTICAST_STATE: 允许应用进入Wi-Fi 多点传送模式. <br />&#183; GLOBAL_SEARCH: 允许全局搜索系统,以便精确确定 content provider. <br />&#183; INSTALL_LOCATION_PROVIDER: 允许应用在Location Manager.安装一个location provider. <br />&#183; READ_HISTORY_BOOKMARKS: 允许应用读取(并不能写) 用户的浏览记录和书签 <br />&#183; WRITE_HISTORY_BOOKMARKS: 允许应用写入 (并不能读) 用户的浏览记录和书签 <br />&#183; WRITE_EXTERNAL_STORAGE: 允许程序写入外部存储器.应用程序使用API级别3下将默认授予此权限 (这对用户可见的); 应用程序使用API level4 或者更高的,必须要明确的宣告此权限. <br /> <br />Android 2.0 API变更概要: <br />Bluetooth <br />&#183; 开启关闭蓝牙 <br />&#183; 设备和服务发现 <br />&#183; 使用 RFCOMM连接一个可插拔的设备收发数据 <br />&#183; 公布RFCOMM 服务和监听接收 RFCOMM 连接 <br />Sync adapters <br />&#183; 新的APIs, 同步桥接器连接任何backend <br />Account Manager <br />&#183; 集中的帐户管理器 API ,安全的储存和使用可信的tokens/passwords <br />Contacts <br />&#183; 新的通信APIs 允许获取多个账户的数据. <br />&#183; 新的快速通信framework APIs 允许开发者在他们的应用中创建通信标记, 一键点击标记打开一个新的窗口展示一个如何联系当前人的列表. <br />WebView <br />&#183; 不赞成使用的类: UrlInterceptHandler, Plugin, PluginData, PluginList, UrlInterceptRegistry. <br />Camera <br />&#183; 颜色模式, 场景模式 闪光模式, 焦点模式, 白平衡 旋转和其他设置的新的特征. <br />&#183; 当缩放级别改变的时候,会回调新的缩放回调接口. <br />Media <br />&#183; MediaScanner现在为所有图片生成缩微图when they are inserted into MediaStore. <br />&#183; 新的缩微图 API : 检索需要的图片和视频的缩微图. <br />Other Framework <br />&#183; android.R.style 中新的系统主题,能够更加简单的显示当前acitivities的系统壁纸或者保持之前的activity在后台.新的壁纸管理器API 取代并且增加了wallpaper APIs ,我们可以允许我们的应用要求设置系统壁纸. <br />&#183; 新的Service APIs帮助应用准确的处理Service 生命周期 ,在指定的低内存状态下service将会被关闭. <br />o Service.setForeground() 不推荐使用,并且现在这个方法并没有实际执行. .他被一个新的API所取代,  startForeground(), that helps (and requires) associating an ongoing  notification with the foreground state. <br />&#183; MotionEvent 如果设备允许的话,MotionEvent 会返回多点触摸信息.最多可同时获取3点 <br />&#183; KeyEvent 现在有了新的按键发送 APIs,去帮助实现 action-on-up 和长按键行为, 一个新的机制取消按键 (虚拟按键). <br />&#183; WindowManager.LayoutParams 现在有了新的常量允许窗口能够在被锁或者其他的状况中唤醒屏幕,这个允许程序能够让例如闹钟等的应用实现唤醒设备. <br />&#183; New Intent APIs 广播设备的对接状态,当这个设备放在桌面或者停车场,允许程序启动特殊的activity. <br />Key events executed on key-up <br />Android 2.0能够使用虚拟按键HOME, MENU,  BACK和SEARCH,而非物理按键,为了让用户在他们的设备中获得最好的用户体验,android平台现在把这些按键执行加入到了key-up,做了  key-down/key-up  配对,而非只有key-down.,这有助于防止意外按钮事件，并让使用者按下按钮区域，然后拖动而不生成一个事件出来。 <br />这种改变只会影响你的应用程序一点,如果它是拦截按钮事件，最好用key-down，而不是key-up.。特例,如果您的应用程序拦截BACK 键，你应该确保你的应用妥善处理按键事件。 <br /> <br />Android 2.0.1 API变更概要: <br />&#183; 新的快速联系人标记风格(quickContactBadgeStyle)* 属性,让应用的QuickContactBadge 组件接收必要的风格. <br />&#183; 当在manifest里面宣布了filter,取消了支持 ACTION_CONFIGURATION_CHANGED 广播  ,如果想要去接收这个广播, 这个应用必须注册 registerReceiver(BroadcastReceiver,  IntentFilter). <br />性能上的改变: <br />Bluetooth <br />改变了 ACTION_REQUEST_ENABLE 和ACTION_REQUEST_DISCOVERABLE的返回值 <br />&#183; ACTION_REQUEST_ENABLE 如果蓝牙是成功开启的,现在返回RESULT_OK .如果使用者拒绝开启蓝牙的请求,则会返回RESULT_CANCELED . <br />&#183; ACTION_REQUEST_DISCOVERABLE 如果使用者拒绝启动蓝牙或者蓝牙的可发现功能,则返回 RESULT_CANCELED . <br />通讯 <br />The ACTION_INSERT Intent returns RESULT_CANCELED in cases where the contact was not persisted (例如剪切保存到一个空的操作里面). <br />修复错误: <br />资源 <br />现在framework可以正选择应用资源的根据API等级划分的文件夹(drawable-v4是API level4版本用的资源).现在的版本这个功能不能正常工作的问题已经修复. <br />Contacts <br />The ACTION_INSERT Intent now returns the appropriate kind of URI  when the request is made using the (now deprecated) Contacts APIs. <br />Other Framework fixes <br />&#183; getCallingPackage() 现在正确的报告包名, 而不是进程名. <br /> <br />Android 2.1 API变更概要: <br />﻿Live Wallpapers 动态桌面 <br />﻿以下增加的API可以提供你开发动态的桌面: <br />&#183; 新android.service.wallpaper 包. <br />&#183; 新WallpaperInfo 类. <br />&#183; 升级的WallpaperManager. <br /> <br />附加说明, 如果你的应用相提供Live Wallpapers的功能, 你必须记得增加一个&nbsp; 元素到你的应用manifest里面.  宣布这个属性android:name=&amp;quot;android.software.live_wallpaper&amp;quot;.  举例: <br />电话 <br /> <br />&#183; 新的SignalStrength 类提供当前网络信号的一些信息这些信息可以从onSignalStrengthsChanged(SignalStrength) 回调. <br />&#183; 新的onDataConnectionStateChanged(int, int) 回调. <br />Views <br />&#183; 新的View 方法isOpaque() 和onDrawScrollBars(Canvas). <br />&#183; 新的RemoteViews 方法addView(int, RemoteViews) 和removeAllViews(int). <br />&#183; 新的ViewGroup 方法isChildrenDrawingOrderEnabled() 和setChildrenDrawingOrderEnabled(boolean). <br /> <br />WebKit <br />&#183; 新的WebStorage 方法操作网页数据缓存. <br />&#183; 新的GeolocationPermissions 方法获取 Geolocation permissions 的出处, 把他们设置到 WebView上. <br />&#183; 新的WebSettings 方法管理软件缓存, 网页缓存 和屏幕的缩放. <br />&#183; 新的WebChromeClient 方法处理视频, 历史记录, 自定义view, 软件缓存限制还有其他﻿﻿ <br /> <br />Android 2.2 API变更概要: <br />对Microsoft Exchange更好的支持。Android的几个新特性使之更适于Exchange企业环境。其中一些新特性列举如下： <br /> <br />基于用户名/密码的Exchange帐号自动检测  <br />支持Exchange日历的同步  <br />改进的安全性，管理员可以跨越设备强制应用安全策略  <br />恢复出场设置&#8212;&#8212;管理员可以将设备重置为出场设置，这样就能在设备被偷或丢失后擦除上面的敏感数据了  <br />全局的地址列表查找&#8212;&#8212;可以根据服务器端返回的列表帮助用户自动填充收件人的邮件地址  <br />设备管理API。Android 2.2改进并新增了大量的设备管理API，开发者可以将其用在应用当中： <br />应用数据备份API&#8212;&#8212;可以将应用数据备份到云中。如果用户切换到另一个Android设备，他就可以从之前的设备中恢复数据。  <br />Cloud-to-Device消息API。云中的用户/系统可以凭借这种增强在设备上触发动作。该特性可以将移动警告发给手机并且支持双向的推同步服务。  <br />可以直接在外部的内存设备（SD卡）上安装应用，还可以将应用从内部迁移到SD卡上，反之亦然。  <br />网络共享。Android 2.2可以通过一台Android电话提供的热点将多个服务连接到Internet上。 <br /> <br />性能。借助于新式的Dalvik JIT编译器，对于CPU密集型应用来说，Android 2.2的速度要比Android 2.1快2～5倍。根据Linpack基准测试结果，安装了Froyo的Nexus  <br />One电话可以达到37.5 MFlops，而同样的电话如果使用Android 2.1的话才有6.5 MFlops。 <br /> <br />更快的浏览速度。由于浏览器现在使用了Chrome V8引擎，JavaScript代码的处理速度要比Android 2.1快2～3倍。 <br /> <br />从浏览器中访问设备API。现在可以直接从浏览器中访问大量的设备API，如加速器、相机、声音识别、翻译等，这样Web应用就能以前所未有的方式与设备交互了。比如说，用户可以在拍完照后将其上传到网上，而这一切都是在浏览器内完成的。 <br /> <br />支持Flash 10.1。Froyo支持最新的Flash 10.1  <br />Beta版。最近，JIT编译器的引入极大地改进了性能，这对Flash应用的运行起到了巨大的帮助作用，因为大家都知道，Flash应用是一种CPU密集型应用。 <br /> <br />Android商店。Android 2.2开发者和商店用户会从如下新特性中受益无穷： <br /> <br />可以在Android商店搜索应用，包括应用数据  <br /> <br />更新&#8212;&#8212;点击一次按钮后会自动更新所有应用  <br /> <br />崩溃与冻结报告。Android  <br />2.2集成了崩溃/冻结报告特性，这样在崩溃时用户就可以将完整的细节信息报告给应用发布者了  <br /> <br />从PC上浏览商店并将应用直接下载到设备上。用户可以通过PC选择商店的应用，之后应用就可以发到到加载的设备上。要想使用这个特性，用户需要登录并且设备需要在Android商店注册-  <br />音乐管理。用户可以将Windows Media或Mac iTunes上的所有非DRM音乐转换到Android设备上播放。 <br /> <br /><span style="color: red">Android 2.3 API变更概要:</span> <br />Android 2.3姜饼发布，代号Gingerbread，包含哪些新特性和改进呢?  <br /> <br />&nbsp;&nbsp; 1.  新增android.net.sip包，名为SipManager类，可以轻松开发基于Sip的Voip应用。同时使用时必须至少包含这两个权限  &lt;uses-permission android:name="android.permission.INTERNET"&gt; and  &lt;uses-permission  android:name="android.permission.USE_SIP"&gt;，如果需要在Market上过滤仅显示支持VoIP  API的机型，可以在发布时androidmanifest.xml中加入 &lt;uses-feature  android:name="android.software.sip" android:required="true"&gt; 和  &lt;uses-feature android:name="android.software.sip.voip"&gt; 这两个标志。  <br /> <br />&nbsp; 2. Near Field Communications (NFC) 近距离通讯的支持，NFC可以在不接触的情况下实现数据交换通讯，可以很好的代替RFID SIM卡实现手机支付等扩展功能，当然Android123提示这需要硬件的支持  <br />，新增包在  android.nfc包含NfcAdapter,NdefMessage,NdefRecord等类，类似蓝牙的处理方式，使用该API需要声明权 限&lt;uses-permission android:name="android.permission.NFC"&gt;  ，同时在Market上过滤支持NFC的设备需要加入&lt;uses-feature  android:name="android.hardware.nfc" android:required="true"&gt;这句。  <br /> <br />&nbsp; 3. 新增陀螺仪和其他的传感器支持  <br />&nbsp; Android 2.3加入了一些新的感应器，比如gyroscope陀螺仪, rotation vector旋转向量, linear  acceleration线性加速器  gravity和barometer气压计的支持。如果过滤这些功能，发布时加入类似&lt;uses-feature  android:name="android.hardware.sensor.gyroscope"  android:required="true"&gt;到androidmanifest.xml中。  <br /> <br />&nbsp; 4. 多摄像头支持  <br />新增 Camera.CameraInfo 可以管理摄像头前置或后置  <br />新增 getNumberOfCameras(), getCameraInfo() 和 getNumberOfCameras() 获取摄像头数量。&nbsp;&nbsp;  <br />新增 get() 方法，可以获取摄像头配置信息 CamcorderProfile  <br />新增 getJpegEncodingQualityParameter() 获取jpeg编码质量参数可以在 CameraPreview.java 文件从ApiDemos示例程序中查看。  <br /> <br />5. 新增拍照API  <br />&nbsp; 比如获取焦距getFocusDistances()获取预览FPS getPreviewFpsRange(), 获取焦距范围 getSupportedPreviewFpsRange() 和设置教育 setPreviewFpsRange()  <br /> <br />6. 混响音效  <br />本次Android 2.3框架中加入了对混响音效的支持，比如低音，耳机和虚拟化等效果.  <br />新增 android.media.audiofx 包  <br />新增 AudioEffect 类提供音效控制  <br />新增音频会话ID，设置 AudioTrack 和 MediaPlayer.  <br />新 AudioTrack 新增 attachAuxEffect()、getAudioSessionId()和 setAuxEffectSendLevel()。  <br />新 attachAuxEffect() ,getAudioSessionId(), setAudioSessionId(int), 和 setAuxEffectSendLevel() .  <br />相关音效在 AudioFxDemo.java 的 ApiDemos 示例。  <br /> <br />6. 照片EXIF信息改进  <br />新增 经纬度标签在JPG格式的EXIF中，同时可以使用 getAltitude() 方法获取经纬度的EXIF信息  <br />新增setOrientationHint() 可以让程序获取视频录制的方向.  <br /> <br />7. 下载管理  <br />在Android 2.3中新增的下载管理支持长时间运行的Http下载服务支持。可以保证在手机重启后仍然重试下载等操作，整个过程在后台执行。  <br />通过 DownloadManager 类使用getSystemService(DOWNLOAD_SERVICE) 来实例化，通过 ACTION_NOTIFICATION_CLICKED 这个Intent来处理。  <br />http://www.android123.com.cn/androidkaifa/723.html  <br /> <br />8. 限制模式  <br />&nbsp; 可以帮助开发者监控他的应用的性能，处理线程阻塞，避免ANR的发生。  <br /> <br />StrictMode.ThreadPolicy 和 StrictMode.VmPolicy 获取VM相关信息.  <br />使用限制模式优化的Android应用程序可以查看android.os.StrictMode包的具体介绍。  <br /> <br /><span style="color: red">Android 3.0 API变更概要:</span> <br />Android 3.0 SDK中新增了哪些API呢? 我们总结下平板系统honeycomb中的新特性,  首先需要澄清的是经过Android123发现设置模拟器的分辨率到普通WVGA这样的解析度时平板的特性自动消失和Android  2.3没有什么太大区别，按照这样来看未来Android  3.0除了兼容平板外还继续可以被手机所支持，据称3.0的代码针对A9双核CPU进行了进一步的改进。 <br /> <br />　　一、Fragments 碎片容器 <br />　　有关Android Fragments的内容，Android开发网在前几天已经用几篇文章详细讲解了下，大家可以从Fragment对比Activity - Android碎片介绍 一文开始了解。 <br /> <br />　　二、Action Bar 活动栏 <br />　　活动栏Action Bar可以替换传统的标题栏在Activity窗口中，包括程序图标和一些新接口在activity的选项菜单中，另外Action Bar允许你 <br />　　Include select menu items directly in the Action Bar&#8212;as "action items"&#8212;for quick access to global user actions. <br />　　In your XML declaration for the menu item, include the attribute,  android:showAsAction with a value of "ifRoom". When there's enough room  in the Action Bar, the menu item appears directly in the bar. Otherwise,  the item is placed in the overflow menu, revealed by the icon on the  right side of the Action Bar. <br />　　Add interactive widgets to the Action Bar&#8212;as "action views"&#8212;such as a search box. <br />　　In the XML for the menu item that should behave as an action view,  include the android:actionViewLayout attribute with a layout resource  for the action view or android:actionViewClass with the class name of  the widget. Like action items, an action view appears only when there's  room for it in the Action Bar. If there's not enough room, it is placed  in the overflow menu and behaves like a regular menu item (for example,  an item can provide a SearchView as an action view, but when in the  overflow menu, selecting the item activates the search dialog). <br />　　Add an action to the application logo when tapped and replace it with a custom logo <br />　　The application logo is automatically assigned the android.R.id.home ID, <br />which the system deliveres to your activity's  onOptionsItemSelected() callback when tapped. Simply respond to this ID  in your callback method to perform an action such as go to your  application's "home" activity. <br />　　To replace the icon with a logo, <br />　　Add breadcrumbs for navigating backward through fragments <br />　　Add built in tabs and a drop-down list for navigation <br />　　Customize the Action Bar themes and custom backgrounds <br />　　有关ActionBar的文章，可以参考 Action Bar使用方法 - Android活动栏 系列文章 <br /> <br />　　三、System clipboard系统剪切板 <br />　　Android  3.0中的剪切板进行了增强，本次可以支持除了纯文本外更多的内容，如，URL和Intent，对于剪切板类ClipboardManager仍然通过  getSystemService(CLIPBOARD_SERVICE)来实例化，新增的ClipData类用于管理具体的复制对象，可以在SDK的  android.content.ClipData.Item中找到。 具体的使用Android123将在今后的文章中写道。 <br /> <br />　　四、拖拽 <br />　　开始拖拽内容在你的Activity中可以使用startDrag()方法在一个View中，这里 View.DragShadowBuilder提供了拖拽时的阴影，对于拖拽的过程处理可以通过OnDragListener通过View的 setOnDragListener()来设置，在拖拽的时候系统会自动调用onDrag()方法。 <br /> <br />　　五、增强的appWidgets <br />　　Android 3.0的appWidget开始支持更丰富的控件，比如GridView, ListView, StackView,  ViewFlipper和AdapterViewFlipper.而以前必须通过RemoteView显示一个文本或图片，本次全新的  RemoteViewsService增强了桌面小插件的功能。 <br /> <br />　　六、增强的状态提示栏 <br />　　新增的Notification  API可以丰富你的状态栏，新的Notification.Builder类可以帮助你轻松实现，支持大图标提示信息通过setLargeIcon方法，  通常显示一些社交类的软件，比如联系人照片，或相册缩略图，设置自定义状态栏，可以使用setTicker()方法。 <br /> <br />　　七、内容加载器 <br />　　新框架API提供了一个异步加载内容的泪，合并和UI组件和fragment来动态加载数据从工作者现成，使用CursorLoader子类来获取ContentResolver中的数据. <br /> <br />　　八、A2DP蓝牙和耳机控制API <br />　　Android  honeycomb中没有忘记再次增强蓝牙，你可以通过初始化BluetoothProfile通过调用getProfileProxy()在处理  A2DP或耳机HEADSET设置，BluetoothProfile.ServiceListener可以获取客户端连接或断开的回调。 <br />　　九、动画框架 <br />　　3.0中Android再次增强动画播放类，ObjectAnimator和LayoutTransition需要大家了解一些。 <br /> <br />　　十、扩展UI框架 <br />　　新增以下UI控件 <br />　　AdapterViewAnimator <br />　　AdapterViewFlipper <br />　　CalendarView <br />　　ListPopupWindow <br />　　NumberPicker <br />　　PopupMenu <br />　　SearchView <br />　　StackView <br /> <br />　　十一、图形相关 <br />　　1. 2D图形硬件加速Hardware accelerated 2D graphics ，  在androidmanifest.xml的 元素中添加android:hardwareAccelerated="true"  即可。他可以优化程序运行更平滑高效，在滚动和动画方面。 <br />　　2.设置渲染模式，比如 LAYER_TYPE_HARDWARE 硬件加速和 LAYER_TYPE_SOFTWARE 使用 setLayerType() 方法. <br />　　3.渲染脚本对于3D图形方面大家可以看看Renderscript类。 <br /> <br />　　上面是Android 3.0的主要改进，明天Android开发网将和大家一起说下强大的对于平板电脑比较重要的Action Bar活动栏。 </div><img src ="http://www.blogjava.net/oathleo/aggbug/354372.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2011-07-15 09:32 <a href="http://www.blogjava.net/oathleo/archive/2011/07/15/354372.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Android 最常见功能 Demo</title><link>http://www.blogjava.net/oathleo/archive/2010/08/04/327942.html</link><dc:creator>oathleo</dc:creator><author>oathleo</author><pubDate>Wed, 04 Aug 2010 08:37:00 GMT</pubDate><guid>http://www.blogjava.net/oathleo/archive/2010/08/04/327942.html</guid><wfw:comment>http://www.blogjava.net/oathleo/comments/327942.html</wfw:comment><comments>http://www.blogjava.net/oathleo/archive/2010/08/04/327942.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/oathleo/comments/commentRss/327942.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/oathleo/services/trackbacks/327942.html</trackback:ping><description><![CDATA[<embed src="http://www.4shared.com/embed/353334459/d994f338/preview.swf" width="700" height="400" allowfullscreen="true" allowscriptaccess="always"></embed>
    <br />
    功能很简单： <br />
    1.从后台实时取数据展示 Demo 是用socket取，起Task每秒去取 <br />
    2.把取得数据展示成图表形式 <br />
    3.把取得数据展示成拓扑图形式 <br />
    代码很简单，拓扑部分在另个项目中，以后集成进Demo <br />

 
<img src ="http://www.blogjava.net/oathleo/aggbug/327942.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/oathleo/" target="_blank">oathleo</a> 2010-08-04 16:37 <a href="http://www.blogjava.net/oathleo/archive/2010/08/04/327942.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>