Android 当我的位置在上面时隐藏标记,当我离开时再次显示标记

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.

我在地图中放置了许多标记,并且已经提供了我的当前位置服务,所以我只想在我的当前位置出现时隐藏标记,并在我离开时再次显示标记,请在回复时具体说明,因为我是“使用安卓Studio 1.5.1”的初学者

这是我在MapsActivity.java中的代码

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.以后保留当前标记切换到下一个标记时更改相同的标记