【问题标题】:ViewPager halfway scrolled callbackViewPager 中途滚动回调
【发布时间】:2014-09-11 22:21:52
【问题描述】:

我有一个 ViewPager,上面的 ViewPager 是一个 TextView。当我在 ViewPager 中更改页面时,TextView 应该根据新页面的内容更新其文本。

我在 ViewPager 的 OnPageChangeListener 的 onPageSelected 方法中调用 setText 方法。效果很好!

现在我想添加一点动画。滑动时,文本应该淡出,当它到一半时,它应该淡出,并带有新文本。我设法为文本制作了 alpha 动画。但是,文本在 文本褪色后会发生变化。一旦文本不可见(滚动到一半),我想更改文本。

有什么帮助吗?这是我的代码:

weekPager.setOnPageChangeListener(new OnPageChangeListener() {

        @Override
        public void onPageSelected(int index) {
            //update the text
            weekText.setText(DateTimeUtils.getWeekDescription(index));
        }

        @Override
        public void onPageScrolled(int arg0, float ratio, int arg2) {
            //do the alpha animation
            weekText.setAlpha(Math.abs(2f * (ratio - .5f)));
        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
        }
    });

【问题讨论】:

标签: android android-viewpager


【解决方案1】:

你可以试试这样的

在您的活动中声明这些变量

private int mIndex = 0;
private int lastIndex = 0;
private float mStartDragX = 0;

然后

@Override
public void onPageScrolled(int arg0, float ratio, int arg2) {
        //do the alpha animation
        float alpha = 2f * (ratio - .5f);
        weekText.setAlpha(Math.abs(alpha));

        //If the text hasn't been set and ratio is at least halfway from 0 -> 1
        // alpha should be near 0, ideally exactly 0
        if((mIndex != lastIndex) && (alpha >= 0))
        {
           weekText.setText(DateTimeUtils.getWeekDescription(mIndex));
           lastIndex = mIndex;
        }
}

编辑: 为了正确设置 mIndex,您需要做一些额外的工作。

来自这个问题How to get current swipe direction in action in ViewPager

似乎一种方法是 ViewPager 的 onTouchListener,我不确定这是否会完美运行,但值得一试。

myPager.setOnTouchListener(new ViewPager.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        float x = event.getX();

        switch(event.getAction()){
        case MotionEvent.ACTION_DOWN:
            mStartDragX = x;
            break;
        case MotionEvent.ACTION_MOVE:
            if (event.getX() > mStartDragX )
            {
                Log.i(TAG,"SWIPING RIGHT - Selecting page to the left");
                if(mIndex == lastIndex)
                   mIndex--;
            } else if (event.getX() < mStartDragX)
            {
                Log.i(TAG,"SWIPING LEFT - Selecting page to the right");
                if(mIndex == lastIndex)
                   mIndex++;
            }
            break;
        }
        return false;
    }
});

如果您有一个标签栏,您还必须在用户按下这些按钮时设置 mIndex。

【讨论】:

  • 不正确。它确实在正确的时间调用了 setText 方法,但 mIndex 仍然是旧值,所以文本仍然没有改变。
  • 啊这是因为 onPageSelected 发生在滚动之后。 arg0 似乎是旧页面的位置。让我编辑一下
  • @MarkBuikema 尝试使用编辑的新代码,基本上目标是在 setText 调用之前设置 mIndex ,如果这不起作用,您必须弄清楚如何自己跟踪索引并在选择 viewpager 的页面之前设置它。如果右侧页面的像素偏移为负,您可能必须反转 arg2 比较。
  • 当我向右滚动时效果很好,但是当我向左滚动时,松开手指后文本会发生变化。
  • 似乎像素(arg2)从不为负,索引(arg0)始终是最左边可见页面的索引。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-02
  • 2013-03-11
  • 2020-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多