Back

【Lesson 11】 高德地图中使用marker 和 InfoWindow 以及相关的事件。

发布时间: 2016-01-10 06:45:00

refer to:  http://lbs.amap.com/api/android-sdk/guide/overlay/

我们使用高德地图的场景之一,就是在地图上标注一些点(POI), 这些点显示出基本POI的信息

点击之后,会响应一些事件。

Marker

在基础的demo基础上:

Activity.java: 

    
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.Marker;
import com.amap.api.maps.model.MarkerOptions;

// .. .其他代码
         if(aMap == null) {
            aMap = mapView.getMap();
            setup_map();   // 这行代码是新增的
         }
    private  void setup_map() {

        addMarkersToMap();
    }
    private void addMarkersToMap(){
        marker = aMap.addMarker(
                new MarkerOptions()
                        .title("学习android map")
                        .snippet("路啦啦啦啦啦")
                        .icon(
                                BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE)
                        ).draggable(false)
        );
        marker.setPosition(new LatLng(39.99, 116.47));
    }

    // 下面四个呆呆的方法一定要带着
    @Override
    protected void onResume(){
        super.onResume();
        mapView.onResume();
    }

    @Override
    protected void onPause(){
        super.onPause();
        mapView.onPause();
    }
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        mapView.onSaveInstanceState(outState);
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        mapView.onDestroy();
    }

几个点:

1. onPause,  onResume  等函数一定要有

2.  
marker.setRotateAngle(90);
// marker.setPositionByPixels(600, 400);
marker.setPosition(new LatLng(39.99, 116.47));
Marker 是由几部分总成: 1. 小图钉图标。 2. 标题。 3. infoWindow  ,
setRotateAngle会让小图钉做旋转的。 如果不设置的话,它会被隐藏在 InfoWindow后面。

3. setPositionByPixels 是让小图钉固定在屏幕的相对位置,  不会随着地图的移动而移动。 如果希望做成正统的地图上的图钉,

就要用 setPosition 方法。

点击 Marker (标记) 的事件

1. 要让activity 实现一个 Listener:+public class DisplayMessageActivity extends AppCompatActivity
+ implements OnMarkerClickListener

2. 实现这个方法:

+     @Override
+     public boolean onMarkerClick(final Marker marker){
+         TextView text_view = (TextView)findViewById(R.id.message_content);
+         text_view.setText("你点击了我" + marker.getTitle());
+         marker.showInfoWindow();
+         return false;
+     }

3. 记得把方法给绑定到marker上: 

aMap.setOnMarkerClickListener(this)

显示信息窗体 InfoWindow

显示的方法:marker.showInfoWindow();

下面,是自定义窗口。 命名不重要,里面对元素的操作,就是最简单的 get/set 各种属性。

	/**
	 * 自定义infowinfow窗口
	 */
	public void render(Marker marker, View view) {
		if (radioOption.getCheckedRadioButtonId() == R.id.custom_info_contents) {
			((ImageView) view.findViewById(R.id.badge))
					.setImageResource(R.drawable.badge_sa);
		} else if (radioOption.getCheckedRadioButtonId() == R.id.custom_info_window) {
			ImageView imageView = (ImageView) view.findViewById(R.id.badge);
			imageView.setImageResource(R.drawable.badge_wa);
		}
		String title = marker.getTitle();
		TextView titleUi = ((TextView) view.findViewById(R.id.title));
		if (title != null) {
			SpannableString titleText = new SpannableString(title);
			titleText.setSpan(new ForegroundColorSpan(Color.RED), 0,
					titleText.length(), 0);
			titleUi.setTextSize(15);
			titleUi.setText(titleText);

		} else {
			titleUi.setText("");
		}
		String snippet = marker.getSnippet();
		TextView snippetUi = ((TextView) view.findViewById(R.id.snippet));
		if (snippet != null) {
			SpannableString snippetText = new SpannableString(snippet);
			snippetText.setSpan(new ForegroundColorSpan(Color.GREEN), 0,
					snippetText.length(), 0);
			snippetUi.setTextSize(20);
			snippetUi.setText(snippetText);
		} else {
			snippetUi.setText("");
		}
	}

注意:

1. 高德地图的marker, 点击之后,会自动弹出 info window, 光 hideInfoWindow不行。

2. 要有title, 否则info window 弹不出来

3.  参考: http://www.th7.cn/Program/java/201512/723072.shtml  

4. 所以,要隐藏高德地图中的marker中的 info window, 不能实现: 点击marker, 显示,再点击,隐藏这样的操作。 只能实现:点击地图其他地方,或者infowindow, 隐藏 infowindow.  参考:http://bbs.csdn.net/topics/390440550?page=1

Back