Android Maps API v2更改MyLocation图标

我想用自己的图片replaceAndroid Maps V2用于“我的位置”(小蓝点/箭头)的默认图标。 我创build了自己的磁贴provider ,这个磁贴provider了一些以蓝色为主的地图,因此默认的“我的位置”图标很难看清楚。 以前我只是重写了MyLocationOverlay的draw方法,但是在新的api中似乎没有。 任何帮助将是伟大的!

编辑:我也需要图标能够旋转,就像箭头一样,取决于你面对的方式。 所以我不能只使用一个正常的marker :(基本上我只需要为该箭头创build一个自定义图像..

在这里输入图像说明

更新大家好 ,现在更新到谷歌播放允许平面标记和标记旋转,这正是我所需要的。

我简单的解决方法就是禁用Google地图的“我的位置”

并使用我的图标在Map上创buildImageView,然后捕获ImageView

onClick和getMyLocation,onClick中的animateCamera

  this.mGoogleMap.getUiSettings().setMyLocationButtonEnabled(false); this.mGoogleMap.setMyLocationEnabled(true); 

 @Override public void onClick(final View v) { Location location = this.mGoogleMap.getMyLocation(); if (location != null) { LatLng target = new LatLng(location.getLatitude(), location.getLongitude()); CameraPosition position = this.mGoogleMap.getCameraPosition(); Builder builder = new CameraPosition.Builder(); builder.zoom(15); builder.target(target); this.mGoogleMap.animateCamera(CameraUpdateFactory.newCameraPosition(builder.build())); } } 

现在,Google Play服务的最新更新允许您使用“平面”标记并旋转它们,这正是我所需要的。 这是我实现它的一个简单版本。 我可以做一些合理的事情来优化和调整animation,但是现在就做好了。 任何反馈是欢迎的。

 Marker mPositionMarker; GoogleMap mMap; @Override public void onLocationChanged(Location location) { if (location == null) return; if (mPositionMarker == null) { mPositionMarker = mMap.addMarker(new MarkerOptions() .flat(true) .icon(BitmapDescriptorFactory .fromResource(R.drawable.positionIndicator)) .anchor(0.5f, 0.5f) .position( new LatLng(location.getLatitude(), location .getLongitude()))); } animateMarker(mPositionMarker, location); // Helper method for smooth // animation mMap.animateCamera(CameraUpdateFactory.newLatLng(new LatLng(location .getLatitude(), location.getLongitude()))); } public void animateMarker(final Marker marker, final Location location) { final Handler handler = new Handler(); final long start = SystemClock.uptimeMillis(); final LatLng startLatLng = marker.getPosition(); final double startRotation = marker.getRotation(); final long duration = 500; final Interpolator interpolator = new LinearInterpolator(); handler.post(new Runnable() { @Override public void run() { long elapsed = SystemClock.uptimeMillis() - start; float t = interpolator.getInterpolation((float) elapsed / duration); double lng = t * location.getLongitude() + (1 - t) * startLatLng.longitude; double lat = t * location.getLatitude() + (1 - t) * startLatLng.latitude; float rotation = (float) (t * location.getBearing() + (1 - t) * startRotation); marker.setPosition(new LatLng(lat, lng)); marker.setRotation(rotation); if (t < 1.0) { // Post again 16ms later. handler.postDelayed(this, 16); } } }); } 

从3.1.36开始,你不能改变图标(我感觉它将来会改变,但是看看API v2改进实施的速度,它不会在圣诞节前)。

你现在可以使用标记,因为它具有setIconfunction。

基本上你必须忘记GoogleMap.setMyLocationEnabled ,因为它总是会出现在上面。 您将改为创build您自己的LocationClient并使用Lat,long和方位来更新Marker 。 另外添加一个Circle并使用准确性来产生类似于默认myLocation可视化的效果。

你不能处理谷歌地图上的MyLocationbutton的点击事件,但有一个技巧,你可以根据你的需要获得行为:
首先在你的layout.xml文件中添加map和dummy MyLocationbutton。
你可以在相对布局的帮助下实现这个function:

 <RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent" > <fragment android:id="@+id/map" android:name="com.google.android.gms.maps.SupportMapFragment" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <Button android:id="@+id/myLocationButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_marginRight="10dp" android:layout_marginTop="10dp" android:background="@drawable/mylocation" /> </RelativeLayout> 

你可以把“mylocation.png”看起来像你在谷歌地图上看到的。
LocationManager locationManager = (LocationManager)getSystemService(LOCATION_SERVICE);

  Criteria criteria = new Criteria(); String s = locationManager.getBestProvider(criteria, false); Location location = locationManager.getLastKnownLocation(s); 

呼叫您的虚拟“我的位置”button的点击事件,您将在其中添加标记
private GoogleMap googleMap; googleMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap(); LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); googleMap.addMarker(new MarkerOptions().icon(YOUR_MODIFIED_ICON).position(latLng).title(TITLE).snippet(SNIPET));
通过这种方式,您可以修改Google地图的默认图标。
是的,你也需要设置缩放级别:
googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));

