Android ViewPager半滚动回调

Android ViewPager半滚动回调,android,android-viewpager,Android,Android Viewpager,我有一个ViewPager,上面是一个TextView。当我在ViewPager中更改页面时,TextView应该根据新页面的内容更新其文本 我在ViewPager的OnPageChangeListener的onPageSelected方法中调用setText方法。它工作得很好 现在我想添加一点动画。在刷卡时,文本应该淡出,当移动到一半时,它应该随着新文本淡出。我设法为文本制作了alpha动画。但是,在文本淡出后,文本正在发生变化。一旦文本不可见(滚动到一半),我想更改文本 有什么帮助吗?这是我

我有一个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) {
        }
    });

你可以试试这样的

在活动中声明这些变量

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

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

从这个问题

一种方法似乎是使用ViewPager,我不确定这是否能完美工作,但值得一试

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;
    }
});
myPager.setOnTouchListener(新的ViewPager.OnTouchListener(){
@凌驾
公共布尔onTouch(视图v,运动事件){
float x=event.getX();
开关(event.getAction()){
case MotionEvent.ACTION\u DOWN:
mStartDragX=x;
打破
case MotionEvent.ACTION\u移动:
if(event.getX()>mStartDragX)
{
i(标记“向右滑动-向左选择页面”);
if(mIndex==lastIndex)
mIndex--;
}else if(event.getX()

如果你有一个选项卡栏,当用户按下这些按钮时,你还必须设置mIndex。

你能不能不只是在整个ViewPager中添加动画?嗯,这实际上不是一个动画,它实际上是根据滑动进度调整alpha。这就是我相信你可以在整个ViewPager上做的,而不是处理每个单独的视图。我认为你不理解这个问题,请再读一遍。看他们如何为这条带设置动画是不正确的。它确实在正确的时间调用了setText方法,但是mIndex仍然是旧值,所以文本仍然没有改变。啊,这是因为onPageSelected发生在滚动之后。arg0似乎是旧页的位置。让我做一份报告edit@MarkBuikema使用edit尝试新代码,基本上目标是在setText调用之前设置mIndex,如果这不起作用,您必须自己找出如何跟踪索引,并在选择viewpager的页面之前设置索引。如果右侧页面的像素偏移量为负数,则可能必须反转arg2比较。向右滚动时效果很好,但向左滚动时,松开手指后文本会发生变化。看起来像素(arg2)永远不会为负数,索引(arg0)始终是最左侧可见页面的索引。
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;
    }
});