2017-09-20 10 views
5

मैं गूगल मानचित्र के साथ काम कर रहा हूँ,एंड्रॉइड Google मानचित्र | दो उंगली स्क्रॉल

मेरे मामले है कि मैं एक नक्शा टुकड़ा scrollview अंदर है और मैं केवल दो उंगली के साथ नक्शा स्क्रॉल करने की आवश्यकता उपयोगकर्ता को छू लेती है, तो केवल एक उंगली नक्शा है काम नहीं करना चाहिए और सामान्य स्क्रॉल दृश्य काम करना चाहिए।

यह मैं अब तक की कोशिश की है -

transparent_image.setOnTouchListener(new View.OnTouchListener() { 

       @Override 
       public boolean onTouch(View v, MotionEvent event) { 
        int action = event.getAction(); 
        switch (action & MotionEvent.ACTION_MASK) { 
         case MotionEvent.ACTION_POINTER_DOWN: 
          showMessage("Double finger ACTION_POINTER_DOWN"); 

          googleMap.getUiSettings().setScrollGesturesEnabled(false); 
          scroll_view.requestDisallowInterceptTouchEvent(true); 
          return true; 
         case MotionEvent.ACTION_POINTER_UP: 
          showMessage("Double finger ACTION_POINTER_UP"); 

          googleMap.getUiSettings().setScrollGesturesEnabled(true); 

          scroll_view.requestDisallowInterceptTouchEvent(false); 

          return true; 

         default: 
          return true; 
        } 
       } 
      }); 

उत्तर

8

देशी 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.xmlMainActivity के लिए, उदाहरण के लिए, इस तरह हो सकता है:

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

और बस इतना ही।

+0

के साथ काम कर रहा हूं, मैं इसे आजमा रहा हूं। –

+0

इस लाइन पर त्रुटि प्राप्त करना - मल्टी टच मैपफ्रैगमेंट मानचित्रफ्रैगमेंट = (मल्टी टच मैपफ्रैगमेंट) getFragmentManager() .findFragmentById (R.id.map); त्रुटि - त्रुटि: (646, 9 6) त्रुटि: असंगत प्रकार: टुकड़े को मल्टी टचमैपफ्रैगमेंट –

+0

ग्रेट में परिवर्तित नहीं किया जा सकता है !!!!यह काम करता हैं। धन्यवाद बहुत आदमी। –

संबंधित मुद्दे