activity_main.xml
<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" >
<fragment
android:id="@+id/map"
android:name="com.rajeshvijayakumar.map.demo.ui.CustomMapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<include
android:id="@+id/marker_view_incl"
android:layout_width="match_parent"
android:layout_height="match_parent"
layout="@layout/marker_view" />
<include
android:id="@+id/location_display_incl"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_margin="7dp"
layout="@layout/location_display_view" />
</RelativeLayout>
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<fragment
android:id="@+id/map"
android:name="com.rajeshvijayakumar.map.demo.ui.CustomMapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<include
android:id="@+id/marker_view_incl"
android:layout_width="match_parent"
android:layout_height="match_parent"
layout="@layout/marker_view" />
<include
android:id="@+id/location_display_incl"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_centerHorizontal="true"
android:layout_margin="7dp"
layout="@layout/location_display_view" />
</RelativeLayout>
marker_view.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<ImageView
android:id="@+id/marker_icon_view"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_centerInParent="true"
android:layout_marginTop="162dp"
android:contentDescription="@string/app_name"
android:src="@drawable/ic_launcher" />
</RelativeLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<ImageView
android:id="@+id/marker_icon_view"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_centerInParent="true"
android:layout_marginTop="162dp"
android:contentDescription="@string/app_name"
android:src="@drawable/ic_launcher" />
</RelativeLayout>
location_display_view.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="@android:color/white" >
<TextView
android:id="@+id/text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:gravity="center"
android:text="Set Location"
android:textColor="@android:color/holo_green_dark"
android:textSize="12sp" />
<TextView
android:id="@+id/location_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/text_view"
android:layout_centerHorizontal="true"
android:gravity="center"
android:text="Set Location"
android:textColor="@android:color/black"
android:textSize="14sp" />
</RelativeLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="60dp"
android:background="@android:color/white" >
<TextView
android:id="@+id/text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:gravity="center"
android:text="Set Location"
android:textColor="@android:color/holo_green_dark"
android:textSize="12sp" />
<TextView
android:id="@+id/location_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/text_view"
android:layout_centerHorizontal="true"
android:gravity="center"
android:text="Set Location"
android:textColor="@android:color/black"
android:textSize="14sp" />
</RelativeLayout>
MapWrapperLayout.java
package com.rajeshvijayakumar.map.demo.wrapper;
import android.content.Context;
import android.view.MotionEvent;
import android.widget.FrameLayout;
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;
}
}
import android.content.Context;
import android.view.MotionEvent;
import android.widget.FrameLayout;
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;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.google.android.gms.maps.MapFragment;
import com.rajeshvijayakumar.map.demo.wrapper.MapWrapperLayout;
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);
}
}
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.google.android.gms.maps.MapFragment;
import com.rajeshvijayakumar.map.demo.wrapper.MapWrapperLayout;
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
package com.rajeshvijayakumar.map.demo;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import android.app.Activity;
import android.graphics.Point;
import android.location.Address;
import android.location.Geocoder;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.rajeshvijayakumar.map.demo.R;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.Projection;
import com.google.android.gms.maps.model.LatLng;
import com.rajeshvijayakumar.map.demo.ui.CustomMapFragment;
import com.rajeshvijayakumar.map.demo.wrapper.MapWrapperLayout.OnDragListener;
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<Address> addresses = new ArrayList<Address>();
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);
}
}
}
}
}
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import android.app.Activity;
import android.graphics.Point;
import android.location.Address;
import android.location.Geocoder;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.rajeshvijayakumar.map.demo.R;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.Projection;
import com.google.android.gms.maps.model.LatLng;
import com.rajeshvijayakumar.map.demo.ui.CustomMapFragment;
import com.rajeshvijayakumar.map.demo.wrapper.MapWrapperLayout.OnDragListener;
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<Address> addresses = new ArrayList<Address>();
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);
}
}
}
}
}
Expected Output :