Android Maps V2が[現在地](小さな青い点/矢印)に使用するデフォルトのアイコンを自分の画像に置き換えたいと思います。自分のタイルを作成しましたprovider
は、主に青色のマップをいくつか表示するため、デフォルトの[現在地]アイコンは非常に見づらくなります。以前は、MyLocationOverlay
のdrawメソッドをオーバーライドしていましたが、新しいAPIに含まれているようです。
編集:また、アイコンが回転できるようにする必要があります。これは、あなたが向いている方向によって矢印がするのと同じ方法です。したがって、通常のmarker
を使用することはできません:(基本的に、その矢印のカスタムイメージを作成するだけです。
更新こんにちは、Google Playの更新により、フラットマーカーとマーカーの回転が可能になりました。
Google Play Servicesの最新のアップデートにより、「フラット」マーカーを使用して回転できるようになりました。これはまさに必要なものです。これは、私が実装した方法の簡単なバージョンです。おそらく、アニメーションを最適化して微調整するためにできることはかなりありますが、今のところはうまくいきます。フィードバックは大歓迎です。
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);
}
}
});
}
私の簡単な解決方法は、単にGoogleマップの「私の場所」を無効にすることです
私のアイコンでマップ上にImageViewを作成し、次に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()));
}
}
3.1.36の時点では、アイコンを変更することはできません(将来的には変更されると思われますが、API v2の改善の実装の速度を見ると、クリスマス前になりません)。
ただし、setIcon
関数があるため、マーカーを使用できます。
基本的に、GoogleMap.setMyLocationEnabled
、常に上に表示されるため。代わりに、独自のLocationClient
を作成し、Location
のlat、long、bearingを使用してMarker
を更新します。さらに、Circle
を追加し、精度を使用して、デフォルトのmyLocationビジュアライゼーションと同様の効果を得ます。
GoogleマップでMyLocationボタンのクリックイベントを処理することはできませんが、必要に応じて動作を取得できるトリックがあります。
最初にlayout.xmlファイルにマップとダミーの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>
_
「mylocation.png」は、Googleマップに表示されるように見えます。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));
ロケーションボタンにアクセスするコードは次のとおりです。
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);
これを試して;私はこれを地図上にルートを描くために使用しますが、マーカーと私の場所にアイコンを設定しますあなたの場所を見るためにこれを宣言します:
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();
}
}