因为想在一个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<String, Void,Bitmap>{
@Override
protected Bitmap doInBackground(String... params)
{
InputStream stream = null;
try
{
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("center", params[0])); //地图的中心,可以使中文地址,也可以是坐标,经纬度用逗号隔开
nameValuePairs.add(new BasicNameValuePair("width", GenericUtil.dp2px(380, getContext())+""));//返回图片的宽度
nameValuePairs.add(new BasicNameValuePair("height", GenericUtil.dp2px(200, getContext())+""));//返回图片的高度
nameValuePairs.add(new BasicNameValuePair("markers", params[0])); //标记的地址,可以使中文地址,或者编码后的坐标
nameValuePairs.add(new BasicNameValuePair("markerStyles", "-1,"+params[1]+",-1"));//标记地址的图标,自定义图标的话,必须用网络图标,并 //且小于5KB。
nameValuePairs.add(new BasicNameValuePair("zoom", "12"));
//HttpClientImp在http://blog.csdn.net/u012565107/article/details/20561701文章有讲解,简单的使用
stream = HttpClientImp.INSTANCE.getForStream("http://api.map.baidu.com/staticimage", null,nameValuePairs);
Bitmap bitmap = BitmapFactory.decodeStream(stream);
imageAche.put(params[0], new SoftReference<Bitmap>(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<String, SoftReference<Bitmap>> imageAche 去实现一个缓存。
用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.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import com.mengqi.base.util.LogUnit;
import com.mengqi.base.util.rsa.GenericUtil;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.util.AttributeSet;
import android.widget.ImageView;
/**
* @author Zhu Yan
*
* Created on 2014-3-13 下午1:24:19
*/
public class LocationImageView extends ImageView
{
public static final String TAG = "LocationImageView";
private static final Map<String, SoftReference<Bitmap>> imageAche
= new HashMap<String, SoftReference<Bitmap>>();
/**
* @param context
* @param attrs
* @param defStyle
*/
public LocationImageView(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
/**
* @param context
* @param attrs
* @param defStyle
*/
public LocationImageView(Context context, AttributeSet attrs)
{
super(context, attrs);
// TODO Auto-generated constructor stub
}
/**
* @param context
* @param attrs
* @param defStyle
*/
public LocationImageView(Context context)
{
super(context);
// TODO Auto-generated constructor stub
}
/**
* 可以是中文地址。也可以是坐标,坐标经纬度用逗号隔开。
* @param place
*/
public void setMapView(String place){
LogUnit.Log(TAG, "set map:"+place);
SoftReference<Bitmap> reference = imageAche.get(place);
if(reference != null){
Bitmap bitmap = reference.get();
if(bitmap == null){
new LoadMapImageTask().execute(place,"http://mengqitech.com/mobilecrm/static/map_pins/company_geo_pin.png");
}else {
setImageBitmap(bitmap);
}
}else {
new LoadMapImageTask().execute(place,"http://mengqitech.com/mobilecrm/static/map_pins/company_geo_pin.png");
}
}
// @Override
// protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
// {
// int width = MeasureSpec.getSize(widthMeasureSpec);
// int height = width*708/1317;
// super.onMeasure(widthMeasureSpec,
// MeasureSpec.makeMeasureSpec(height,
// MeasureSpec.getMode(heightMeasureSpec)));
// }
private final class LoadMapImageTask extends AsyncTask<String, Void,Bitmap>{
@Override
protected Bitmap doInBackground(String... params)
{
LogUnit.Log(TAG, "start do back:"+params[0]);
InputStream stream = null;
try
{
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("center", params[0]));
nameValuePairs.add(new BasicNameValuePair("width", GenericUtil.dp2px(380, getContext())+""));
nameValuePairs.add(new BasicNameValuePair("height", GenericUtil.dp2px(200, getContext())+""));
nameValuePairs.add(new BasicNameValuePair("markers", params[0]));
nameValuePairs.add(new BasicNameValuePair("markerStyles", "-1,"+params[1]+",-1"));
nameValuePairs.add(new BasicNameValuePair("zoom", "12"));
stream = HttpClientImp.INSTANCE.getForStream("http://api.map.baidu.com/staticimage", null,nameValuePairs);
Bitmap bitmap = BitmapFactory.decodeStream(stream);
imageAche.put(params[0], new SoftReference<Bitmap>(bitmap));
LogUnit.Log(TAG, "ok ");
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);
}
}
}