देशी Android आवेदन का यह व्यवहार आप प्राप्त कर सकते हैं की जाँच जब:
1) ScrollView
स्क्रॉलिंग अक्षम करें और GoogleMap
स्क्रॉल करें जब उपयोगकर्तापर दो अंगुली रखता है 0;
2) ScrollView
स्क्रॉलिंग सक्षम करें और GoogleMap
अन्य मामले में स्क्रॉलिंग अक्षम करें।
अक्षम करने/हालत से स्क्रॉल ScrollView
को सक्षम करने के लिए, आप ScrollView
का विस्तार करने और false
वापस जाने के लिए जब कुछ हालत मिलान किया जाता है उदाहरण के लिए, onTouchEvent()
विधि ओवरराइड, Josep Earl की this answer में के रूप में की जरूरत है:
public class LockableScrollView extends ScrollView {
private boolean mScrollable = true;
public LockableScrollView(Context context) {
super(context);
}
public LockableScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public LockableScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public void setScrollingEnabled(boolean enabled) {
mScrollable = enabled;
}
public boolean isScrollable() {
return mScrollable;
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
// if we can scroll pass the event to the superclass
if (mScrollable) return super.onTouchEvent(ev);
// only continue to handle the touch event if scrolling enabled
return mScrollable; // mScrollable is always false at this point
default:
return super.onTouchEvent(ev);
}
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
// Don't do anything with intercepted touch events if
// we are not scrollable
if (!mScrollable) return false;
else return super.onInterceptTouchEvent(ev);
}
}
सक्षम/GoogleMap
पर स्क्रॉल जेस्चर अक्षम करें, आप आसानी से setAllGesturesEnabled()
और setScrollGesturesEnabled()
पर GoogleMap.getUiSettings()
ऑब्जेक्ट पर कॉल कर सकते हैं और MapFragment
पर दो अंगुलियों के स्पर्श निर्धारित करने के लिए आप समुदाय विकी के this answer के आधार पर दृष्टिकोण का उपयोग कर सकते हैं:
public class TouchableWrapper extends FrameLayout {
private LockableScrollView mLockableScroll;
private GoogleMap mGoogleMap;
public TouchableWrapper(Context context) {
super(context);
}
public void setGoogleMapAndScroll(GoogleMap googleMap, LockableScrollView lockableScroll) {
mGoogleMap = googleMap;
mLockableScroll = lockableScroll;
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
mGoogleMap.getUiSettings().setScrollGesturesEnabled(false);
// UPDATE: add below line to disable zoom gesture
mGoogleMap.getUiSettings().setZoomGesturesEnabled(false);
mLockableScroll.setScrollingEnabled(true);
break;
case MotionEvent.ACTION_POINTER_DOWN:
mLockableScroll.setScrollingEnabled(false);
mGoogleMap.getUiSettings().setScrollGesturesEnabled(true);
// UPDATE: add below line to enable zoom gesture
mGoogleMap.getUiSettings().setZoomGesturesEnabled(true);
break;
case MotionEvent.ACTION_POINTER_UP:
// UPDATE: add below line to disable zoom gesture
mGoogleMap.getUiSettings().setZoomGesturesEnabled(false);
mGoogleMap.getUiSettings().setScrollGesturesEnabled(false);
mLockableScroll.setScrollingEnabled(true);
break;
case MotionEvent.ACTION_UP:
// UPDATE: add below line to disable zoom gesture
mGoogleMap.getUiSettings().setZoomGesturesEnabled(false);
mGoogleMap.getUiSettings().setScrollGesturesEnabled(false);
mLockableScroll.setScrollingEnabled(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 LockableScrollView mLockableScrollView;
private MultiTouchMapFragment mapFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mLockableScrollView = (LockableScrollView) findViewById(R.id.lockable_scroll);
mapFragment = (MultiTouchMapFragment) getFragmentManager()
.findFragmentById(R.id.map_fragment);
mapFragment.getMapAsync(this);
}
@Override
public void onMapReady(GoogleMap googleMap) {
LatLng marker = new LatLng(48, 38);
googleMap.addMarker(new MarkerOptions().position(marker).title("Scroll"));
googleMap.getUiSettings().setAllGesturesEnabled(false);
mapFragment.mTouchView.setGoogleMapAndScroll(googleMap, mLockableScrollView);
}
}
और, अंततः, activity_main.xml
MainActivity
के लिए, उदाहरण के लिए, इस तरह हो सकता है:
<[your_package_name].LockableScrollView
android:id="@+id/lockable_scroll"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:layout_width="match_parent"
android:layout_height="300dp"
android:src="@mipmap/ic_launcher"/>
<fragment
android:id="@+id/map_fragment"
android:name="[your_package_name].MultiTouchMapFragment"
android:layout_width="match_parent"
android:layout_height="300dp"/>
<ImageView
android:layout_width="match_parent"
android:layout_height="300dp"
android:src="@mipmap/ic_launcher"/>
</LinearLayout>
</[your_package_name].LockableScrollView>
और बस इतना ही।
के साथ काम कर रहा हूं, मैं इसे आजमा रहा हूं। –
इस लाइन पर त्रुटि प्राप्त करना - मल्टी टच मैपफ्रैगमेंट मानचित्रफ्रैगमेंट = (मल्टी टच मैपफ्रैगमेंट) getFragmentManager() .findFragmentById (R.id.map); त्रुटि - त्रुटि: (646, 9 6) त्रुटि: असंगत प्रकार: टुकड़े को मल्टी टचमैपफ्रैगमेंट –
ग्रेट में परिवर्तित नहीं किया जा सकता है !!!!यह काम करता हैं। धन्यवाद बहुत आदमी। –