Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
停止Android上特定位置的滚动视图_Android_Scrollview_Android Scrollview - Fatal编程技术网

停止Android上特定位置的滚动视图

停止Android上特定位置的滚动视图,android,scrollview,android-scrollview,Android,Scrollview,Android Scrollview,我的最终目标是在特定位置停止滚动,这样可以完全显示正在查看的对象,而我提出的解决方案是在释放触摸时检查视图的scrollX位置。我确实有一个动量问题,因为在捕捉到触摸事件后,由于滚动速度的原因,滚动仍然可以继续,我使用MotionEvent.ACTION\u CANCEL解决了这个问题,我对此不满意,因为滚动在视觉上是令人愉悦的,但是MotionEvent.ACTION\u CANCEL消除了它的效果 我的问题是,有没有一种更优雅的方式来做到这一点?理想的情况是,我可以简单地指示我的滚动视图不要

我的最终目标是在特定位置停止滚动,这样可以完全显示正在查看的对象,而我提出的解决方案是在释放触摸时检查视图的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似乎就是我想要的功能。