2012-02-07 19 views
5

私は、画像の水平レイアウトが格納されているアプリでViewPagerを使用してページ区切りのギャラリーを実装しています。Android - ViewPagerスクロールのリセット

ビューを単独で、つまりアクティビティのメインビューとしてテストすると、正常に動作します。しかし、これを別のレイアウトの一部として含めると、スクロール(またはフリック)が奇妙になります。もしあなたがスワイプの途中で元の位置に戻っているようであれば(本当にクイックフリックがこれまでに働いた唯一のものです)。

どのような問題が発生する可能性がありますか?

関連性がある場合は、XMLからビューを膨張させ、PagerAdapter継承クラスに追加します。

答えて

9

ええと、ViewPagerと他のスクロールアイテムは、デフォルトではうまく一緒に再生されません。私がこのようなことをしなければならないときは、普通はViewPagerをサブクラス化して、スクロールできる子を認識しているものを作ります。次に私のonInterceptTouchEvent()では、ヒットした矩形がその子の中にあるかどうかをチェックし、タッチイベントを傍受しないようにして、子供がそれに打撃を与えるようにします。このような何か:

/** 
* 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); 
} 

は、その後、あなたが必要とするすべては(簡単なパブリックメソッドが動作します)そのscrollerIdを設定する方法です。あなたはViewPager子供ScrollView垂直ためのスクロール要素を使用している場合

注別の方法があり、あなたは別の方向に行く必要があります。 ViewPagerがそれをピックアップするように、垂直スクロールの方向と水平スクロールのベールを検出するサブクラスScrollViewがあります。

@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

がいること...それがはるかにその原料を理解していなかった... MotionEventsまでに来るだろうが、多分サンプルコードは今 –

+0

うん、それを試してみて、私はちょうどつもりだ...私はそこに得るのを助ける考え出し働くしかし、今私はこれを理解し始めているので、私はViewPager内の画像をクリック可能にし、活動を開始する必要があるので、すぐに別の問題が生じるだろうと思います。それについてのヒントです....私はACTION_MOVEを捕まえ、ACTION_DOWNをあなたの2番目の例に似せるようにすべきだと思います。 –

+0

いいえ、あまり問題にならないはずです。あなたの 'onClickListener'を' ImageView'に設定して、それらをクリック可能(XMLレイアウトやコードのいずれか)として設定してください。あなたは大丈夫です。クリックアクションは、移動イベントとは少し異なるパスです。 –

関連する問題