【问题标题】:How to move map under a marker? android如何在标记下移动地图?安卓
【发布时间】:2015-11-29 14:40:20
【问题描述】:

我想实现一个地图的拖动效果。当我们拖动地图时,标记应显示当前位置或纬度和经度。它在 Uber 应用程序中完成,如下所示:

在此标记中,在拖动地图时显示当前位置。我怎样才能做到这一点???

ChooseFromMapActivity

    public class ChooseFromMapActivity extends AppCompatActivity implements GoogleMap.OnCameraChangeListener {

    TextView textShowAddress;
    private GoogleMap mMap;
    LatLng latLng;
    double latitude = 17.385044;
    double longitude = 78.486671;
    float zoom;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_choose_from_map);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mMap = mapFragment.getMap();
        mMap.setMyLocationEnabled(true);
        LatLng center = mMap.getCameraPosition().target;
        mMap.getUiSettings().setZoomControlsEnabled(true);
        mMap.getUiSettings().setRotateGesturesEnabled(true);
        mMap.getUiSettings().setScrollGesturesEnabled(true);
        latLng = new LatLng(-34, 151);

     mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));

        textShowAddress = (TextView) findViewById(R.id.textShowAddress);
        mMap.addMarker(new MarkerOptions()
                .position(latLng)
                .draggable(false)
                .title("sent location :)"))
        .setDraggable(false);
        }
    }
}

【问题讨论】:

  • 你在找这个吗:Draggable Map like UBER
  • 似乎是一样的。我已经尝试过该代码,但它不起作用..

标签: java android android-mapview drag marker


【解决方案1】:

有些人很困惑如何解决这里是简单的解决方案 第 1 步:创建一个布局,其中包含谷歌地图框架和一个位于中心的图像视图

    <FrameLayout
        android:id="@+id/map"
        android:name="com.google.android.gms.maps.SupportMapFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_above="@+id/btn_save" />

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:src="@drawable/pin" /> 

第二步:创建方法initialize map并放到onCreate()中...意思是在activity开始时会初始化map frame...这里需要创建一个SupportMapFragment实例

/*==================== initialize map fragment  ==================*/


private void initilizeMap() {

        mSupportMapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map_profile);

        if (mSupportMapFragment == null) {
            FragmentManager fragmentManager = getChildFragmentManager();
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
            mSupportMapFragment = SupportMapFragment.newInstance();
            fragmentTransaction.replace(R.id.map_profile, mSupportMapFragment).commit();
        }

        Log.d("mSupportMapFragment", "------" + mSupportMapFragment + "-----googleMap---" + googleMap);
    }

Step3:现在创建一个 LatLng 实例(私有 LatLng latlng)(它将返回地图的居中纬度和经度以及我们在中心拥有的图像,所以看起来我们拥有的标记图像是返回纬度和经度)

第四步:创建方法 IniLizeMap();这会将属性和位置设置为地图。

