2013-12-15 21 views
5

मेरे पास एक कंटेनर ViewGroup है, इसे स्क्रीनScrollView के अंदर कॉल करने दें। इस कंटेनर को देखने अन्य के एक नंबर को होस्ट करता है Views उन्हें विगेट्स फोन करते हैं, और उनमें से कुछ (एक pannable छवि उदाहरण के लिए)बच्चों के साथ स्क्रॉलव्यू देखें, सशर्त रूप से स्क्रॉल को कैसे रोकें

मैं समझ नहीं स्क्रॉल और का उपयोग कर MotionEvent theirselves से scrollview को रोकने में रुचि रखते हैं उपयोग करने के लिए उचित घटना अवरोध रणनीति। ScrollView हमेशा बच्चों के सामने घटना को संसाधित करता है, या बच्चे घटना को संसाधित करते हैं लेकिन scrollview अक्षम है।

मैं बच्चे के विचारों में getParent().requestDisableInterceptTouchEvent() जारी करने के बारे में पढ़ा इस दृश्य घटना पर कब्जा करना चाहता है, लेकिन उनके onTouchEvent नहीं बुलाया जाता है, मुझे लगता है क्योंकि ScrollView घटना पहले से घिरा हुआ है, तो। मुझे लगता है कि मेरे पास परतों के 2 स्तर हैं (कंटेनर + विजेट) यह काम करने से रोकता है, मुझे लगता है कि कंटेनर ViewGroup को यहां एक महत्वपूर्ण हिस्सा खेलना है, लेकिन मुझे पता नहीं लगा सकता कि कौन सा ...

क्या मुझे पता है, ScrollView'sonInterceptTouchEvent स्तर पर, कंटेनर viewGroup पर कौन सा विजेट यह तय करने के लिए छुआ गया है कि मुझे रोकना चाहिए या नहीं?

या ...

कैसे 'विजेट' कर सकते हैं परतों ViewGroup में मिलता है ScrollView से पहले घटना तो मैं getParent().onRequestDisableInterceptTouch() कॉल कर सकते हैं ... या यह getParent().getParent().onRequestDisableInterceptTouch() है?

अग्रिम

धन्यवाद मैं संबंधित प्रश्नों पढ़ा है, लेकिन कोई किस्मत ... Handle touch events in ScrollView Android

उत्तर

9

खैर कोका कोला की एक रात के बाद & डिबगिंग मैं इस काम करने के लिए पाने में कामयाब रहे। मैं समाधान को किसी के लिए ब्याज की स्थिति में साझा करता हूं, क्योंकि इसे चलाने के लिए मुझे काफी समय लगता है।

मैं इसे getParent().onRequestDisableInterceptTouch() के साथ चलाने के लिए प्रबंधित नहीं किया था, मैं करीबी था, लेकिन बच्चे के विगेट्स को मोशन एवेन्ट्स प्राप्त करने का कोई तरीका नहीं मिला जब उन्हें माता-पिता पर स्पर्श को रोक दिया गया, हालांकि बाहरी स्क्रॉल सही ढंग से रोका गया था, आंतरिक विजेट स्क्रॉल नहीं किया था।

तो समाधान interceptTouchEventsबच्चों को केवल में करने के लिए है, और बच्चों अगर स्क्रॉल (ज्ञात संपत्ति) है, और स्पर्श ACTION_DOWN है, तो scrollview को निष्क्रिय दो स्तर से ऊपर। अगर स्पर्श ACTION_UP है, तो हम स्क्रॉलव्यू सक्षम करते हैं।

स्क्रॉलव्यू को सक्षम/अक्षम करने के लिए मैं केवल स्पर्श ईवेंट को रोकता हूं और ध्वज के साथ ईवेंट को फ़िल्टर करता हूं या नहीं।

मैं तीन सहायक कक्षाएं, scrollview के लिए एक, कंटेनर के लिए एक, विजेट्स के लिए एक किया:

इस वर्ग के हर विजेट लपेटता है और, अगर मैं setNeedsScroll (सही) कहते हैं, तो छू लेती रोक दिया जाएगा, और जब इसे स्पर्श किया जाता है, तो यह (कंटेनर को बताएगा) स्क्रॉलव्यू को स्वयं को अक्षम करने के लिए बताएगा। जब स्पर्श जारी किया जाता है, तो यह स्क्रॉलव्यू को पुनः सक्षम कर देगा।

class WidgetWrapperLayout extends FrameLayout { 

    private boolean mNeedsScroll=false; 

    public WidgetWrapperLayout(Context context) { 
     super(context); 
    } 

    /** Called anytime, ie, during construction, to indicate that this 
    * widget uses vertical scroll, so we need to disable its container scroll 
    */ 

    public void setNeedsScroll(boolean needsScroll) { 
     mNeedsScroll=needsScroll; 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 
     if (mNeedsScroll) { 
      switch (ev.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       ((SlideLayout)getParent()).setEnableScroll(false); 
       break; 
      case MotionEvent.ACTION_UP: 
       ((SlideLayout)getParent()).setEnableScroll(true); 
       break; 
      } 
      return false; 
     } 
     return super.onInterceptTouchEvent(ev); 
    } 
} 

इस कंटेनर, scrollview की इकलौती संतान है, और विभिन्न विजेट रखती है।

public class ContainerLayout extends FrameLayout { 

    public ContainerLayout(Context context) { 
     super(context); 
    } 

    public void setEnableScroll(boolean status) { 
     if (Conf.LOG_ON) Log.d(TAG, "Request enable scroll: "+status); 
     ((StoppableScrollView)getParent()).setScrollEnabled(status); 
    } 
} 

और अंत में एक scrollview छोड़ना करने में सक्षम: यह सिर्फ बच्चों के लिए तरीकों ताकि वे सक्षम/अक्षम कर पुस्तक प्रदान करता है। यह स्क्रॉल 'पुरानी-स्कूल' को अक्षम करता है, घटनाओं को रोकता है और अवरुद्ध करता है।

public class StoppableScrollView extends ScrollView { 

    private String TAG="StoppableScrollView"; 

    private boolean mDisableScrolling=false; 

    public StoppableScrollView(Context context) { 
     super(context); 
    } 

    /** Enables or disables ScrollView scroll */ 
    public void setScrollEnabled (boolean status) { 
     if (Conf.LOG_ON) Log.d(TAG, "Scroll Enabled "+status); 
     mDisableScrolling=!status; 
    } 


    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 
     if (mDisableScrolling) return false; 
     return super.onInterceptTouchEvent(ev); 
    } 
} 
0

अपनी गतिविधि में View.OnTouchListener कार्यान्वित करके scrollview है कि श्रोता जोड़ें। फिर onTouchEvent(...) में सच हो जाएं। उन ईवेंट के onTouch पर कॉल करने से पहले आप उस ईवेंट को संभालना चाहते हैं।

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