2016-08-01 13 views
0

私は自動的にスクロールビューをビューの下部にスクロールしています。ユーザーのタッチでスクロールビューをスクロールする

scrollView.smoothScrollTo(0, scrollView.getBottom()); 

ユーザーがレイアウトに触れた場合、私は現在の位置に&滞在を停止するには、スクロールが必要になります。

scrollView.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if (event.getAction() == MotionEvent.ACTION_DOWN) { 
       //// TODO: 01/08/16 STOP SCROLLING 
      } 
      return false; 
     } 
    }); 

私はsmoothScrollBy(0,0);を試しましたが、機能しません。

答えて

0

私はObjectAnimatorを使って解決しました。それは解決策としてエレガントに働いただけでなく、スクロール速度を制御することもできました。

私は

objectAnimator = ObjectAnimator 
       .ofInt(scrollView, "scrollY", scrollView.getBottom()) 
       .setDuration(3000); 
objectAnimator.start(); 

、その後

scrollView.setOnTouchListener(new View.OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       if (event.getAction() == MotionEvent.ACTION_DOWN) { 
        objectAnimator.cancel(); 
       } 
       return false; 
      } 
     }); 

scrollView.smoothScrollTo(0, scrollView.getBottom()); 

を置き換えます

0

既存のスクロール動作を停止するsmoothScrollToPositionを使用する方法があります。このメソッドには、APIレベル> = 8(Android 2.2、Froyo)が必要です。

現在の位置が希望の位置から大きく離れている場合、スムーズなスクロールにはかなりの時間がかかります(少なくともAndroid 4.4 KitKatでのテストでは少しばかり見えます)。また、setSelectionとsmoothScrollToPositionを呼び出す組み合わせによって、位置が「ミス」する可能性があることがわかりました。これは、現在の位置が目的の位置に非常に近い場合にのみ発生するようです。

私の場合、ユーザーがボタンを押したときにリストが上に移動するようにしたい(これはごくわずかですが、これはあなたのニーズに合わせる必要があります)。できれば

は、私が直接あなたの質問に答えていない

case R.id.action_go_to_today: 
    ListView listView = (ListView) findViewById(R.id.lessonsListView); 
    smartScrollToPosition(listView, 0); // scroll to top 
    return true; 

上記を次のように私は、これを呼ばれるボタンのための私のアクションハンドラでは

private void smartScrollToPosition(ListView listView, int desiredPosition) { 
    // If we are far away from the desired position, jump closer and then smooth scroll 
    // Note: we implement this ourselves because smoothScrollToPositionFromTop 
    // requires API 11, and it is slow and janky if the scroll distance is large, 
    // and smoothScrollToPosition takes too long if the scroll distance is large. 
    // Jumping close and scrolling the remaining distance gives a good compromise. 
    int currentPosition = listView.getFirstVisiblePosition(); 
    int maxScrollDistance = 10; 
    if (currentPosition - desiredPosition >= maxScrollDistance) { 
     listView.setSelection(desiredPosition + maxScrollDistance); 
    } else if (desiredPosition - currentPosition >= maxScrollDistance) { 
     listView.setSelection(desiredPosition - maxScrollDistance); 
    } 
    listView.smoothScrollToPosition(desiredPosition); // requires API 8 
} 

に次のメソッドを使用しますが、現在の位置があなたの希望する位置またはその近くにあるときに検出すると、smoothScrollToPositionを使用してスクロールを停止できます。

関連する問題