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!
Asked
Active
Viewed 1,009 times
3
-
https://stackoverflow.com/questions/5938970/android-multitouch-hack-anyone – KR_Android Feb 16 '18 at 10:29
-
its not working – Nirmal Prajapat Feb 16 '18 at 11:40
2 Answers
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).
![](../../users/profiles/6950238.webp)
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
![](../../users/profiles/5360809.webp)
Maksym V.
- 2,491
- 13
- 24