2013-10-02 17 views
7

MotionEvent s numaralarını s geçmek için ScrollView öğesindeki kaydırma olaylarını algılamak üzere GestureDetector no'lu numarayı geçirdim. Kaydırma durduğunda bunu tespit edebilmem gerek. Bu, MotionEvent.ACTION_UP olayıyla uyuşmuyor, çünkü bu genellikle bir kaydırma hareketinin başlangıcında gerçekleşir; bunu, ScrollView üzerinde onScrollChanged() çağrıları izler.ScrollView'da gezinmenin sonunu belirleme

Yani temelde ne burada ilgileniyor aşağıdaki olaylar ise:

  1. onFling
  2. onScrollChanged, onScrollChanged, onScrollChanged, ..., onScrollChanged hiçbir geri arama yaparken için var

onScrollChanged olayları tetikleniyor. OnFling sırasında Handler kullanarak olay kuyruğuna bir ileti göndermeyi düşünüyordum ve Runnable flingin sonunu bildirmek için ne kadar bekleyeceğini, maalesef ilk onScrollChanged çağrısından sonra patlar.

Başka bir fikrin var mı?

+0

Evet, soruda bahsettiğim gibi bu yaklaşım işe yaramıyor. –

+0

Cevabımı gördünüz mü/denediniz mi? –

cevap

15

AbsListView'un yolunu andıran bir çalışma dinleyicisi oluşturmak için here yanıtlarından birkaçını birleştirdim. Esasen tanımladığınız şey, ve testlerimde iyi çalışıyor.

Not: Kendi GestureDetector'unuzu kullanmak yerine ScrollView.fling(int velocityY)'u geçersiz kılabilirsiniz.

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

Bunu denemedim, ancak kullanıcı arabirimindeki sabit iletiler bir performans sorunu olabilir mi? –

+1

Bunun, "AbsListView" içindeki "Scroller" ile bitmesiyle benzer olduğunu düşünürsek, iyi olacağını düşünüyorum. Aslında her 40 ms'yi güncellerler. AbsListView.FlingRunnable' kontrol edin –

İlgili konular