2016-03-03 80 views
1

我的最终目标是停止在特定位置的滚动,以便查看的对象完全显示,并且我提出的解决方案是通过检查视图的scrollX位置触摸被释放。我确实有一个动量问题,由于在捕捉触摸事件之后滚动速度还可以继​​续,所以我解决了使用MotionEvent.ACTION_CANCEL,我不满意,因为scrollTo是令人愉快的,但MotionEvent .ACTION_CANCEL杀死它的效果。在Android上停止滚动视图在特定位置

我的问题是,有没有更好的方法来做到这一点?如果我可以简单地指示我的ScrollView不具有动量/速度,理想状态就是如此。

myView.setOnTouchListener(new HorizontalScrollView.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if (event.getAction() == MotionEvent.ACTION_UP) { 
       event.setAction(MotionEvent.ACTION_CANCEL); 
       int x = myView.getScrollX(); 
       if (x < 150) 
        myView.scrollTo(0,0); 
       else if (x<450) 
        myView.scrollTo(300,0); 
       else 
        myView.scrollTo(600,0); 
      } 
      return false; 
     } 
    }); 

回答

0

如果您想精确滚动以显示特定视图,this answer应该对您有帮助。你需要做的是在UI线程上调用myView.scrollTo(0, view.getBottom())myView.smoothScrollTo(0, view.getBottom())。这样,view对象将完全显示。


编辑:在我看来,你想在这里实现的是非常接近到什么ViewPager做:你的目的是要与刷卡/扫视姿势的视图之间移动,提供完全可视的分页浏览内容。

如果你使用ViewPager,这是怎么了你的代码可能已经看过:

viewPager.setAdapter(new PagerAdapter() { 

      @Override 
      public boolean isViewFromObject(View view, Object object) { 
       return view == object; 
      } 

      @Override 
      public int getCount() { 
       return getViewCount(); 
      } 

      @Override 
      public Object instantiateItem(ViewGroup container, int position) { 
       View view = getViewAtPosition(position); 
       container.addView(view); 
       return view; 
      } 

      @Override 
      public void destroyItem(ViewGroup container, int position, Object view) { 
       container.removeView((View) view); 
      } 
     }); 

getViewCount()getViewAtPosition()方法必须相应地实现你想要多少显示的视角,他们被实例化的方式。

+0

谢谢,这方面我没问题。当使用OnTouchListener应用时,您描述的方法效果不佳,因为调用聚焦方法后滚动速度可能会发生残留滚动。 – Gil

+0

谢谢,这个ViewPager似乎是我正在寻找的功能。 – Gil

0

如果您想在scrollView滚动时获取当前位置,则应该使用onScrollListener

scrollView.getViewTreeObserver().addOnScrollChangedListener(new OnScrollChangedListener() { 

    @Override 
    public void onScrollChanged() { 

     int scrollX = rootScrollView.getScrollX(); //for horizontalScrollView 
     int scrollY = rootScrollView.getScrollY(); //for verticalScrollView 
     //DO SOMETHING WITH THE SCROLL COORDINATES 

    } 
}); 
相关问题