【问题标题】:Stopping a scroll view on specific locations on Android在 Android 上的特定位置停止滚动视图
【发布时间】:2016-03-03 13:55:38
【问题描述】:

我的最终目标是在特定位置停止滚动,以便将正在查看的对象完全显示出来,而我想出的解决方案是在释放触摸时检查视图的 scrollX 位置。我确实遇到了动量问题,因为在捕捉到触摸事件后,由于滚动速度,滚动仍然可以继续,我使用 MotionEvent.ACTION_CANCEL 解决了这个问题,我对此并不满意,因为 scrollTo 在视觉上令人愉悦,但是 MotionEvent .ACTION_CANCEL 取消它的效果。

我的问题是,有没有更优雅的方法来做到这一点?理想的情况是我可以简单地指示我的 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;
        }
    });

【问题讨论】:

    标签: android scrollview android-scrollview


    【解决方案1】:

    如果您想精确滚动以显示特定视图,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() 方法必须根据您想要的显示视图数量和实例化方式来实现。

    【讨论】:

    • 谢谢,这方面我没问题。我对您描述的方法在使用 OnTouchListener 应用时效果不佳这一事实有更大的困难,因为在调用聚焦方法后,由于滚动速度可能会发生残余滚动。
    • 谢谢,这个 ViewPager 好像是我要找的功能。
    【解决方案2】:

    如果您想在 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
    
        }
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多