Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.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水平滚动视图的行为类似于iPhone(分页)_Android_Image_Scroll_Paging - Fatal编程技术网

Android水平滚动视图的行为类似于iPhone(分页)

Android水平滚动视图的行为类似于iPhone(分页),android,image,scroll,paging,Android,Image,Scroll,Paging,我在水平滚动视图中有一个线性布局。内容只是一个图像。在滚动时,我需要实现与在iPhone上设置分页选项(相当于HSW)时相同的行为(滚动列表应该在列表上的每一页停止,而不是继续移动) 这在Android中是如何实现的?我应该自己实现这些功能,还是要设置特定属性或实现HSV的子类?因此,我的解决方案是: 截取onTouch事件并计算页面是否应更改为下一个页面或保持当前页面 从HorizontalScrollView继承并重写computeScroll方法 该方法计算croll调用以移动列表。默认情

我在水平滚动视图中有一个线性布局。内容只是一个图像。在滚动时,我需要实现与在iPhone上设置分页选项(相当于HSW)时相同的行为(滚动列表应该在列表上的每一页停止,而不是继续移动)

这在Android中是如何实现的?我应该自己实现这些功能,还是要设置特定属性或实现HSV的子类?

因此,我的解决方案是:

  • 截取onTouch事件并计算页面是否应更改为下一个页面或保持当前页面
  • 从HorizontalScrollView继承并重写computeScroll方法
  • 该方法计算croll调用以移动列表。默认情况下,我认为它的实现是以一定的比率减速。。。 因为我不想要这个动议,我只是覆盖它而不指定一个主体

    事件处理程序的代码为:

    _scrollView.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if(event.getAction() == MotionEvent.ACTION_UP)
                {
                    float currentPosition = _scrollView.getScrollX();
                    float pagesCount = _horizontalBar.getChildCount();
                    float pageLengthInPx = _horizontalBar.getMeasuredWidth()/pagesCount;
                    float currentPage = currentPosition/pageLengthInPx;
    
                    Boolean isBehindHalfScreen =  currentPage-(int)currentPage > 0.5;
    
                    float edgePosition = 0;
                    if(isBehindHalfScreen)
                    {
                        edgePosition = (int)(currentPage+1)*pageLengthInPx;
                    }
                    else
                    {
                        edgePosition = (int)currentPage*pageLengthInPx;
                    }
    
                    _scrollView.scrollTo((int)edgePosition, 0);
                }
    
                return false;
            }
        });
    
    在我继承的横向观点中

    @Override
        public void  computeScroll  (){
            return;
        }
    

    我在这里找到了一个很好的解决方案:

    这是一个经过清理的GitHub版本的代码,可在此处找到:

    仅仅在图像上使用它似乎有些过分,但这个解决方案允许使用一个小技巧进行无限分页(即:当在第一页时,您可以向后滚动到最后一页,当在最后一页时,您可以向前滚动到第一页)。它还允许您拥有未知数量的页面,并通过使用另一个小技巧动态生成内容。请看我在第二个链接中的评论

    详细了解我是如何做到这一点的


    希望这能有所帮助。

    Android中的新兼容性软件包(第3版)添加了一个ViewPager,可以实现这一点


    我找到了另一种方法来获得同样的效果,我认为它更具可读性。方法如下:

    @Override
            public boolean onTouch(View v, MotionEvent event) {
                if(event.getAction() == MotionEvent.ACTION_UP)
                {
                    float currentPosition = hsv.getScrollX();
                    float pagesCount = hsv.getChildCount();
                    float pageLengthInPx = hsv.getMeasuredWidth()/pagesCount;
    
                    int page = (int) (Math.floor((currentPosition - pageLengthInPx / 2) / pageLengthInPx) + 1);
                    hsv.scrollTo((int) (page * pageLengthInPx), 0);
                }
    
                return false;
            }
    

    水平页面或真实视图切换器的问题是,如果您将ListView作为子视图添加,并且ListView没有超过屏幕的高度,则中间的空间(从ListView的最后一行到屏幕的末尾)将填充“白色”或透明背景。关于这个问题有什么想法吗?这在ViewPagerSorry中已经过时了,但我不记得了。这是个老问题对不起:(其中hsv是对象HorizontalScrollView:PI认为HorizontalScrollView将只接受一个子项,这是某种布局组…该组是添加子项的位置,因此将从那里检索子项的数量。检查本教程,它可以工作,对于水平分页来说非常简单:ViewPager docs在这里:ViewPager教程在这里: