我想用我自己的图像替换Android Maps V2用于“我的位置”(小蓝点/箭头)的默认图标。我创建了自己的图块provider
,它会带来一些主要是蓝色的地图,因此很难看到默认的“我的位置”图标。以前我会覆盖MyLocationOverlay
的draw方法,但新API中似乎没有。任何帮助都会很棒!
编辑:我还需要图标才能旋转,就像箭头一样,取决于你面对的方式。所以我不能只使用正常marker
:(基本上我只需要为该箭头创建一个自定义图像..
更新大家好,Google Play的更新现在允许平面标记和标记旋转,这正是我所需要的。
答案 0 :(得分:29)
我的简单解决方法就是禁用Google地图的“我的位置”
使用我的图标在Map上创建ImageView,然后使用
捕获ImageViewonClick和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()));
}
}
答案 1 :(得分:21)
Google Play服务的最新更新现在允许您使用“平面”标记并旋转它们,这正是我所需要的。这是我实现它的方式的简单版本。我可以做一些优化和调整动画的工作,但它目前正在完成工作。欢迎任何反馈。
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);
}
}
});
}
答案 2 :(得分:4)
从3.1.36开始,您无法更改图标(我觉得它将来会发生变化,但考虑到API v2改进实施的速度,它不会在圣诞节之前)。
但您现在可以使用标记,因为它具有setIcon
功能。
基本上你必须忘记GoogleMap.setMyLocationEnabled
,因为它总会出现在上面。您将创建自己的LocationClient
并使用lat,long并从Location
开始更新Marker
。另外,添加Circle
并使用精度来产生类似于默认myLocation可视化效果的效果。
答案 3 :(得分:1)
您无法在Google地图上处理MyLocation按钮的点击事件,但是有一个技巧可以根据您的需要获得行为:
首先在layout.xml文件中添加map和dummy MyLocation按钮
您可以在相对布局的帮助下实现这一点:
<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>
您可以在Google地图上看到“mylocation.png”
LocationManager locationManager = (LocationManager)getSystemService(LOCATION_SERVICE);
Criteria criteria = new Criteria();
String s = locationManager.getBestProvider(criteria, false);
Location location = locationManager.getLastKnownLocation(s);
调用虚拟MyLocation按钮的点击事件,您将在其中添加标记
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));
答案 4 :(得分:0)
试试这个;我用这个在地图上画一条路线,但是我为标记和我的位置设置了图标 声明此信息以查看您的位置:
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);
并创建一个这样的函数,我用于在地图上绘制,但我在标记和我的位置设置图标:
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();
}
}
答案 5 :(得分:0)
以下是访问位置按钮的代码:
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);