【问题标题】:How to add marker on map by double tap and get the coordinates [android]如何通过双击在地图上添加标记并获取坐标[android]
【发布时间】:2018-05-04 14:48:20
【问题描述】:

我想通过双击在谷歌地图上添加标记。我知道 googlemap.OnMapClickListener 但它在单击时添加了一个标记。我在谷歌地图中找到了一个关于处理双击的帖子,但我无法添加另一个类的标记。

MapFragment.java:

        @Override
        public View onCreateView(LayoutInflater inflater, final ViewGroup container,
                                 Bundle savedInstanceState) {
            // Inflate the layout for this fragment
            View view = inflater.inflate(R.layout.fragment_map, container, false);

            mMapView = (MapView) view.findViewById(R.id.mapView);
            mMapView.onCreate(savedInstanceState);

            mMapView.onResume(); // needed to get the map to display immediately

            try {
                MapsInitializer.initialize(getActivity().getApplicationContext());
            } catch (Exception e) {
                e.printStackTrace();
            }

            mMapView.getMapAsync(new OnMapReadyCallback() {
                @Override
                public void onMapReady(GoogleMap mMap) {
                    googleMap = mMap;

                    if (latitude != null && longitude != null) {
                        // For showing a move to my location button
                        if (ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(getActivity(), Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED)
                        {
                            return;
                        }
                        googleMap.setMyLocationEnabled(true);

                        // For dropping a marker at a point on the Map
                        final LatLng coordinates = new LatLng(latitude, longitude);

                        // For zooming automatically to the location of the marker
                        cameraPosition = new CameraPosition.Builder().target(coordinates).zoom(15).build();
                        googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));

                        googleMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
                            @Override
                            public void onMapClick(final LatLng coordinates){

                            **//adds marker on single tap & get coordinates**//

                            }
                        });

                    }

                }

            });

            return view;
        }

@Override
public boolean onDoubleTap(MotionEvent e) {

    return true; 
}

// Here will be some autogenerated methods too

地图片段.xml:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <azizbekyan.andranik.map.OnDoubleTap
        android:id="@+id/mapView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:enabled="true"
        android:clickable="true"
        android:apiKey="YOUR_API_KEY" />        
</LinearLayout>

OnDoubleTap.java:

    public class OnDoubleTap extends MapView {

  private long lastTouchTime = -1;

  public OnDoubleTap(Context context, AttributeSet attrs) {
    super(context, attrs);
  }

  @Override
  public boolean onInterceptTouchEvent(MotionEvent ev) {
    if (ev.getAction() == MotionEvent.ACTION_DOWN) {
      long thisTime = System.currentTimeMillis();
      if (thisTime - lastTouchTime < ViewConfiguration.getDoubleTapTimeout()) {
        //** Double tap control here **//

        lastTouchTime = -1;
      } else {
        // Too slow 
        lastTouchTime = thisTime;
      }
    }
    return super.onInterceptTouchEvent(ev);
  }
}

现在如何通过双击在谷歌地图上添加标记并从另一个班级获取坐标?任何帮助将不胜感激。

