पृष्ठभूमि: मेरे पास एक स्क्रॉलव्यू/टेक्स्ट व्यू जोड़ी है जो बाहरी स्रोत से पाठ की एक अंतराल स्ट्रीम प्राप्त करती है। यह स्वचालित रूप से प्रत्येक अद्यतन पर नीचे स्क्रॉल करता है।प्रोग्रामिक स्क्रॉलिंग से एंड्रॉइड स्क्रॉल व्यू के एंड-यूजर स्क्रॉल को कैसे अलग किया जाए?
मैं उपयोगकर्ता को मैन्युअल रूप से कहीं भी स्क्रॉल करके उस ऑटो स्क्रॉल डाउन मोड से बाहर निकलने में सक्षम होना चाहता हूं, हालांकि मुझे लगता है कि प्रोग्रामेट स्क्रॉल से मैन्युअल स्क्रॉल को अलग करने का तरीका मैं खुद को कर रहा हूं।
मेरे यूआई अद्यतन एक टाइमर पर चलता है 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
में:
धन्यवाद, यह मूल विचार है जो काम करता है। पूर्णता के लिए, अब मैं जो कर रहा हूं वह है: ACTION_MOVE या ACTION_DOWN मैन्युअल मोड प्रारंभ करें और "उंगली नीचे" स्थिति चालू करें। ACTION_UP "उंगली नीचे" राज्य बंद कर देता है। ऑनस्कोल चेंज और ACTION_UP दोनों स्वचालित स्क्रॉलिंग को फिर से चालू करते हैं यदि उंगली स्थिति और बॉटम दोनों सत्य हैं। – idij
उंगली स्थिति के आधार पर ऑनस्कोल चेंज में मैन्युअल मोड से बाहर निकलना आवश्यक है क्योंकि आप स्क्रॉल करने के लिए स्क्रीन को "फ्लिक" कर सकते हैं, और स्क्रॉलिंग समाप्त होने से पहले आपको ACTION_UP मिल जाता है। – idij