खैर कोका कोला की एक रात के बाद & डिबगिंग मैं इस काम करने के लिए पाने में कामयाब रहे। मैं समाधान को किसी के लिए ब्याज की स्थिति में साझा करता हूं, क्योंकि इसे चलाने के लिए मुझे काफी समय लगता है।
मैं इसे 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);
}
}