解决百度地图MapView在ScrollView中的拖动黑影(一)

2014-11-24 00:38:37 · 作者: · 浏览: 0

因为想在一个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 > 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.Nameva luePair;
import org.apache.http.message.BasicNameva luePair;

import com.mengqi.base.util.LogUnit;
import com.mengqi.base.util.rsa.GenericUtil;

imp