停止Android上特定位置的滚动视图
我的最终目标是在特定位置停止滚动,这样可以完全显示正在查看的对象,而我提出的解决方案是在释放触摸时检查视图的scrollX位置。我确实有一个动量问题,因为在捕捉到触摸事件后,由于滚动速度的原因,滚动仍然可以继续,我使用MotionEvent.ACTION\u CANCEL解决了这个问题,我对此不满意,因为滚动在视觉上是令人愉悦的,但是MotionEvent.ACTION\u CANCEL消除了它的效果 我的问题是,有没有一种更优雅的方式来做到这一点?理想的情况是,我可以简单地指示我的滚动视图不要有动量/速度停止Android上特定位置的滚动视图,android,scrollview,android-scrollview,Android,Scrollview,Android Scrollview,我的最终目标是在特定位置停止滚动,这样可以完全显示正在查看的对象,而我提出的解决方案是在释放触摸时检查视图的scrollX位置。我确实有一个动量问题,因为在捕捉到触摸事件后,由于滚动速度的原因,滚动仍然可以继续,我使用MotionEvent.ACTION\u CANCEL解决了这个问题,我对此不满意,因为滚动在视觉上是令人愉悦的,但是MotionEvent.ACTION\u CANCEL消除了它的效果 我的问题是,有没有一种更优雅的方式来做到这一点?理想的情况是,我可以简单地指示我的滚动视图不要
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;
}
});
myView.setOnTouchListener(新的HorizontalScrollView.OnTouchListener(){
@凌驾
公共布尔onTouch(视图v,运动事件){
if(event.getAction()==MotionEvent.ACTION\u UP){
event.setAction(MotionEvent.ACTION\u CANCEL);
int x=myView.getScrollX();
如果(x<150)
myView.scrollTo(0,0);
else if(x如果您想要精确滚动以显示特定视图,应该会对您有所帮助。您需要做的是在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()
方法必须根据所需的显示视图数量和它们的实例化方式来实现。如果您希望精确滚动以显示特定视图,应该会有所帮助。您需要做的是调用myView.scrollTo(0,view.getBottom())
或myView.smoothScrollTo(0,view.getBottom())
在UI线程上。这样,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()
方法必须根据所需的显示视图数量和实例化方式来实现。如果要在滚动视图时获取当前位置,应使用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
}
});
如果要在滚动视图时获取当前位置,应使用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
}
});
谢谢,这方面我还可以。我更难理解的是,您描述的方法在使用OnTouchListener应用时效果不好,因为调用聚焦方法后,由于滚动速度可能会出现剩余滚动。谢谢,这个ViewPager似乎就是我要找的功能。谢谢,这方面我还可以。我更难理解的是,您描述的方法在使用OnTouchListener应用时效果不好,因为调用聚焦方法后,由于滚动速度的原因,可能会出现剩余滚动。谢谢,这个ViewPager似乎就是我想要的功能。