Android水平滚动视图表现得像iPhone(分页)

Dav*_*sti 29 paging android scroll image

我在Horizo​​ntalScrollView中有一个LinearLayout.内容只是一张图片.在滚动时,我需要实现与在相当于HSW的iPhone上设置分页选项时相同的行为(滚动列表应该停在列表中的每个页面上,而不是继续移动).

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

ave*_*eyD 20

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

水平寻呼机

这是一个清理过的GitHub版本的代码:

真实视图切换器

在图像上使用它可能看起来有点过分,但是这个解决方案允许使用一个小技巧进行无限分页(即:在第一页上,您可以滚动回到最后一页,在最后一页上,您可以向前滚动到第一页).它还允许您拥有未知数量的页面,并使用另一个小技巧动态生成内容.请在此处的第二个链接中查看我的评论

有关我如何完成这一点的详细信息.

希望这可以帮助.


Pat*_*oos 15

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

http://developer.android.com/sdk/compatibility-library.html


Dav*_*sti 13

所以,我的解决方案是:

  1. 拦截onTouch事件并计算页面是否应该更改为下一个或保持当前
  2. 从Horizo​​ntalScrollView继承并覆盖方法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;
        }
    });
Run Code Online (Sandbox Code Playgroud)

在我继承的Horizo​​ntalScrollView中

@Override
    public void  computeScroll  (){
        return;
    }
Run Code Online (Sandbox Code Playgroud)