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

因为想在一个Model的属性下面有一个地址。

想在界面上显示一个MapView 然后覆写MapView的

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@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,设置一个图片进去。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
@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多线程去下载图片。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
     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);
         }
         
     }</bitmap></namevaluepair></namevaluepair></string,>


并且用Map<string, softreference> imageAche 去实现一个缓存。

用SoftReference(软引用)做缓存Google一下吧很多教程。


使用的时候调用SetMapView();把地址设置进去就行了。

效果:

\

下面是这个ImageView的全部代码。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/**
  * 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);
         }
         
     }
     
 
     
}
</bitmap></namevaluepair></namevaluepair></string,></bitmap></string,></string,>



转自:http://www.2cto.com/kf/201403/288494.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值