Android百度地图深入学习(2)

来源:互联网 发布:淘宝达人申请大v认证 编辑:程序博客网 时间:2024/05/21 21:45

添加覆盖物、覆盖物点击的处理

大体步骤:
Marker
OverlayOptions指定位置和图标
InfoWindow
BaiduMap.showInfoWindow();
BaiduMap.hideInfoWindow();

/baidudemo/src/com/xbmu/baidudemo/Info.java
package com.xbmu.baidudemo;import java.io.Serializable;import java.util.ArrayList;import java.util.List;public class Info implements Serializable{private double latitude;private double longitude;private int imgId;private String name;private String distance;private int zan;public static List<Info> infos = new ArrayList<Info>();static{infos.add(new Info(34.242652, 108.971171, R.drawable.a01, "英伦贵族小旅馆","距离209米", 1456));infos.add(new Info(34.242952, 108.972171, R.drawable.a02, "沙井国际洗浴会所","距离897米", 456));infos.add(new Info(34.242852, 108.973171, R.drawable.a03, "五环服装城","距离249米", 1456));infos.add(new Info(34.242152, 108.971971, R.drawable.a04, "老米家泡馍小炒","距离679米", 1456));}public Info(double latitude, double longitude, int imgId, String name,String distance, int zan) {super();this.latitude = latitude;this.longitude = longitude;this.imgId = imgId;this.name = name;this.distance = distance;this.zan = zan;}public double getLatitude() {return latitude;}public void setLatitude(double latitude) {this.latitude = latitude;}public double getLongitude() {return longitude;}public void setLongitude(double longitude) {this.longitude = longitude;}public int getImgId() {return imgId;}public void setImgId(int imgId) {this.imgId = imgId;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getDistance() {return distance;}public void setDistance(String distance) {this.distance = distance;}public int getZan() {return zan;}public void setZan(int zan) {this.zan = zan;}}
/baidudemo/res/layout/activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context=".MainActivity" >    <com.baidu.mapapi.map.MapView        android:id="@+id/bmapView"        android:layout_width="fill_parent"        android:layout_height="fill_parent"        android:clickable="true" />    <RelativeLayout        android:id="@+id/id_maker_ly"        android:layout_width="match_parent"        android:layout_height="220dp"        android:layout_alignParentBottom="true"        android:background="#cc4e5a6b"        android:clickable="true"        android:visibility="gone" >        <ImageView            android:id="@+id/id_info_img"            android:layout_width="fill_parent"            android:layout_height="150dp"            android:layout_marginBottom="10dp"            android:layout_marginLeft="12dp"            android:layout_marginRight="12dp"            android:layout_marginTop="10dp"            android:background="@drawable/img_border"            android:scaleType="fitXY"            android:src="@drawable/a01" >        </ImageView>        <RelativeLayout            android:layout_width="fill_parent"            android:layout_height="50dp"            android:layout_alignParentBottom="true"            android:background="@drawable/bg_map_bottom" >            <LinearLayout                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:layout_centerVertical="true"                android:layout_marginLeft="20dp"                android:orientation="vertical" >                <TextView                    android:id="@+id/id_info_name"                    android:layout_width="wrap_content"                    android:layout_height="wrap_content"                    android:text="老米家泡馍"                    android:textColor="#fff5eb" />                <TextView                    android:id="@+id/id_info_distance"                    android:layout_width="wrap_content"                    android:layout_height="wrap_content"                    android:text="距离200米"                    android:textColor="#fff5eb" />            </LinearLayout>            <LinearLayout                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:layout_alignParentRight="true"                android:layout_centerVertical="true"                android:layout_marginRight="20dp"                android:orientation="horizontal" >                <ImageView                    android:layout_width="wrap_content"                    android:layout_height="wrap_content"                    android:background="@drawable/map_zan"                    android:clickable="true" />                <TextView                    android:id="@+id/id_info_zan"                    android:layout_width="wrap_content"                    android:layout_height="wrap_content"                    android:layout_gravity="center"                    android:text="789"                    android:textColor="#fff5eb" />            </LinearLayout>        </RelativeLayout>    </RelativeLayout></RelativeLayout>
/baidudemo/res/menu/main.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android" >    <item        android:id="@+id/id_map_common"        android:showAsAction="never"        android:title="普通地图"/>    <item        android:id="@+id/id_map_site"        android:showAsAction="never"        android:title="卫星地图"/>    <item        android:id="@+id/id_map_traffic"        android:showAsAction="never"        android:title="实时交通(off)"/>    <item        android:id="@+id/id_map_location"        android:showAsAction="never"        android:title="我的位置"/>    <item        android:id="@+id/id_map_mode_common"        android:showAsAction="never"        android:title="普通模式"/>    <item        android:id="@+id/id_map_mode_following"        android:showAsAction="never"        android:title="跟随模式"/>    <item        android:id="@+id/id_map_mode_compass"        android:showAsAction="never"        android:title="罗盘模式"/>    <item        android:id="@+id/id_add_overlay"        android:showAsAction="never"        android:title="添加覆盖物"/></menu>
MainActivity.java
package com.xbmu.baidudemo;import java.io.Serializable;import java.util.List;import android.app.Activity;import android.content.Context;import android.graphics.Color;import android.graphics.Point;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.Window;import android.widget.ImageView;import android.widget.RelativeLayout;import android.widget.TextView;import android.widget.Toast;import com.baidu.location.BDLocation;import com.baidu.location.BDLocationListener;import com.baidu.location.LocationClient;import com.baidu.location.LocationClientOption;import com.baidu.mapapi.SDKInitializer;import com.baidu.mapapi.map.BaiduMap;import com.baidu.mapapi.map.BaiduMap.OnMapClickListener;import com.baidu.mapapi.map.BaiduMap.OnMarkerClickListener;import com.baidu.mapapi.map.BitmapDescriptor;import com.baidu.mapapi.map.BitmapDescriptorFactory;import com.baidu.mapapi.map.InfoWindow;import com.baidu.mapapi.map.InfoWindow.OnInfoWindowClickListener;import com.baidu.mapapi.map.MapPoi;import com.baidu.mapapi.map.MapStatusUpdate;import com.baidu.mapapi.map.MapStatusUpdateFactory;import com.baidu.mapapi.map.MapView;import com.baidu.mapapi.map.Marker;import com.baidu.mapapi.map.MarkerOptions;import com.baidu.mapapi.map.MyLocationConfiguration;import com.baidu.mapapi.map.MyLocationConfiguration.LocationMode;import com.baidu.mapapi.map.MyLocationData;import com.baidu.mapapi.map.OverlayOptions;import com.baidu.mapapi.model.LatLng;import com.xbmu.baidudemo.MyOrientationListener.OnOrientationListener;public class MainActivity extends Activity {private MapView mMapView;private BaiduMap mBaiduMap;private Context context;// 定位相关private LocationClient mLocationClient;private MyLocationListener mLocationListener;private boolean isFirstIn = true;private double mLatitude;private double mLongtitude;// 自定义定位图标private BitmapDescriptor mIconLocation;private MyOrientationListener myOrientationListener;private float mCurrentX;private LocationMode mLocationMode;// 覆盖物相关private BitmapDescriptor mMarker;private RelativeLayout mMarkerLy;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);// 在使用SDK各组件之前初始化context信息,传入ApplicationContext// 注意该方法要再setContentView方法之前实现SDKInitializer.initialize(getApplicationContext());setContentView(R.layout.activity_main);this.context = this;initView();// 初始化定位initLocation();initMarker();mBaiduMap.setOnMarkerClickListener(new OnMarkerClickListener() {@Overridepublic boolean onMarkerClick(Marker marker) {Bundle extraInfo = marker.getExtraInfo();Info info = (Info) extraInfo.getSerializable("info");ImageView iv = (ImageView) mMarkerLy.findViewById(R.id.id_info_img);TextView distance = (TextView) mMarkerLy.findViewById(R.id.id_info_distance);TextView name = (TextView) mMarkerLy.findViewById(R.id.id_info_name);TextView zan = (TextView) mMarkerLy.findViewById(R.id.id_info_zan);iv.setImageResource(info.getImgId());distance.setText(info.getDistance());name.setText(info.getName());zan.setText(info.getZan() + "");InfoWindow infoWindow;TextView tv = new TextView(context);tv.setBackgroundResource(R.drawable.location_tips);tv.setPadding(30, 20, 30, 50);tv.setText(info.getName());tv.setTextColor(Color.parseColor("#ffffff"));final LatLng latLng = marker.getPosition();Point p = mBaiduMap.getProjection().toScreenLocation(latLng);p.y -= 47;LatLng ll = mBaiduMap.getProjection().fromScreenLocation(p);// infoWindow = new InfoWindow(tv, ll,// new OnInfoWindowClickListener() {//// @Override// public void onInfoWindowClick() {// mBaiduMap.hideInfoWindow();//// }// });infoWindow = new InfoWindow(mMarker, ll, 0,new OnInfoWindowClickListener() {@Overridepublic void onInfoWindowClick() {mBaiduMap.hideInfoWindow();}});mBaiduMap.showInfoWindow(infoWindow);mMarkerLy.setVisibility(View.VISIBLE);return true;}});mBaiduMap.setOnMapClickListener(new OnMapClickListener() {@Overridepublic boolean onMapPoiClick(MapPoi arg0) {// TODO Auto-generated method stubreturn false;}@Overridepublic void onMapClick(LatLng arg0) {mMarkerLy.setVisibility(View.GONE);mBaiduMap.hideInfoWindow();}});}private void initMarker() {mMarker = BitmapDescriptorFactory.fromResource(R.drawable.maker);mMarkerLy = (RelativeLayout) findViewById(R.id.id_maker_ly);}private void initLocation() {mLocationMode = LocationMode.NORMAL;mLocationClient = new LocationClient(this);mLocationListener = new MyLocationListener();mLocationClient.registerLocationListener(mLocationListener);LocationClientOption option = new LocationClientOption();option.setCoorType("bd09ll");option.setIsNeedAddress(true);option.setOpenGps(true);option.setScanSpan(1000);mLocationClient.setLocOption(option);// 初始化图标mIconLocation = BitmapDescriptorFactory.fromResource(R.drawable.navi_map_gps_locked);myOrientationListener = new MyOrientationListener(context);myOrientationListener.setOnOrientationListener(new OnOrientationListener() {@Overridepublic void onOrientationChanged(float x) {mCurrentX = x;}});}private void initView() {mMapView = (MapView) findViewById(R.id.bmapView);mBaiduMap = mMapView.getMap();MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15.0f);mBaiduMap.setMapStatus(msu);}@Overrideprotected void onPause() {super.onPause();// 在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理mMapView.onPause();}@Overrideprotected void onStart() {super.onStart();// 开启定位mBaiduMap.setMyLocationEnabled(true);if (!mLocationClient.isStarted())mLocationClient.start();// 开启方向传感器myOrientationListener.start();}@Overrideprotected void onResume() {super.onResume();// 在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理mMapView.onResume();}@Overrideprotected void onStop() {super.onStop();// 关闭定位mBaiduMap.setMyLocationEnabled(false);mLocationClient.stop();// 停止方向传感器myOrientationListener.stop();}@Overrideprotected void onDestroy() {super.onDestroy();// 在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理mMapView.onDestroy();}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {switch (item.getItemId()) {case R.id.id_map_common:mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);break;case R.id.id_map_site:mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);break;case R.id.id_map_traffic:if (mBaiduMap.isTrafficEnabled()) {// 为true,可以进行实时交通。// 菜单项再点击一次就不能进行实时交通,并修改显示信息mBaiduMap.setTrafficEnabled(false);item.setTitle("实时交通(off)");} else {mBaiduMap.setTrafficEnabled(true);item.setTitle("实时交通(on)");}break;case R.id.id_map_location:centerToMyLocation();break;case R.id.id_map_mode_common:mLocationMode = LocationMode.NORMAL;break;case R.id.id_map_mode_following:mLocationMode = LocationMode.FOLLOWING;break;case R.id.id_map_mode_compass:mLocationMode = LocationMode.COMPASS;break;case R.id.id_add_overlay:addOverlays(Info.infos);default:break;}return super.onOptionsItemSelected(item);}/** * 添加覆盖物 *  * @param infos */private void addOverlays(List<Info> infos) {mBaiduMap.clear();LatLng latLng = null;Marker marker = null;OverlayOptions options;for (Info info : infos) {// 经纬度latLng = new LatLng(info.getLatitude(), info.getLongitude());// 图标options = new MarkerOptions().position(latLng).icon(mMarker).zIndex(5);marker = (Marker) mBaiduMap.addOverlay(options);Bundle bundle = new Bundle();bundle.putSerializable("info", info);marker.setExtraInfo(bundle);}MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);mBaiduMap.setMapStatus(msu);}/** 定位到我的位置 */private void centerToMyLocation() {LatLng latLng = new LatLng(mLatitude, mLongtitude);MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);mBaiduMap.animateMapStatus(msu);}private class MyLocationListener implements BDLocationListener {@Overridepublic void onReceiveLocation(BDLocation location) {// 构造定位数据MyLocationData data = new MyLocationData.Builder()//.direction(mCurrentX)//.accuracy(location.getRadius())//.latitude(location.getLatitude())//.longitude(location.getLongitude()).build();mBaiduMap.setMyLocationData(data);// 设置自定义图标MyLocationConfiguration config = new MyLocationConfiguration(mLocationMode, true, mIconLocation);mBaiduMap.setMyLocationConfigeration(config);// 更细经纬度mLatitude = location.getLatitude();mLongtitude = location.getLongitude();if (isFirstIn) {LatLng latLng = new LatLng(location.getLatitude(),location.getLongitude());MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng);mBaiduMap.animateMapStatus(msu);isFirstIn = false;Toast.makeText(context, location.getAddrStr(), 0).show();}}}}
运行效果:


全部代码:http://download.csdn.net/detail/btt2013/9508829

感谢慕课网提供的教学资料,不断学习,乐于分享。


0 0