3

I am trying to implement Google map in my app, in which I want to disable two finger scroll in google map.That means if user touches map with one finger map should be scrolled and if user touches two finger on map it should not scroll. thanks!

Phantômaxx
  • 36,442
  • 21
  • 78
  • 108
Nirmal Prajapat
  • 1,287
  • 1
  • 9
  • 20

2 Answers2

1

You can enable/disable scroll gestures at GoogleMap you can with calling setAllGesturesEnabled() and setScrollGesturesEnabled() on GoogleMap.getUiSettings() object and for determining touches of two fingers on MapFragment you can use approach with customized map fregment, based on this answer of community wiki:

public class TouchableWrapper extends FrameLayout {

    private GoogleMap mGoogleMap = null;

    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().setScrollGesturesEnabled(true);
            break;

            case MotionEvent.ACTION_POINTER_DOWN:
                // disabling scroll gestures in case second finger down
                mGoogleMap.getUiSettings().setScrollGesturesEnabled(false);
            break;

            case MotionEvent.ACTION_POINTER_UP:
                mGoogleMap.getUiSettings().setScrollGesturesEnabled(true);
            break;

            case MotionEvent.ACTION_UP:
                mGoogleMap.getUiSettings().setScrollGesturesEnabled(true);
            break;
        }

        return super.dispatchTouchEvent(event);
    }
}

MapFragment for that should be customized like:

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;
    }
}

activity_main.xml for MainActivity can be like:

<?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>

and there is no changes in 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);
    }

}

Also, you can use same solution for customized MapView (if you use it).

Andrii Omelchenko
  • 12,030
  • 12
  • 40
  • 70
  • sir, I am using mapView, don't I have to use MultiTouchMapFragment ??? if yes then what will be the changes for mapView?? – Nirmal Prajapat Feb 19 '18 at 12:40
  • @NirmalPrajapat Yes. Please see updates for [this](https://stackoverflow.com/a/48865211/6950238) answer. You need to override `dispatchTouchEvent()` (to detect double taps) and implement `OnMapReadyCallback` for getting `GoogleMap` object inside your custom MapView. – Andrii Omelchenko Feb 19 '18 at 12:43
0

Try this:

<item name="android:splitMotionEvents">false</item>
    <item name="android:windowEnableSplitTouch">false</item>

just put it inside your activity theme

Maksym V.
  • 2,491
  • 13
  • 24