尝试这个; 我使用这个在地图上绘制路线,但是我为标记和我的位置设置了图标。声明这个以查看您的位置:

  LocationManager locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); Criteria criteria = new Criteria(); String provider = locationManager.getBestProvider(criteria, true); Location myLocation= locationManager.getLastKnownLocation(provider); longitude = myLocation.getLongitude(); latitude = myLocation.getLatitude(); fromPosition = new LatLng(latitude, longitude); 

并创build一个这样的function,我用于在地图上绘制,但我在标记和我的位置上设置图标:

 mGoogleMap.clear(); if(response.equalsIgnoreCase("Success")) { ArrayList<LatLng> directionPoint = v2GetRouteDirection.getDirection(document); PolylineOptions rectLine = new PolylineOptions().width(7).color(Color.BLUE); for (int i = 0; i < directionPoint.size(); i++) { rectLine.add(directionPoint.get(i)); } // Adding route on the map mGoogleMap.setOnMarkerClickListener(MainActivity.this); mGoogleMap.addPolyline(rectLine); markerOptions.position(fromPosition); markerOptions.draggable(true); Marker1 = mGoogleMap.addMarker(new MarkerOptions() .position(Estadio) .title("Estadio Cuscatlan") .snippet("Estadio Cuscatlan") .icon(BitmapDescriptorFactory .fromResource(R.drawable.mapmarker))); Marker2 = mGoogleMap.addMarker(new MarkerOptions() .position(Metrocentro) .title("Metrocentro") .snippet("Metrosuelo") .icon(BitmapDescriptorFactory .fromResource(R.drawable.mapmark Marker3 = mGoogleMap.addMarker(new MarkerOptions() .position(Mejicanos) .title("Mejicanos") .snippet("Mejicanos") .icon(BitmapDescriptorFactory .fromResource(R.drawable.mapmarker))); MarkerMe = mGoogleMap.addMarker(new MarkerOptions() .position(fromPosition) .icon(BitmapDescriptorFactory .fromResource(R.drawable.car64))); } Dialog.dismiss(); } } 

这是访问位置button的代码:

 View mv=findViewById(R.id.map); View locationButton = ((View) mv.findViewById(Integer.parseInt("1")).getParent()).findViewById(Integer.parseInt("2")); RelativeLayout.LayoutParams rlp = (RelativeLayout.LayoutParams) locationButton.getLayoutParams(); // position on right bottom rlp.addRule(RelativeLayout.ALIGN_PARENT_TOP, 0); rlp.addRule(RelativeLayout.ALIGN_PARENT_TOP, RelativeLayout.TRUE); rlp.setMargins(0, 180, 180, 0); 

您可以通过执行以下操作来更改当前位置图标

 mMap.addMarker(new MarkerOptions().position(new LatLng(location.getLatitude(), location.getLongitude())) .title("Current Location") .snippet(address) .icon(BitmapDescriptorFactory.fromResource(R.drawable.your_image)));