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

问题描述 投票:0回答:4

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

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

android image scroll pagination
4个回答
20
投票

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

水平寻呼机

这是代码的清理版 GitHub 版本:

真实视图切换器

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

了解我如何完成此操作的详细信息。

希望这有帮助。


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

15
投票

Android 中新的兼容性包(修订版 3)添加了一个 ViewPager 来执行此操作。

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


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;
        }
© www.soinside.com 2019 - 2024. All rights reserved.