2013-10-02 15 views
7

पर फ़्लिंग के अंत का पता लगाएं मैंने ScrollView को MotionEvent से GestureDetector पर स्क्रॉलव्यू पर फ़्लिंग ईवेंट का पता लगाने के लिए ओवरराइड किया है। स्क्रॉलिंग बंद होने पर मुझे पता लगाने में सक्षम होना चाहिए। यह MotionEvent.ACTION_UP घटना के साथ मेल नहीं करता है क्योंकि यह आम तौर पर एक फ़्लिंग इशारा है, जो scrollview पर onScrollChanged() कॉल की बाढ़ के बाद के शुरू में होता है।स्क्रॉलव्यू

तो मूल रूप से क्या हम साथ यहाँ काम कर रहे हैं निम्न इवेंट है:

  1. onFling
  2. onScrollChanged, onScrollChanged, onScrollChanged, ..., onScrollChanged

वहाँ जब के लिए कोई कॉलबैक है ऑनस्कोल चेंज किए गए कार्यक्रम फायरिंग किए जाते हैं। मैं onFling और Runnable फ़्लिंग के अंत का संकेत करने के लिए निष्पादित करने के लिए के लिए इंतजार के दौरान एक Handler का उपयोग कर घटना कतार में एक संदेश पोस्ट करने की सोच रहा था, दुर्भाग्य से यह पहली onScrollChanged कॉल के बाद सक्रिय करता है।

कोई अन्य विचार?

+0

हाँ, के रूप में मैं अपने प्रश्न में उल्लेख किया है कि दृष्टिकोण काम नहीं करता। –

+0

क्या आपने मेरा जवाब देखा/कोशिश की है? –

उत्तर

15

मैंने here से कुछ उत्तरों को संयुक्त किया है जो AbsListView के समान काम करने वाले श्रोता का निर्माण करने के लिए करता है। यह अनिवार्य रूप से आप वर्णन करते हैं, और यह मेरे परीक्षण में अच्छी तरह से काम करता है।

नोट: आप अपने GestureDetector का उपयोग करने के बजाय ScrollView.fling(int velocityY) को ओवरराइड कर सकते हैं।

import android.content.Context; 
import android.util.AttributeSet; 
import android.widget.ScrollView; 

public class CustomScrollView extends ScrollView { 

    private static final int DELAY_MILLIS = 100; 

    public interface OnFlingListener { 
     public void onFlingStarted(); 
     public void onFlingStopped(); 
    } 

    private OnFlingListener mFlingListener; 
    private Runnable mScrollChecker; 
    private int mPreviousPosition; 

    public CustomScrollView(Context context) { 
     this(context, null, 0); 
    } 

    public CustomScrollView(Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 

    public CustomScrollView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 

     mScrollChecker = new Runnable() { 
      @Override 
      public void run() { 
       int position = getScrollY(); 
       if (mPreviousPosition - position == 0) { 
        mFlingListener.onFlingStopped(); 
        removeCallbacks(mScrollChecker); 
       } else { 
        mPreviousPosition = getScrollY(); 
        postDelayed(mScrollChecker, DELAY_MILLIS); 
       } 
      } 
     }; 
    } 

    @Override 
    public void fling(int velocityY) { 
     super.fling(velocityY); 

     if (mFlingListener != null) { 
      mFlingListener.onFlingStarted(); 
      post(mScrollChecker); 
     } 
    } 

    public OnFlingListener getOnFlingListener() { 
     return mFlingListener; 
    } 

    public void setOnFlingListener(OnFlingListener mOnFlingListener) { 
     this.mFlingListener = mOnFlingListener; 
    } 

} 
+0

मैं इस प्रयास नहीं किया है, लेकिन यूआई धागे पर लगातार संदेशों एक प्रदर्शन समस्या हो सकती है कोई? –

+1

यह देखते हुए कि इस तरह से '' में Scroller' के साथ अपने किया के समान है AbsListView', मुझे लगता है कि आप ठीक हो जाओगे। वे वास्तव में हर 40ms अद्यतन करते हैं। 'AbsListView.FlingRunnable' देखें –