【问题标题】:Android horizontal scrollview behave like iPhone (paging)Android 水平滚动视图的行为类似于 iPhone(分页)
【发布时间】:2011-02-05 09:47:09
【问题描述】:

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

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

【问题讨论】:

标签: android image scroll paging


【解决方案1】:

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

Horizontal Pager

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

Real View Switcher

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

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

希望这会有所帮助。

【讨论】:

  • Horizo​​ntal Page 或 Real View Switcher 的问题是,如果你添加一个 ListView 作为子项,并且 ListView 不超过屏幕的高度,则中间的空间(ListView 的最后一行到屏幕末端)填充“白色”或透明背景。关于这个问题有什么想法吗?
  • ViewPager 已经过时了
【解决方案2】:

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

@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 是对象 Horizo​​ntalScrollView :P
  • 我认为 Horizo​​ntalScrollView 将只接受一个孩子,这是某种布局组......这个组是孩子将被添加的地方,所以他们的数量将从那里开始已检索。
【解决方案3】:

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

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

【解决方案4】:

所以,我的解决方案是:

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

在我继承的 Horizo​​ntalScrollView 中

@Override
    public void  computeScroll  (){
        return;
    }

【讨论】:

  • 对不起,我不记得了。这是一个老问题对不起:(
猜你喜欢
  • 1970-01-01
  • 2012-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-18
相关资源
最近更新 更多