﻿<?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-super-随笔分类-android</title><link>http://www.blogjava.net/super/category/45937.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 16 Aug 2010 02:26:16 GMT</lastBuildDate><pubDate>Mon, 16 Aug 2010 02:26:16 GMT</pubDate><ttl>60</ttl><item><title>android中点中overlay弹出带尾巴的气泡的实现</title><link>http://www.blogjava.net/super/archive/2010/08/12/android_mapview_overlay.html</link><dc:creator>王卫华</dc:creator><author>王卫华</author><pubDate>Thu, 12 Aug 2010 07:03:00 GMT</pubDate><guid>http://www.blogjava.net/super/archive/2010/08/12/android_mapview_overlay.html</guid><wfw:comment>http://www.blogjava.net/super/comments/328671.html</wfw:comment><comments>http://www.blogjava.net/super/archive/2010/08/12/android_mapview_overlay.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/super/comments/commentRss/328671.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/super/services/trackbacks/328671.html</trackback:ping><description><![CDATA[<p><img alt="" src="http://www.blogjava.net/images/blogjava_net/super/mappop.png" border="0" /></p>
<br />
<br />
<br />
就是上面的样子<br />
<br />
做这个过程中我碰到两个问题:<br />
1:如何做带尾巴的气泡View<br />
2:如何把这个View添加到MapView中.<br />
<br />
<br />
1:如何做带尾巴的气泡View<br />
我是采用背景图的方式来实现的.当然,普通的PNG在View&nbsp;缩放的时候会失真,尤其是那个尖尖的尾巴.<br />
后来采用9.png的格式,才完成了不变形的效果.9.png格式的Png可以用SDK\Tools\draw9patch.bat来处理,只要把普通的png的边上标志一下就可以了,具体draw9patch.bat如何使用这里就不说了,网上有很多文档,自己查查就知道了.<br />
我生成的9.png就是下面这个样子,注意四周的黑线.就是9png拉伸时的标识<br />
<img height="51" alt="" src="http://www.blogjava.net/images/blogjava_net/super/bubble_background.9.png" width="65" border="0" /><br />
<br />
有了这个png,直接放到你的工程下的res/drawable目录就可以了,<br />
然后在res/layout目录下建立你的view的xml文件,比如叫overlay_pop.xml,我的是这样的:<br />
<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"<br />
&nbsp;android:orientation="vertical" <br />
&nbsp;android:background="@drawable/bubble_background"<span style="color: red">&nbsp;&lt;!--这就是那个9.png--&gt;<br />
</span>&nbsp;android:layout_width="wrap_content" <br />
&nbsp;android:layout_height="wrap_content"<br />
&nbsp;android:paddingLeft="5px"<br />
&nbsp;android:paddingTop="5px"<br />
&nbsp;android:paddingRight="5px"<br />
&nbsp;android:paddingBottom="20px"&nbsp;&nbsp;&nbsp; <span style="color: red">&lt;!--注意加上padding,否则view里面的东西就画到边框上了--&gt;<br />
</span>&nbsp;&nbsp; &gt;<br />
&nbsp;&nbsp;&nbsp; &lt;TextView android:id="@+id/map_bubbleTitle" <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;android:ellipsize="marquee" <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;android:layout_width="match_parent" <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;android:layout_height="wrap_content"<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;android:gravity="center_horizontal"<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;android:singleLine="true" <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;style="@style/map_BubblePrimary" /&gt; <span style="color: red">&lt;!--style可以没有,我这里第一个TextView表示标题,用的是大字体--&gt;<br />
</span>&nbsp;&nbsp;&nbsp; &lt;TextView&nbsp; android:id="@+id/map_bubbleText" <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;android:layout_width="match_parent" <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;android:layout_height="wrap_content" <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;android:singleLine="false" <br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;style="@style/map_BubbleSecondary" /&gt;<span style="color: red">&lt;!--style可以没有,我这里第二个TextView表示描述信息,用的是大字体--&gt;<br />
</span>&lt;/LinearLayout&gt;<br />
<br />
<br />
这样popView就建立好了<br />
<br />
<br />
2:如何把这个View添加到MapView中.<br />
通常是在mapView中点击某个位置,弹出popView<br />
或者点击某个Overlay弹出popView,这里用点击Overlay来说明,<br />
<br />
overlay有onTap()方法,你可以实现自己的overlay,overideonTap()方法,弹出popView,<br />
也可以使用setOnFocusChangeListener(),在listener中实现弹出popView,.<br />
我是用的listener,因为setOnFocusChangeListener在失去焦点也会触发,我可以再失去焦点的时候隐藏popView.<br />
<br />
MapView是<span style="color: red">继承自ViewGroup</span>的,因此,MapView有addView()方法,同时还有<span style="color: red">MapView.LayoutParams<br />
</span><span style="color: red"><span style="color: #000000">MapView.LayoutParams 可以根据GeoPoint来定位,我就是利用这个特性来定位弹出的popView的.<br />
</span><br />
<span style="color: #000000">PointItemizedOverlay overlay = new PointItemizedOverlay(drawable); &lt;!--这是我继承自ItemizedOverlay的overlay,主要就是画一个图片,写一个名称,很简单,这里不贴具体代码了--&gt;</span><br />
</span><br />
public class BaseMapActivity extends MapActivity {<br />
<br />
&nbsp;/**<br />
&nbsp; * 地图View<br />
&nbsp; */<br />
&nbsp;protected MapView mapView;<br />
<p>&nbsp;/**<br />
&nbsp; * 弹出的气泡View<br />
&nbsp; */<br />
&nbsp;private View popView;<br />
/**<br />
&nbsp;&nbsp;&nbsp;&nbsp;监听器<br />
*/<br />
&nbsp;private final ItemizedOverlay.OnFocusChangeListener onFocusChangeListener = new ItemizedOverlay.OnFocusChangeListener() {</p>
<p>&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;public void onFocusChanged(ItemizedOverlay overlay, OverlayItem newFocus) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//创建气泡窗口<br />
&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;if (popView != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; popView.setVisibility(View.GONE);<br />
&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;if (newFocus != null) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;MapView.LayoutParams geoLP = (MapView.LayoutParams) popView.getLayoutParams();<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0000">geoLP.point = newFocus.getPoint();//这行用于popView的定位<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;TextView title = (TextView) popView.findViewById(R.id.map_bubbleTitle);<br />
&nbsp;&nbsp;&nbsp;&nbsp;title.setText(newFocus.getTitle());</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;TextView desc = (TextView) popView.findViewById(R.id.map_bubbleText);<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (newFocus.getSnippet() == null || newFocus.getSnippet().length() == 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;desc.setVisibility(View.GONE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;desc.setVisibility(View.VISIBLE);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;desc.setText(newFocus.getSnippet());<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;mapView.updateViewLayout(popView, geoLP);<br />
&nbsp;&nbsp;&nbsp;&nbsp;popView.setVisibility(View.VISIBLE);<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;}<br />
&nbsp;};<br />
</p>
<br />
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void onCreate(Bundle savedInstanceState) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;super.onCreate(savedInstanceState);<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;省略其他代码<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; **/<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//初始化气泡,并设置为不可见<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;popView = inflater.inflate(R.layout.overlay_popup, null);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mapView.addView(&nbsp;popView,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #ff0000">new MapView.LayoutParams(MapView.LayoutParams.WRAP_CONTENT, MapView.LayoutParams.WRAP_CONTENT,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;null, MapView.LayoutParams.BOTTOM_CENTER));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //由于我的气泡的尾巴是在下边居中的,因此要设置成MapView.LayoutParams.BOTTOM_CENTER.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//这里没有给GeoPoint,在onFocusChangeListener中设置<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;views.add(popView);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; popView.setVisibility(View.GONE);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;添加overlay<br />
&nbsp;&nbsp;&nbsp; PointItemizedOverlay overlay = new PointItemizedOverlay(drawable);<br />
&nbsp;&nbsp;&nbsp;&nbsp;//设置显示/隐藏泡泡的监听器<br />
&nbsp;&nbsp;&nbsp;&nbsp;overlay.setOnFocusChangeListener(onFocusChangeListener);<br />
&nbsp;&nbsp;&nbsp; overlay.addOverlay(/*你自己的overlayItem*/);<br />
&nbsp;&nbsp;&nbsp; overlay.addOverlay(/*你自己的overlayItem*/);<br />
&nbsp;&nbsp;&nbsp; overlay.addOverlay(/*你自己的overlayItem*/);<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
这样就基本完工了.<br />
<br />
<br />
<br />
<br />
<img src ="http://www.blogjava.net/super/aggbug/328671.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/super/" target="_blank">王卫华</a> 2010-08-12 15:03 <a href="http://www.blogjava.net/super/archive/2010/08/12/android_mapview_overlay.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>android mapView中画轨迹的overlay</title><link>http://www.blogjava.net/super/archive/2010/08/12/android-map.html</link><dc:creator>王卫华</dc:creator><author>王卫华</author><pubDate>Thu, 12 Aug 2010 06:21:00 GMT</pubDate><guid>http://www.blogjava.net/super/archive/2010/08/12/android-map.html</guid><wfw:comment>http://www.blogjava.net/super/comments/328661.html</wfw:comment><comments>http://www.blogjava.net/super/archive/2010/08/12/android-map.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/super/comments/commentRss/328661.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/super/services/trackbacks/328661.html</trackback:ping><description><![CDATA[<p><br />
使用方法:<br />
LineItemizedOverlay overlay = new LineItemizedOverlay();<br />
<br />
overlay.addOverlay(/*起点的OverlayItem*/);<br />
overlay.addOverlay(/*终点的OverlayItem*/);<br />
overlay.addLinePoint(/*要画的轨迹的GeoPoint的List*/);<br />
<br />
mapView.getOverlays().add(overlay);<br />
<br />
/**<br />
&nbsp;* <br />
&nbsp;*/<br />
package com.xtyon.tuola.truck.map;</p>
<p>import java.util.ArrayList;</p>
<p>import android.graphics.Canvas;<br />
import android.graphics.Color;<br />
import android.graphics.Paint;<br />
import android.graphics.Point;<br />
import android.graphics.drawable.Drawable;</p>
<p>import com.google.android.maps.GeoPoint;<br />
import com.google.android.maps.ItemizedOverlay;<br />
import com.google.android.maps.MapView;<br />
import com.google.android.maps.OverlayItem;<br />
import com.google.android.maps.Projection;</p>
<p>/**<br />
&nbsp;* 地图上的线型图层:包括一个起点,一个终点,以及之间的曲线<br />
&nbsp;* @author superwang<br />
&nbsp;*/<br />
public class LineItemizedOverlay extends ItemizedOverlay&lt;OverlayItem&gt; {<br />
&nbsp;private static final int LAYER_FLAGS = Canvas.MATRIX_SAVE_FLAG | Canvas.CLIP_SAVE_FLAG<br />
&nbsp;&nbsp;&nbsp;| Canvas.HAS_ALPHA_LAYER_SAVE_FLAG | Canvas.FULL_COLOR_LAYER_SAVE_FLAG | Canvas.CLIP_TO_LAYER_SAVE_FLAG;<br />
&nbsp;/**<br />
&nbsp; * 用于保存起点/终点数据<br />
&nbsp; */<br />
&nbsp;private final ArrayList&lt;OverlayItem&gt; mOverlays = new ArrayList&lt;OverlayItem&gt;();</p>
<p>&nbsp;/**<br />
&nbsp; * 用于保存构成曲线的点的数据<br />
&nbsp; */<br />
&nbsp;private final ArrayList&lt;GeoPoint&gt; linePoints = new ArrayList&lt;GeoPoint&gt;();</p>
<p>&nbsp;/**<br />
&nbsp; * @param defaultMarker<br />
&nbsp; */<br />
&nbsp;public LineItemizedOverlay() {<br />
&nbsp;&nbsp;super(null);</p>
<p>&nbsp;&nbsp;// TODO Auto-generated constructor stub<br />
&nbsp;}</p>
<p>&nbsp;/* (non-Javadoc)<br />
&nbsp; * @see com.google.android.maps.ItemizedOverlay#createItem(int)<br />
&nbsp; */<br />
&nbsp;@Override<br />
&nbsp;protected OverlayItem createItem(int i) {<br />
&nbsp;&nbsp;return mOverlays.get(i);</p>
<p>&nbsp;}</p>
<p>&nbsp;/* (non-Javadoc)<br />
&nbsp; * @see com.google.android.maps.ItemizedOverlay#size()<br />
&nbsp; */<br />
&nbsp;@Override<br />
&nbsp;public int size() {<br />
&nbsp;&nbsp;// TODO Auto-generated method stub<br />
&nbsp;&nbsp;return mOverlays.size();<br />
&nbsp;}</p>
<p>&nbsp;/**<br />
&nbsp; * 调价起点/终点<br />
&nbsp; * description: <br />
&nbsp; * @param overlay<br />
&nbsp; */<br />
&nbsp;public void addOverlay(OverlayItem overlay) {<br />
&nbsp;&nbsp;mOverlays.add(overlay);<br />
&nbsp;&nbsp;populate();<br />
&nbsp;}</p>
<p>&nbsp;/**<br />
&nbsp; * 添加曲线中的点<br />
&nbsp; * description: <br />
&nbsp; * @param point<br />
&nbsp; */<br />
&nbsp;public void addLinePoint(GeoPoint point) {<br />
&nbsp;&nbsp;linePoints.add(point);<br />
&nbsp;}</p>
<p>&nbsp;public ArrayList&lt;GeoPoint&gt; getLinePoints() {<br />
&nbsp;&nbsp;return linePoints;<br />
&nbsp;}</p>
<p>&nbsp;/**<br />
&nbsp; * 画起点/终点/轨迹<br />
&nbsp; */<br />
&nbsp;@Override<br />
&nbsp;public void draw(Canvas canvas, MapView mapView, boolean shadow) {<br />
&nbsp;&nbsp;if (!shadow) {<br />
&nbsp;&nbsp;&nbsp;//System.out.println("!!!!!!!!!!!!!!");</p>
<p>&nbsp;&nbsp;&nbsp;canvas.save(LAYER_FLAGS);<br />
&nbsp;&nbsp;&nbsp;//canvas.save();</p>
<p>&nbsp;&nbsp;&nbsp;Projection projection = mapView.getProjection();<br />
&nbsp;&nbsp;&nbsp;int size = mOverlays.size();<br />
&nbsp;&nbsp;&nbsp;Point point = new Point();<br />
&nbsp;&nbsp;&nbsp;Paint paint = new Paint();<br />
&nbsp;&nbsp;&nbsp;paint.setAntiAlias(true);<br />
&nbsp;&nbsp;&nbsp;OverlayItem overLayItem;</p>
<p>&nbsp;&nbsp;&nbsp;//画起点/终点<br />
&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; size; i++) {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;overLayItem = mOverlays.get(i);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;Drawable marker = overLayItem.getMarker(0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;//marker.getBounds()<br />
&nbsp;&nbsp;&nbsp;&nbsp;/* 象素点取得转换 */<br />
&nbsp;&nbsp;&nbsp;&nbsp;projection.toPixels(overLayItem.getPoint(), point);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;if (marker != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boundCenterBottom(marker);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;/* 圆圈 */<br />
&nbsp;&nbsp;&nbsp;&nbsp;//Paint paintCircle = new Paint();<br />
&nbsp;&nbsp;&nbsp;&nbsp;//paintCircle.setColor(Color.RED);<br />
&nbsp;&nbsp;&nbsp;&nbsp;paint.setColor(Color.RED);<br />
&nbsp;&nbsp;&nbsp;&nbsp;canvas.drawCircle(point.x, point.y, 5, paint);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;/* 文字设置 */<br />
&nbsp;&nbsp;&nbsp;&nbsp;/* 标题 */<br />
&nbsp;&nbsp;&nbsp;&nbsp;String title = overLayItem.getTitle();<br />
&nbsp;&nbsp;&nbsp;&nbsp;/* 简介 */<br />
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;String snippet = overLayItem.getSnippet();<br />
&nbsp;&nbsp;&nbsp;&nbsp;//<br />
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer txt = new StringBuffer();<br />
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;if (title != null &amp;&amp; !"".equals(title))<br />
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txt.append(title);<br />
&nbsp;&nbsp;&nbsp;&nbsp;//<br />
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;if (snippet != null &amp;&amp; !"".equals(snippet)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (txt.length() &gt; 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txt.append(":");<br />
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;txt.append(snippet);<br />
&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;//Paint paintText = new Paint();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;if (title != null &amp;&amp; title.length() &gt; 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paint.setColor(Color.BLACK);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paint.setTextSize(15);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;canvas.drawText(title, point.x, point.y, paint);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;}</p>
<p>&nbsp;&nbsp;&nbsp;//画线</p>
<p>&nbsp;&nbsp;&nbsp;boolean prevInBound = false;//前一个点是否在可视区域<br />
&nbsp;&nbsp;&nbsp;Point prev = null;<br />
&nbsp;&nbsp;&nbsp;int mapWidth = mapView.getWidth();<br />
&nbsp;&nbsp;&nbsp;int mapHeight = mapView.getHeight();<br />
&nbsp;&nbsp;&nbsp;//Paint paintLine = new Paint();<br />
&nbsp;&nbsp;&nbsp;paint.setColor(Color.RED);<br />
&nbsp;&nbsp;&nbsp;//paint.setPathEffect(new CornerPathEffect(10));<br />
&nbsp;&nbsp;&nbsp;paint.setStrokeWidth(2);<br />
&nbsp;&nbsp;&nbsp;int count = linePoints.size();</p>
<p>&nbsp;&nbsp;&nbsp;//Path path = new Path();<br />
&nbsp;&nbsp;&nbsp;//path.setFillType(Path.FillType.INVERSE_WINDING);<br />
&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; count; i++) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;GeoPoint geoPoint = linePoints.get(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;//projection.toPixels(geoPoint, point); //这一行似乎有问题<br />
&nbsp;&nbsp;&nbsp;&nbsp;point = projection.toPixels(geoPoint, null);<br />
&nbsp;&nbsp;&nbsp;&nbsp;if (prev != null) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (point.x &gt;= 0 &amp;&amp; point.x &lt;= mapWidth &amp;&amp; point.y &gt;= 0 &amp;&amp; point.y &lt;= mapHeight) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ((Math.abs(prev.x - point.x) &gt; 2 || Math.abs(prev.y - point.y) &gt; 2)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//这里判断点是否重合，重合的不画线，可能会导致画线不在路上<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;canvas.drawLine(prev.x, prev.y, point.x, point.y, paint);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//path.lineTo(point.x, point.y);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prev = point;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prevInBound = true;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//在可视区与之外<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (prevInBound) {//前一个点在可视区域内，也需要划线<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//path.lineTo(point.x, point.y);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;canvas.drawLine(prev.x, prev.y, point.x, point.y, paint);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prev = point;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prevInBound = false;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;} else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//path.moveTo(point.x, point.y);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prev = point;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;//canvas.drawPath(path, paint);<br />
&nbsp;&nbsp;&nbsp;canvas.restore();<br />
&nbsp;&nbsp;&nbsp;//DebugUtils.showMemory();<br />
&nbsp;&nbsp;}<br />
&nbsp;&nbsp;super.draw(canvas, mapView, shadow);<br />
&nbsp;}</p>
<p>}<br />
</p>
 <img src ="http://www.blogjava.net/super/aggbug/328661.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/super/" target="_blank">王卫华</a> 2010-08-12 14:21 <a href="http://www.blogjava.net/super/archive/2010/08/12/android-map.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>