因为想在一个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; }
但是问题出现了。在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); }
所以我就去看了一个静态地图的一个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); } } }