public void IniLizeMap() {
        try {
            mSupportMapFragment.getMapAsync(new OnMapReadyCallback() {
                @Override
                public void onMapReady(GoogleMap googleMap) {

                    googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);

                    // Showing / hiding your current location
                    googleMap.setMyLocationEnabled(false);

                    // Enable / Disable zooming controls
                    googleMap.getUiSettings().setZoomControlsEnabled(false);

                    // Enable / Disable my location button
                    googleMap.getUiSettings().setMyLocationButtonEnabled(false);

                    // Enable / Disable Compass icon
                    googleMap.getUiSettings().setCompassEnabled(false);

                    // Enable / Disable Rotate gesture`enter code here`
                    googleMap.getUiSettings().setRotateGesturesEnabled(false);

                    // Enable / Disable zooming functionality
                    googleMap.getUiSettings().setZoomGesturesEnabled(false);   

                    googleMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
                        @Override
                        public void onCameraChange(CameraPosition cameraPosition) {
                            latLng = cameraPosition.target;
                            googleMap.clear();
                            try {
                                getAddress(latLng.latitude, latLng.longitude);
                                Log.e("Changing address", getAddress(latLng.latitude, latLng.longitude));
                                Log.e("Latitude", latLng.latitude + "");
                                Log.e("Longitude", latLng.longitude + "");
                                String lat = latLng.latitude + "";
                                String lng = latLng.longitude + "";
                                String location = getAddress(latLng.latitude, latLng.longitude);
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    });                 



                    CameraPosition cameraPosition = new CameraPosition.Builder()
                            .target(new LatLng(Double.parseDouble(Utils.lat),
                                    Double.parseDouble(Utils.lng))).zoom(14).build();

                    googleMap.animateCamera(CameraUpdateFactory
                            .newCameraPosition(cameraPosition));
                }


            });

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

在此方法中,我将 setOnCameraChangeListener 应用于 googlemap,这是我们问题的核心解决方案,它将在移动相机时返回居中位置,现在如果您想在移动相机时获取地址,则创建方法 getAddress 将返回移动地图时的字符串地址,所以这里是

第 5 步:创建方法 getAddress(double lat,double lng) 需要两个 dubbles

 public String getAddress(double latitude, double longitude) {
        StringBuilder result = new StringBuilder();
        try {

            System.out.println("get address");
            Geocoder geocoder = new Geocoder(this, Locale.getDefault());
            List<Address> addresses = geocoder.getFromLocation(latitude, longitude, 1);
            if (addresses.size() > 0) {
                System.out.println("size====" + addresses.size());
                Address address = addresses.get(0);

                for (int i = 0; i <= addresses.get(0).getMaxAddressLineIndex(); i++) {
                    if (i == addresses.get(0).getMaxAddressLineIndex()) {
                        result.append(addresses.get(0).getAddressLine(i));
                    } else {
                        result.append(addresses.get(0).getAddressLine(i) + ",");
                    }
                }
                System.out.println("ad==" + address);
                System.out.println("result---" + result.toString());

                autoComplete_location.setText(result.toString()); // Here is you AutoCompleteTextView where you want to set your string address (You can remove it if you not need it)
            }
        } catch (IOException e) {
            Log.e("tag", e.getMessage());
        }

        return result.toString();
    }

==================== 就是这样你的地图就像 UBER 准备好了 =============

【讨论】:

    【解决方案2】:

    答案很好,但是 setOnCameraChangeListener 已经贬值了。使用 setOnCameraIdleListener。

    这里有一些例子来获取地图的相机位置。

        mMap.setOnCameraIdleListener(new GoogleMap.OnCameraIdleListener() {
            @Override
            public void onCameraIdle() {
                LatLng midLatLng = mMap.getCameraPosition().target;
                getAddress(midLatLng.latitude, midLatLng.longitude);
            }
        });
    

    现在,getAddress 返回到地址的中心位置。

    【讨论】:

      【解决方案3】:

      由于 setOnCameraChangeListener 已废弃,您可以通过将具有相同标记的图像视图放置在地图中心并使用 setOnCameraIdleListenersetOnCameraMoveListener 来获得相同的效果

      private Marker tempMarker;
      private SupportMapFragment mapFragment;
      
      private void addMapListeners() {
              mapFragment.getMapAsync((googleMap -> {
                  googleMap.setOnCameraIdleListener(() -> {
                      LatLng target = googleMap.getCameraPosition().target;
                      addMarker(target);
                  });
                  googleMap.setOnCameraMoveListener(()->{
                      tempMarker.remove();
                  });
              }));
          }
      
      private void addMarker(LatLng markerPosition) {
              MarkerOptions markerOptions = new MarkerOptions();
              markerOptions.position(markerPosition);
      
              mapFragment.getMapAsync((googleMap -> {
                  if (tempMarker != null) {
                      tempMarker.remove();
                  }
                  tempMarker = googleMap.addMarker(markerOptions);
              }));
          }
      

      Google Map Image (Run time)

      Add Image View (Android Studio)

      【讨论】:

        猜你喜欢
        • 2018-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-23
        • 2013-09-13
        • 1970-01-01
        • 2016-10-25
        • 1970-01-01
        相关资源
        最近更新 更多