因为想在一个Model的属性下面有一个地址。
想在界面上显示一个MapView 然后覆写MapView的
@Override
public boolean onTouchEvent(MotionEvent arg0)
{
// return super.onTouchEvent(arg0);
return false;
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev)
{
// return super.dispatchTouchEvent(ev);
return false;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev)
{
// return super.onInterceptTouchEvent(ev);
return false;
}
这样的MapView就不可以接受触控事件。
但是问题出现了。在ScrollView上,拖动的时候就出现黑影。
我想是不是计算能力不够。反正就像一张图片,在第一次加载完成后,变成Bitmap,设置一个图片进去。
@Override
protected void dispatchDraw(Canvas canvas)
{
LogUnit.Log(TAG, "dispatchDraw ");
super.dispatchDraw(canvas);
}
@Override
protected boolean drawChild(Canvas canvas, View child, long drawingTime)
{
LogUnit.Log(TAG, "drawChild ");
return super.drawChild(canvas, child, drawingTime);
}
这样去打印发现,就是地图第一次加载的时候打印执行。也就是MapView自己本身就是带有这样的优化 的。拖动根本不会去调动上面的方法重绘。
所以我就去看了一个静态地图的一个api。这个APi设计应该相对是针对web的。
http://developer.baidu.com/map/staticimg.htm这是百度静态地图的API文档。
简单的说就是给百度一个连接,返回你想要的地图。
这个连接是GET请求,GET的URL的长度小于300。
Android端就是用ImageView去做的。用 AsyncTask多线程去下载图片。
private final class LoadMapImageTask extends AsyncTask{ @Override protected Bitmap doInBackground(String... params) { InputStream stream = null; try { List nameva luePairs = new ArrayList (); nameva luePairs.add(new BasicNameva luePair("center", params[0])); //地图的中心,可以使中文地址,也可以是坐标,经纬度用逗号隔开 nameva luePairs.add(new BasicNameva luePair("width", GenericUtil.dp2px(380, getContext())+""));//返回图片的宽度 nameva luePairs.add(new BasicNameva luePair("height", GenericUtil.dp2px(200, getContext())+""));//返回图片的高度 nameva luePairs.add(new BasicNameva luePair("markers", params[0])); //标记的地址,可以使中文地址,或者编码后的坐标 nameva luePairs.add(new BasicNameva luePair("markerStyles", "-1,"+params[1]+",-1"));//标记地址的图标,自定义图标的话,必须用网络图标,并 //且小于5KB。 nameva luePairs.add(new BasicNameva luePair("zoom", "12")); //HttpClientImp在http://blog.csdn.net/u012565107/article/details/20561701文章有讲解,简单的使用 stream = HttpClientImp.INSTANCE.getForStream("http://api.map.baidu.com/staticimage", null,nameva luePairs); Bitmap bitmap = BitmapFactory.decodeStream(stream); imageAche.put(params[0], new SoftReference (bitmap));//并且把得到的BitMAP储存到软引用中,有一定的缓存效果。如果是大量的图片 //可以尝试用 本地的文件做缓存。 return bitmap; } catch (Exception e) { // TODO: handle exception }finally{ try { stream.close();//关闭文件流。 } catch (Exception e2) { // TODO: handle exception } } return null; } @Override protected void onPostExecute(Bitmap result) { setImageBitmap(result); // result = null; super.onPostExecute(result); } }
并且用Map
用SoftReference(软引用)做缓存Google一下吧很多教程。
使用的时候调用SetMapView();把地址设置进去就行了。
效果:

下面是这个ImageView的全部代码。
/** * CopyRight 2014 ZhuYan * @author Zhu Yan * * All right reserved * * Created on 2014-3-13 下午1:24:19 */ package com.mengqi.base.ui.widget; import java.io.InputStream; import java.lang.ref.SoftReference; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.http.Nameva luePair; import org.apache.http.message.BasicNameva luePair; import com.mengqi.base.util.LogUnit; import com.mengqi.base.util.rsa.GenericUtil; imp