2013-04-19 6 views
6

पृष्ठभूमि: मेरे पास एक स्क्रॉलव्यू/टेक्स्ट व्यू जोड़ी है जो बाहरी स्रोत से पाठ की एक अंतराल स्ट्रीम प्राप्त करती है। यह स्वचालित रूप से प्रत्येक अद्यतन पर नीचे स्क्रॉल करता है।प्रोग्रामिक स्क्रॉलिंग से एंड्रॉइड स्क्रॉल व्यू के एंड-यूजर स्क्रॉल को कैसे अलग किया जाए?

मैं उपयोगकर्ता को मैन्युअल रूप से कहीं भी स्क्रॉल करके उस ऑटो स्क्रॉल डाउन मोड से बाहर निकलने में सक्षम होना चाहता हूं, हालांकि मुझे लगता है कि प्रोग्रामेट स्क्रॉल से मैन्युअल स्क्रॉल को अलग करने का तरीका मैं खुद को कर रहा हूं।

मेरे यूआई अद्यतन एक टाइमर पर चलता है redraws बफ़र होना:

private Handler outputUpdater = new Handler(); 
private static String outputBuffer = ""; 
private static boolean outputHasChanged = false; 
private static final Object lock = new Object(); 

private Runnable outputUpdaterTask = new Runnable() { 
    public void run() { 
     synchronized (lock) { 

      // if the output has changed, update the TextView 
      if (outputHasChanged) { 
       TextView tv = (TextView) findViewById (R.id.textView); 
       tv.setText (outputBuffer); 
      } 

      // if the output has changed, or the scroll hasn't reached the bottom yet 
      // then keep scrolling down 
      if (outputHasChanged || !scrollAtBottom()) { 
       ScrollView sv = (ScrollView) findViewById (R.id.scrollView); 
       sv.fullScroll (View.FOCUS_DOWN); 
      } 

      outputHasChanged = false; 
     } 

     outputUpdater.postDelayed (this, 100); 
    } 
}; 

scrollAtBottom हो जाता है यह एक onScrollChanged हैंडलर से मूल्य है।

यह सब ठीक काम करता है। fullScroll पर कॉल करना आवश्यक है, भले ही fullScroll पर एक कॉल हमेशा टेक्स्ट पर नहीं चल रहा हो, या वर्चुअल कीपैड दृश्यता बदलती है, आदि।

मैं चाहता था जैसे कि उपयोगकर्ता मैन्युअल रूप से स्क्रॉल करता है, कि मैं fullScroll पर कॉल करना बंद करने का निर्णय ले सकता हूं।

दुर्भाग्यवश ऐसा लगता है कि मैन्युअल मोड पर स्विच करने के लिए एक क्यू के रूप में "नीचे, स्वचालित मोड" से "नीचे नहीं" से किसी भी संक्रमण का इलाज करने के लिए पर्याप्त नहीं है क्योंकि विभिन्न यूआई परिवर्तन स्क्रॉल व्यू को स्थानांतरित करते हैं नीचे भी (उदाहरण के लिए वर्चुअल कीपैड दिखा रहा है)।

प्रश्न बहाल: मैं प्रोग्रामिक स्क्रॉल से उपयोगकर्ता द्वारा शुरू की गई स्क्रॉल को कैसे अलग कर सकता हूं?

boolean userIntercept = false; 
@Override 
public boolean onTouchEvent(MotionEvent me) { 
    int action = me.getAction(); 
    if (action == MotionEvent.ACTION_MOVE) { 
      userIntercept = true; 
    } 
    return super.onTouchEvent(me); 
} 

फिर अपने outputUpdaterTask में:

उत्तर

8

, करने के लिए कुछ इसी तरह आप onTouchEvent के साथ एक boolean उपयोग करने की कोशिश है

// if the output has changed, or the scroll hasn't reached the bottom yet 
// then keep scrolling down 
if (outputHasChanged || !scrollAtBottom() && !userIntercept) { 
    ScrollView sv = (ScrollView) findViewById (R.id.scrollView); 
    sv.fullScroll (View.FOCUS_DOWN); 
} 

तुम सिर्फ एक तरीका है जिसमें आप लौट सकते हैं निर्धारित करने के लिए की आवश्यकता होगी userIntercept से false, जो भी आपके आवेदन के लिए सबसे अच्छा फिट बैठता है।

+4

धन्यवाद, यह मूल विचार है जो काम करता है। पूर्णता के लिए, अब मैं जो कर रहा हूं वह है: ACTION_MOVE या ACTION_DOWN मैन्युअल मोड प्रारंभ करें और "उंगली नीचे" स्थिति चालू करें। ACTION_UP "उंगली नीचे" राज्य बंद कर देता है। ऑनस्कोल चेंज और ACTION_UP दोनों स्वचालित स्क्रॉलिंग को फिर से चालू करते हैं यदि उंगली स्थिति और बॉटम दोनों सत्य हैं। – idij

+1

उंगली स्थिति के आधार पर ऑनस्कोल चेंज में मैन्युअल मोड से बाहर निकलना आवश्यक है क्योंकि आप स्क्रॉल करने के लिए स्क्रीन को "फ्लिक" कर सकते हैं, और स्क्रॉलिंग समाप्त होने से पहले आपको ACTION_UP मिल जाता है। – idij

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