Android 当我的位置在上面时隐藏标记,当我离开时再次显示标记
我在地图中放置了许多标记,并且已经提供了我的当前位置服务,所以我只想在我的当前位置出现时隐藏标记,并在我离开时再次显示标记,请在回复时具体说明,因为我是“使用安卓Studio 1.5.1”的初学者 这是我在MapsActivity.java中的代码Android 当我的位置在上面时隐藏标记,当我离开时再次显示标记,android,google-maps,google-maps-android-api-2,Android,Google Maps,Google Maps Android Api 2,我在地图中放置了许多标记,并且已经提供了我的当前位置服务,所以我只想在我的当前位置出现时隐藏标记,并在我离开时再次显示标记,请在回复时具体说明,因为我是“使用安卓Studio 1.5.1”的初学者 这是我在MapsActivity.java中的代码 package com.example.karim.trysomething; import android.content.Context; import android.content.IntentSender; import android.
package com.example.karim.trysomething;
import android.content.Context;
import android.content.IntentSender;
import android.content.pm.PackageManager;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationManager;
import android.support.v4.app.ActivityCompat;
import android.support.v4.app.FragmentActivity;
import android.os.Bundle;
import android.util.Log;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;
public class MapsActivity extends FragmentActivity implements
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener,
LocationListener {
public static final String TAG = MapsActivity.class.getSimpleName();
private final static int CONNECTION_FAILURE_RESOLUTION_REQUEST = 9000;
private GoogleMap mMap;
private GoogleApiClient mGoogleApiClient;
private LocationRequest mLocationRequest;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_maps);
setUpMapIfNeeded();
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.addApi(LocationServices.API)
.build();
mLocationRequest = LocationRequest.create()
.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
.setInterval(10 * 1000) // 10 seconds, in milliseconds
.setFastestInterval(1000); // 1 second, in milliseconds
}
@Override
protected void onResume() {
super.onResume();
setUpMapIfNeeded();
mGoogleApiClient.connect();
}
@Override
protected void onPause() {
super.onPause();
if (mGoogleApiClient.isConnected()) {
LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, this);
mGoogleApiClient.disconnect();
}
}
private void setUpMap() {
if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
String[] permissions,
return;
}
mMap.setMyLocationEnabled(true);
LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
String provider = locationManager.getBestProvider(criteria, true);
Location myLocation = locationManager.getLastKnownLocation(provider);
mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
double latitude = myLocation.getLatitude();
double longitude = myLocation.getLongitude();
LatLng latLng = new LatLng(latitude, longitude);
mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));
mMap.animateCamera(CameraUpdateFactory.zoomTo(14));
mMap.addMarker(new MarkerOptions().position(new LatLng(latitude, longitude)).title("You are here!").snippet("Consider yourself located"));
mMap.addMarker( new MarkerOptions()
.position(new LatLng(30.121683, 31.139405) )
.title("Location")
.snippet("ركنة المطحن")).showInfoWindow();
}
@Override
public void onConnected(Bundle bundle) {
if (ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
return;
}
Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient);
if (location == null) {
LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this);
}
}
@Override
public void onConnectionSuspended(int i) {
}
@Override
public void onConnectionFailed(ConnectionResult connectionResult) {
if (connectionResult.hasResolution()) {
try {
connectionResult.startResolutionForResult(this, CONNECTION_FAILURE_RESOLUTION_REQUEST);
} catch (IntentSender.SendIntentException e) {
e.printStackTrace();
}
} else {
Log.i(TAG, "Location services connection failed with code " + connectionResult.getErrorCode());
}
}
@Override
public void onLocationChanged(Location location) {
}
}
在深入研究代码之前,您应该定义“显示”规则(逻辑)。简单地说,假设你每次都在一个半径为250米的圆心上(粉红色标记)。当位置改变时,将每个标记位置与圆圈进行比较。隐藏位于圆中的标记,并显示其他标记 每当您的位置发生变化时,调用如下方法
// You have received new location and calling this method.
private void filterMarkers(LatLng myLocation){
double myLatitude = myLocation.latitude;
double myLongitude = myLocation.longitude;
float[] distance = new float[2];
for(int m = 0; m < mMarkers.size(); m++){
Marker marker = mMarkers.get(m);
LatLng position = marker.getPosition();
double lat = position.latitude;
double lon = position.longitude;
/* distanceBetween method calculates the distance between two locations.
As i said above, you are in center of circle, means your location and
circle's location are same.
Also you could look distanceBetween method
http://developer.android.com/reference/android/location/Location.html#distanceBetween(double, double, double, double, float[])
*/
Location.distanceBetween(lat, lon, myLatitude,
myLongitude, distance);
boolean inCircle = distance[0] <= mCircleRadius;
// If marker is in circle hide it, otherwise show.
marker.setVisible(!inCircle);
}
}
//您已收到新位置并调用此方法。
专用空隙过滤器标记器(板条位置){
双myLatitude=myLocation.纬度;
双米经度=米位置。经度;
浮动[]距离=新浮动[2];
对于(int m=0;m 布尔inCircle=distance[0]在开始编写代码之前,您应该定义“显示”规则(逻辑)。简单地说,假设您每次都位于半径为250米的圆心(粉红色标记)。当您的位置发生变化时,将每个标记位置与您的圆进行比较。隐藏位于圆中的标记,并显示其他标记
每当您的位置发生变化时,调用如下方法
// You have received new location and calling this method.
private void filterMarkers(LatLng myLocation){
double myLatitude = myLocation.latitude;
double myLongitude = myLocation.longitude;
float[] distance = new float[2];
for(int m = 0; m < mMarkers.size(); m++){
Marker marker = mMarkers.get(m);
LatLng position = marker.getPosition();
double lat = position.latitude;
double lon = position.longitude;
/* distanceBetween method calculates the distance between two locations.
As i said above, you are in center of circle, means your location and
circle's location are same.
Also you could look distanceBetween method
http://developer.android.com/reference/android/location/Location.html#distanceBetween(double, double, double, double, float[])
*/
Location.distanceBetween(lat, lon, myLatitude,
myLongitude, distance);
boolean inCircle = distance[0] <= mCircleRadius;
// If marker is in circle hide it, otherwise show.
marker.setVisible(!inCircle);
}
}
//您已收到新位置并调用此方法。
专用空隙过滤器标记器(板条位置){
双myLatitude=myLocation.纬度;
双米经度=米位置。经度;
浮动[]距离=新浮动[2];
对于(int m=0;m 布尔inCircle=距离[0]要执行此操作,您需要
1.将当前lat/long与标记lat/long进行比较,在诸如onMarkerRender之类的回调中执行此操作,然后更改当前标记。
2.稍后保留当前标记切换到下一个标记时更改相同的标记
1.将当前lat/long与标记lat/long进行比较,在诸如onMarkerRender之类的回调中执行此操作,然后更改当前标记。
2.以后保留当前标记切换到下一个标记时更改相同的标记