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

时间:2010-04-07 18:51:52

标签: android image scroll paging

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

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

4 个答案:

答案 0 :(得分:20)

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

Horizontal Pager

这是在这里找到的代码的清理GitHub版本:

Real View Switcher

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

中查看我的评论

有关我如何完成此任务的详细信息。

希望这有帮助。

答案 1 :(得分:15)

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

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

答案 2 :(得分:13)

所以,我的解决方案是:

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

    在我继承的Horizo​​ntalScrollView

    @Override
        public void  computeScroll  (){
            return;
        }
    

答案 3 :(得分:-1)

我发现了另一种获得相同效果的方法,我认为更具可读性。这是方法:

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