How to Implement draggable map like uber android, Update with change location

后端 未结 5 575
[愿得一人]
[愿得一人] 2020-11-27 09:27

How to implement draggable map like uber? I am using Google maps v2. Actually i got the solution referring this post and sharing my complete solution here

5条回答
  •  醉酒成梦
    2020-11-27 10:01

    You can try out this example done by me....

    Example done by me

    activity_main.xml

     
    
    
    
    
    
    
    
       
    

    marker_view.xml

     
    
    
    
    
    

    location_display_view.xml

     
    
    
    
    
    

    MapWrapperLayout.java

    package com.rajeshvijayakumar.map.demo.wrapper;
    
    public class MapWrapperLayout extends FrameLayout {
    
    public interface OnDragListener {
        public void onDrag(MotionEvent motionEvent);
    }
    
    private OnDragListener mOnDragListener;
    
    public MapWrapperLayout(Context context) {
        super(context);
    }
    
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (mOnDragListener != null) {
            mOnDragListener.onDrag(ev);
        }
        return super.dispatchTouchEvent(ev);
    }
    
    public void setOnDragListener(OnDragListener mOnDragListener) {
        this.mOnDragListener = mOnDragListener;
    }
    }
    

    CustomMapFragment.java

    package com.rajeshvijayakumar.map.demo.ui;
    
    public class CustomMapFragment extends MapFragment {
    
    private View mOriginalView;
    private MapWrapperLayout mMapWrapperLayout;
    
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        mOriginalView = super.onCreateView(inflater, container, savedInstanceState);
    
        mMapWrapperLayout = new MapWrapperLayout(getActivity());
        mMapWrapperLayout.addView(mOriginalView);
    
        return mMapWrapperLayout;
       }
    
        @Override
         public View getView() {
            return mOriginalView;
         }
    
          public void setOnDragListener(MapWrapperLayout.OnDragListener onDragListener) {
            mMapWrapperLayout.setOnDragListener(onDragListener);
          }
      }
    

    MainActivity.java

    public class MainActivity extends Activity implements OnDragListener {
    
    // Google Map
    private GoogleMap googleMap;
    private CustomMapFragment mCustomMapFragment;
    
    private View mMarkerParentView;
    private ImageView mMarkerImageView;
    
    private int imageParentWidth = -1;
    private int imageParentHeight = -1;
    private int imageHeight = -1;
    private int centerX = -1;
    private int centerY = -1;
    
    private TextView mLocationTextView;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        // InitializeUI
        initializeUI();
    
    }
    
    private void initializeUI() {
    
        try {
            // Loading map
            initilizeMap();
    
        } catch (Exception e) {
            e.printStackTrace();
        }
        mLocationTextView = (TextView) findViewById(R.id.location_text_view);
        mMarkerParentView = findViewById(R.id.marker_view_incl);
        mMarkerImageView = (ImageView) findViewById(R.id.marker_icon_view);
    }
    
    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        DisplayMetrics displaymetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
    
        imageParentWidth = mMarkerParentView.getWidth();
        imageParentHeight = mMarkerParentView.getHeight();
        imageHeight = mMarkerImageView.getHeight();
    
        centerX = imageParentWidth / 2;
        centerY = (imageParentHeight / 2) + (imageHeight / 2);
    }
    
    private void initilizeMap() {
        if (googleMap == null) {
            mCustomMapFragment = ((CustomMapFragment) getFragmentManager()
                    .findFragmentById(R.id.map));
            mCustomMapFragment.setOnDragListener(MainActivity.this);
            googleMap = mCustomMapFragment.getMap();
            // check if map is created successfully or not
            if (googleMap == null) {
                Toast.makeText(getApplicationContext(),
                        "Sorry! unable to create maps", Toast.LENGTH_SHORT)
                        .show();
            }
        }
        // CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLng,
        // 10);
        // googleMap.animateCamera(cameraUpdate);
        // locationManager.removeUpdates(this);
    }
    
    @Override
    protected void onResume() {
        super.onResume();
    }
    
    @Override
    public void onDrag(MotionEvent motionEvent) {
        if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
            Projection projection = (googleMap != null && googleMap
                    .getProjection() != null) ? googleMap.getProjection()
                    : null;
            //
            if (projection != null) {
                LatLng centerLatLng = projection.fromScreenLocation(new Point(
                        centerX, centerY));
                updateLocation(centerLatLng);
            }
        }
    }
    
    private void updateLocation(LatLng centerLatLng) {
        if (centerLatLng != null) {
            Geocoder geocoder = new Geocoder(MainActivity.this,
                    Locale.getDefault());
    
            List
    addresses = new ArrayList
    (); try { addresses = geocoder.getFromLocation(centerLatLng.latitude, centerLatLng.longitude, 1); } catch (IOException e) { e.printStackTrace(); } if (addresses != null && addresses.size() > 0) { String addressIndex0 = (addresses.get(0).getAddressLine(0) != null) ? addresses .get(0).getAddressLine(0) : null; String addressIndex1 = (addresses.get(0).getAddressLine(1) != null) ? addresses .get(0).getAddressLine(1) : null; String addressIndex2 = (addresses.get(0).getAddressLine(2) != null) ? addresses .get(0).getAddressLine(2) : null; String addressIndex3 = (addresses.get(0).getAddressLine(3) != null) ? addresses .get(0).getAddressLine(3) : null; String completeAddress = addressIndex0 + "," + addressIndex1; if (addressIndex2 != null) { completeAddress += "," + addressIndex2; } if (addressIndex3 != null) { completeAddress += "," + addressIndex3; } if (completeAddress != null) { mLocationTextView.setText(completeAddress); } } } } }

提交回复
热议问题