2012-02-07 16 views
5

Używam w mojej aplikacji ViewPager, która zawiera poziomy układ obrazów do zaimplementowania w Paginated gallery.Android - Przewijanie ViewPager resetuje

Gdy testuję sam widok, tj. Jako główny widok działania, działa poprawnie. Jednak gdy uwzględnię to jako część innego układu, przewijanie (lub pstryknięcie) staje się dziwne. Jeśli wydaje się, że zresetował swoje pierwotne położenie w połowie przeciągnięcia (naprawdę szybkie kliki są jedyną rzeczą, do której do tej pory pracowałem).

Jakieś pomysły na temat problemu?

Na wszelki wypadek widok jest zawyżany z XML i dodany w odziedziczonej klasie PagerAdapter.

Odpowiedz

9

Tak, ViewPager i inne elementy przewijania domyślnie nie grają dobrze razem. Kiedy muszę robić takie rzeczy, zazwyczaj podklasę ViewPager zrobić coś, co jest świadome dzieci, które można przewijać. Następnie w moim onInterceptTouchEvent() sprawdzam, czy trafiony rect znajduje się w tym dziecku i nie przechwytuje zdarzenia dotyku, aby dziecko miało uderzenie w niego. Coś takiego:

/** 
* Override to not intercept touch events within our scroller if it exists. 
*/ 
@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) { 
    if(scrollerId != 0) { 
     View scroller = findViewById(scrollerId); 
     if(scroller != null) { 
      Rect rect = new Rect(); 
      scroller.getHitRect(rect); 
      if(rect.contains((int)ev.getX(), (int)ev.getY())) { 
       return false; 
      } 
     } 
    } 
    return super.onInterceptTouchEvent(ev); 
} 

Wtedy wszystko, co potrzebne jest sposób ustawić, że scrollerId (prosta metoda roboty publiczne).

Uwaga Innym sposobem jest, jeśli przy użyciu ScrollView dla pionowo elementy przewijanie ViewPagerdzieci, trzeba iść w innym kierunku. Czy podklasa ScrollView, która wykrywa kierunki przewijania w pionie i poręcza do przewijania w poziomie, więc ViewPager podnosi go.

@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) { 
    switch (ev.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      xDistance = yDistance = 0f; 
      lastX = ev.getX(); 
      lastY = ev.getY(); 
      break; 
     case MotionEvent.ACTION_MOVE: 
      final float curX = ev.getX(); 
      final float curY = ev.getY(); 
      xDistance += Math.abs(curX - lastX); 
      yDistance += Math.abs(curY - lastY); 
      lastX = curX; 
      lastY = curY; 
      if (xDistance > yDistance) 
       return false; 
    } 

    return super.onInterceptTouchEvent(ev); 
} 
+0

zorientowaliśmy się, że dojdzie do aż do MotionEvents ... nigdy nie zrozumiał, że wiele rzeczy, ale może przykładowy kod pomoże mi dostać się tam ... Jestem po prostu będzie go wypróbować teraz –

+0

yup ... że Prace. Jednakże, ponieważ zaczynam rozumieć to teraz, myślę, że niedługo będę miał inny problem, ponieważ mam zamiar włączyć kliknięcia Obrazów w ViewPagera i muszą rozpocząć działania. Wszelkie wskazówki na ten temat ... Sądzę, że powinienem złapać ACTION_MOVE i pozwolić, aby ACTION_DOWN zbliżyło się do twojego drugiego przykładu. –

+0

Nie, to nie powinno być zbyt dużym problemem. Ustaw 'onClickListener' na' ImageView' i upewnij się, że ustawiasz je jako klikalne (w układzie XML lub w kodzie) i powinieneś być w porządku. Akcja kliknięcia jest nieco inną ścieżką niż zdarzenia przeniesienia. –

Powiązane problemy