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

因为想在一个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);
        }
    	
    }
	

    
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值