Android ViewPager - 动态宽度&多个可见页面

时间:2016-10-28 16:56:44

标签: android android-fragments android-viewpager horizontalscrollview

我的问题非常复杂,我很难找到解决方案来实现以下目标:

  

我需要有一种传说(步进)布局,其中一个孩子由左栏制成,后面是一个圆圈,后面是一个右栏。像“-o-”那样严厉地说话。因此,一系列儿童看起来像这样:“ - o-o-o-o-o”。当图例聚焦于一个孩子意味着当前孩子就是这个孩子时,这个孩子有一个更大的圆圈和更长的条:“ - O--”。

     

最终渲染看起来像这样:“ - o-o - O - o-o-”。

每个子项(“ - o - ”)对应于数据库中的特定项。当孩子获得焦点(“ - O--”)时,相关项目将显示在下方。当用户从右向左滑动时,将显示下一个项目,而从左向右滑动将显示上一个项目。

当滑动时,为了显示哪个孩子将显示其相应的项目,请说孩子将被动画显示它具有焦点。我使用Animator来:

  1. 增加子项的条宽和圆的大小 获得关注
  2. 减少以前关注的孩子的这些价值。
  3. 显示图例需要查看之前的内容和下一步的内容。

    我相信使用ViewPager可以帮助我实现以下目标:

    1. 它有一个“锚效应”,意味着滑动将从一个孩子移动到另一个孩子,以圆圈为中心:条形之间的圆圈就是锚点,可以这么说。
    2. 我可以通过覆盖自定义getPageWidth()
    3. adapter方法在屏幕上显示多个页面

      我想到的另一个解决方案是HorizontalScrollView。 如果我要使用它,根据滑动属性(强度,速度),图例将不确定地滚动而不锚定圆圈。

      但使用ViewPager有一个很大的问题:每个页面都有相同的宽度。但是,图例的锚定孩子需要更大(因此需要更多宽度)。

      那么如何动态更改宽度?

      除非我可以自定义HorizontalScrollView以通过滑动拦截来添加锚点效果?

2 个答案:

答案 0 :(得分:0)

我认为还有CarouselLayoutManager可能包括你想要的效果。

答案 1 :(得分:0)

如果您使用ViewPager,我认为最好的方法是使用OnPageChangeListener。当用户向左/向右滑动时,您将收到回调,以便您可以根据用户滑动的位置调整指示器的大小。

    private int mCurrentPage = 0;

    viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {

        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            // positionOffset goes from 0.0 to just under 1.0 for the leftmost page

            float otherOffset = 1.0 - positionOffset;

            if (position == mCurrentPage) { // user is incrementing page, i.e. swiping left
                // size of current page indicator based on otherOffset
                // size of next page indicator based on positionOffset

            } else { // user is decrementing page, i.e. swiping right

                // size of current page indicator based on positionOffset
                // size of previous page indicator based on otherOffset
            }
        }

        @Override
        public void onPageSelected(int position) {
            mCurrentPage = position;

            // ... set final sizes: page @ position = 1.0 all others 0.0
        }
    });

以下是理解positionpositionOffset的方法:当网页已确定时,它会居中。假设当前页面位置== 1(即第2页)。

  • 第一种情况:用户向左滑动即可转到下一页。假设用户滑动10%的距离以进入下一页。 position将为1(最左侧显示),positionOffset将为0.1(视口左边缘位于最左侧页面的10%)。因此,当用户滑动时,positionOffset将从0.0转到1.0下方。

  • 第二种情况:用户向右滑动即可转到上一页。当用户向前一页滑动10%的距离时,position将为0(最左侧显示),positionOffset将为0.9(视口左边缘位于最左侧的90%处)页)。因此,当用户滑动时,positionOffset将从1.0下方转移到0.0

至于指标本身,我做了一个类似的寻呼机指示器,我使用了LinearLayout水平方向,为每个页面添加了子指示器视图。我使用pagerAdapter.getCount()来获取要添加的视图数量。

你的指标对于动画来说更复杂,但如果我这样做,我会使用View ScaleDrawable .setFields()背景来制作可能会改变大小的图形。