【问题讨论】:

    标签: java android google-maps google-maps-markers


    【解决方案1】:

    尝试实现 rajan ks answer 并将这一行添加到您的“onMapReady”方法中

    googleMap.getUiSettings().setZoomControlsEnabled(false);
    

    这将禁用谷歌地图双击手势来放大地图

    【讨论】:

      【解决方案2】:

      为此,您可以使用基于社区 wiki 的 this answer 的方法:您需要在自定义 TouchableWrapper 视图中拦截触摸并管理启用/禁用缩放手势:

      public class TouchableWrapper extends FrameLayout {
      
          private GoogleMap mGoogleMap = null;
          private long mLastTouchTime = -1;
      
          public TouchableWrapper(Context context) {
              super(context);
          }
      
          public void setGoogleMap(GoogleMap googleMap) {
              mGoogleMap = googleMap;
          }
      
          @Override
          public boolean dispatchTouchEvent(MotionEvent event) {
      
              switch (event.getAction() & MotionEvent.ACTION_MASK) {
      
                  case MotionEvent.ACTION_DOWN:
                      mGoogleMap.getUiSettings().setZoomGesturesEnabled(false);
                      long thisTime = System.currentTimeMillis();
                      if (thisTime - mLastTouchTime < ViewConfiguration.getDoubleTapTimeout()) {
      
                          if (mGoogleMap != null) {
                              mGoogleMap.addMarker(new MarkerOptions()
                                      .position(mGoogleMap.getProjection().fromScreenLocation(new Point((int)event.getX(), (int)event.getY())))
                                      .title("DblTapped"));
                          }
                          mLastTouchTime = -1;
                      } else {
                          mLastTouchTime = thisTime;
                          mGoogleMap.getUiSettings().setZoomGesturesEnabled(true);
                      }
                      break;
              }
              return super.dispatchTouchEvent(event);
          }
      }
      

      而不是创建自定义 MapFragment,它可以交换原始视图和可触摸视图:

      public class MultiTouchMapFragment extends MapFragment {
          public View mOriginalContentView;
          public TouchableWrapper mTouchView;
      
          @Override
          public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
              mOriginalContentView = super.onCreateView(inflater, parent, savedInstanceState);
              mTouchView = new TouchableWrapper(getActivity());
              mTouchView.addView(mOriginalContentView);
              return mTouchView;
          }
      
          @Override
          public View getView() {
              return mOriginalContentView;
          }
      }
      

      并在MainActivity中使用它:

      public class MainActivity extends AppCompatActivity implements OnMapReadyCallback {
      
          private GoogleMap mGoogleMap;
          private MultiTouchMapFragment mMapFragment;
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
      
              mMapFragment = (MultiTouchMapFragment) getFragmentManager()
                      .findFragmentById(R.id.map_fragment);
              mMapFragment.getMapAsync(this);
          }
      
          @Override
          public void onMapReady(GoogleMap googleMap) {
              mGoogleMap = googleMap;
              mMapFragment.mTouchView.setGoogleMap(mGoogleMap);
          }
      
      }
      

      activity_mail.xml 在哪里:

      <?xml version="1.0" encoding="utf-8"?>
      <RelativeLayout
          xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          tools:context="<your_package_name>.MainActivity">
      
          <fragment
              android:id="@+id/map_fragment"
              android:name="<your_package_name>.MultiTouchMapFragment"
              android:layout_width="match_parent"
              android:layout_height="match_parent"/>
      
      </RelativeLayout>
      

      这一切都成功了。

      【讨论】:

      • 我在地图上工作时双击它保持滚动但是当我用两根手指捏住并缩放它的滚动禁用我如何禁用双滚动我正在使用这个solution
      • 我正在使用MapInfoWindowFragment 作为地图
      【解决方案3】:

      你可以使用googleMap.setonMapClickListener 来实现它

      在片段内声明全局变量

      private long lastTouchTime = -1;
      

      将片段内的侦听器更新为

      googleMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
          @Override
          public void onMapClick(final LatLng coordinates){
              long thisTime = System.currentTimeMillis();
              if (thisTime - lastTouchTime < ViewConfiguration.getDoubleTapTimeout()) {
                  //** Double tapped , write logic to add Map **//
                  lastTouchTime = -1;
              } else {
                  lastTouchTime = thisTime;
              }
          }
      });
      

      【讨论】:

      • 我已经试过你的逻辑了。我在片段内设置了 googleMap.setOnMapClickListener 但它只检测到单击。双击它只是放大地图
      猜你喜欢
      • 1970-01-01
      • 2011-06-21
      • 1970-01-01
      • 2013-05-15
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      • 2013-06-13
      相关资源
      最近更新 更多