Android横向滚动视图如何像iPhone一样分页滚动

31

我有一个 LinearLayout 放在 HorizontalScrollView 里,内容只是一张图片。当滑动时,我需要实现与 iPhone 上的 HSW 的分页选项相同的行为(滚动列表应停在列表中的每一页,而不是继续移动)。

在 Android 中如何实现这个功能?我应该自己实现这个特性还是有特定的属性或者 HSV 的子类可以实现?


1
请查看此教程,它非常简单易懂,适用于水平分页设计: http://mobile.tutsplus.com/tutorials/android/android-user-interface-design-horizontal-view-paging/ - pedrotorres
4个回答

20

我在这里找到了一个不错的解决方案:

水平分页器

这是代码的清理版本,原始代码请参考此处:

真实视图切换器

虽然它似乎有点过于复杂,只是在图片上使用它,但这个解决方案允许无限分页,并使用一个小技巧(即:当在第一页时,您可以向后滚动到最后一页;当在最后一页时,您可以向前滚动到第一页)。 它还允许您拥有未知数量的页面并通过使用另一个小技巧动态生成内容。请参见我在第二个链接中的评论 这里 的详细信息。

希望这能帮到你。


水平页面或真实视图切换器的问题在于,如果您将ListView作为子项添加,并且ListView不超过屏幕高度,则在其最后一行到屏幕末端之间的空间中填充了“白色”或透明背景。对于这个问题有什么想法吗? - jake
1
这已经过时了,应该使用ViewPager。 - shane

15

我的解决方案如下:

  1. 拦截onTouch事件并计算页面是否应该切换到下一页或继续保持当前页
  2. 继承HorizontalScrollView并重写方法computeScroll

方法computeScroll被调用以移动列表。默认情况下,我认为它是实现了一定比例的减速...由于我不想要这种运动,所以我只是覆盖它而没有指定具体内容。

事件处理程序的代码如下:

_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;
        }
    });

而且在我继承的HorizontalScrollView中

@Override
    public void  computeScroll  (){
        return;
    }

抱歉,但我记不起来了。这是个老问题,非常抱歉:( - Davide Vosti

15

ViewPager 的文档在这里:http://developer.android.com/reference/android/support/v4/view/ViewPager.html - ban-geoengineering
ViewPager教程在这里:http://developer.android.com/training/animation/screen-slide.html - ban-geoengineering

0

我找到了另一种方法来达到相同的效果,而且我认为更易读。以下是这种方法:

@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;
        }

其中 hsv 是 HorizontalScrollView 对象:P - David H.
1
我认为HorizontalScrollView只能接受一个子元素,该元素是某种布局组...这个组是子元素将被添加的地方,因此可以从那里检索到它们的数量。 - Mike M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接