试验1

当节目单view往左滑动时,跟踪view的left,right等位置信息。

public void logView(View view) {
    Logger.i(TAG, "left:"+view.getLeft()+", right:"+view.getRight()+", top:"+view.getTop()+", bottom:"+view.getBottom());
}
public void slideView(final View view, final float fromX, final float toX) {
    Logger.i(TAG, "++slideView++");
    Logger.i(TAG, "fromX:"+fromX+", toX:"+toX);
    logView(view);
    Animation.AnimationListener animationListener = new Animation.AnimationListener() {
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
        @Override
        public void onAnimationStart(Animation animation) {
            Logger.i(TAG, "++onAnimationStart++");
            logView(view);
        }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
        @Override
        public void onAnimationRepeat(Animation animation) {
            Logger.i(TAG, "++onAnimationRepeat++");
            logView(view);
        }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
        @Override
        public void onAnimationEnd(Animation animation) {
            Logger.i(TAG, "++onAnimationEnd++");
            logView(view);
            float offset = toX - fromX;
            view.setLeft(view.getLeft() + (int)offset);
            view.setRight(view.getRight() + (int)offset);
            Logger.i(TAG, "++modify left & right++");
            logView(view);
            view.requestLayout();
            Logger.i(TAG, "++requestLayout++");
            logView(view);
        }
    };
    TranslateAnimation animation = new TranslateAnimation(fromX, toX, 0, 0);
    animation.setInterpolator(new OvershootInterpolator());
    animation.setDuration(500);
    animation.setStartOffset(0);
    animation.setAnimationListener(animationListener);
    view.startAnimation(animation);
}

结果是:通过动画滑到左边之后,又自己滑回来了。

打印出来的日志(如下)

11-13 11:18:19.703: D/PullToRefreshView(7813): ++onFling++
11-13 11:18:19.703: D/PullToRefreshView(7813): velocityX:-1714.6082, velocityY:926.9663
11-13 11:18:19.703: D/WatchTvFragment(7813): ++slideRight2LeftProgramView++
11-13 11:18:19.703: D/WatchTvFragment(7813): ++slideView++
11-13 11:18:19.703: D/WatchTvFragment(7813): fromX:0.0, toX:-426.0
11-13 11:18:19.703: D/WatchTvFragment(7813): left:427, right:986, top:0, bottom:703
11-13 11:18:19.703: D/PullToRefreshView(7813): ++onTouchEvent++
11-13 11:18:19.723: D/WatchTvFragment(7813): ++onAnimationStart++
11-13 11:18:19.723: D/WatchTvFragment(7813): left:427, right:986, top:0, bottom:703
11-13 11:18:20.243: D/WatchTvFragment(7813): ++onAnimationEnd++
11-13 11:18:20.243: D/WatchTvFragment(7813): left:427, right:986, top:0, bottom:703
11-13 11:18:20.243: D/WatchTvFragment(7813): ++modify left & right++
11-13 11:18:20.243: D/WatchTvFragment(7813): left:1, right:560, top:0, bottom:703
11-13 11:18:20.243: D/WatchTvFragment(7813): ++requestLayout++
11-13 11:18:20.243: D/WatchTvFragment(7813): left:1, right:560, top:0, bottom:703

试验2

如果将上面代码中的第31,32,33行注释掉,结果是滑到左边就不再滑回来,但是会闪一下。

打印的日志如下

11-13 11:30:55.843: D/PullToRefreshView(8595): ++onFling++
11-13 11:30:55.843: D/PullToRefreshView(8595): velocityX:-1911.3549, velocityY:379.53253
11-13 11:30:55.843: D/WatchTvFragment(8595): ++slideRight2LeftProgramView++
11-13 11:30:55.843: D/WatchTvFragment(8595): ++slideView++
11-13 11:30:55.843: D/WatchTvFragment(8595): fromX:0.0, toX:-426.0
11-13 11:30:55.843: D/WatchTvFragment(8595): left:427, right:986, top:0, bottom:703
11-13 11:30:55.843: D/PullToRefreshView(8595): ++onTouchEvent++
11-13 11:30:55.853: D/WatchTvFragment(8595): ++onAnimationStart++
11-13 11:30:55.853: D/WatchTvFragment(8595): left:427, right:986, top:0, bottom:703
11-13 11:30:56.353: D/WatchTvFragment(8595): ++onAnimationEnd++
11-13 11:30:56.353: D/WatchTvFragment(8595): left:427, right:986, top:0, bottom:703
11-13 11:30:56.353: D/WatchTvFragment(8595): ++modify left & right++
11-13 11:30:56.353: D/WatchTvFragment(8595): left:1, right:560, top:0, bottom:703

试验3

修改上面的代码(如下)。在代码中添加clearAnimation方法。

    public void slideView(final View view, final float fromX, final float toX) {
        Logger.i(TAG, "++slideView++");
        Logger.i(TAG, "fromX:"+fromX+", toX:"+toX);
        logView(view);
        Animation.AnimationListener animationListener = new Animation.AnimationListener() {
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
            @Override
            public void onAnimationStart(Animation animation) {
                Logger.i(TAG, "++onAnimationStart++");
                logView(view);
            }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
            @Override
            public void onAnimationRepeat(Animation animation) {
                Logger.i(TAG, "++onAnimationRepeat++");
                logView(view);
            }
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
            @Override
            public void onAnimationEnd(Animation animation) {
                Logger.i(TAG, "++onAnimationEnd++");
                logView(view);
                view.clearAnimation();
                Logger.i(TAG, "++clear animation++");
                logView(view);
                float offset = toX - fromX;
                view.setLeft(view.getLeft() + (int)offset);
                view.setRight(view.getRight() + (int)offset);
                Logger.i(TAG, "++modify left & right++");
                logView(view);
//              view.requestLayout();
//              Logger.i(TAG, "++requestLayout++");
//              logView(view);
            }
        };
        TranslateAnimation animation = new TranslateAnimation(fromX, toX, 0, 0);
        animation.setInterpolator(new OvershootInterpolator());
        animation.setDuration(500);
        animation.setStartOffset(0);
        animation.setAnimationListener(animationListener);
        view.startAnimation(animation);
    }

执行后的结果是:滑到左边不再自己滑回来,也不会闪一下。

打印的日志如下

11-13 11:52:14.513: D/PullToRefreshView(10767): ++onFling++
11-13 11:52:14.513: D/PullToRefreshView(10767): velocityX:-1192.356, velocityY:317.86694
11-13 11:52:14.513: D/WatchTvFragment(10767): ++slideRight2LeftProgramView++
11-13 11:52:14.513: D/WatchTvFragment(10767): ++slideView++
11-13 11:52:14.513: D/WatchTvFragment(10767): fromX:0.0, toX:-426.0
11-13 11:52:14.513: D/WatchTvFragment(10767): left:427, right:986, top:0, bottom:703
11-13 11:52:14.513: D/PullToRefreshView(10767): ++onTouchEvent++
11-13 11:52:14.513: D/WatchTvFragment(10767): ++onAnimationStart++
11-13 11:52:14.513: D/WatchTvFragment(10767): left:427, right:986, top:0, bottom:703
11-13 11:52:15.023: D/WatchTvFragment(10767): ++onAnimationEnd++
11-13 11:52:15.023: D/WatchTvFragment(10767): left:427, right:986, top:0, bottom:703
11-13 11:52:15.023: D/WatchTvFragment(10767): ++clear animation++
11-13 11:52:15.023: D/WatchTvFragment(10767): left:427, right:986, top:0, bottom:703
11-13 11:52:15.023: D/WatchTvFragment(10767): ++modify left & right++
11-13 11:52:15.023: D/WatchTvFragment(10767): left:1, right:560, top:0, bottom:703

试验4

如果将楼上第31,32,33行的代码取消注释,结果是:

滑到左边自己会滑回来。

打印的日志同楼上相同,只是在最后多了两条:

11-13 11:52:15.023: D/WatchTvFragment(10767): ++requestLayout++
11-13 11:52:15.033: D/WatchTvFragment(10767): left:1, right:560, top:0, bottom:703

试验5

楼上是从右往左滑的操作,下面是从左往右的操作,滑动效果明显比较乱,打印的日志也不符合预期。其中left,right值已经不同于上次操作后日志显示的数值。

打印的日志如下

11-13 11:57:41.683: D/PullToRefreshView(10767): ++onFling++
11-13 11:57:41.683: D/PullToRefreshView(10767): velocityX:418.54935, velocityY:-59.648247
11-13 11:57:41.683: D/WatchTvFragment(10767): ++slideLeft2RightProgramView++
11-13 11:57:41.683: D/WatchTvFragment(10767): ++slideView++
11-13 11:57:41.683: D/WatchTvFragment(10767): fromX:-426.0, toX:0.0
11-13 11:57:41.683: D/WatchTvFragment(10767): left:427, right:986, top:0, bottom:703
11-13 11:57:41.683: D/PullToRefreshView(10767): ++onTouchEvent++
11-13 11:57:41.713: D/WatchTvFragment(10767): ++onAnimationStart++
11-13 11:57:41.713: D/WatchTvFragment(10767): left:427, right:986, top:0, bottom:703
11-13 11:57:42.223: D/WatchTvFragment(10767): ++onAnimationEnd++
11-13 11:57:42.223: D/WatchTvFragment(10767): left:427, right:986, top:0, bottom:703
11-13 11:57:42.223: D/WatchTvFragment(10767): ++clear animation++
11-13 11:57:42.223: D/WatchTvFragment(10767): left:427, right:986, top:0, bottom:703
11-13 11:57:42.223: D/WatchTvFragment(10767): ++modify left & right++
11-13 11:57:42.223: D/WatchTvFragment(10767): left:853, right:1412, top:0, bottom:703
11-13 11:57:42.223: D/WatchTvFragment(10767): ++requestLayout++
11-13 11:57:42.223: D/WatchTvFragment(10767): left:853, right:1412, top:0, bottom:703

试验6

修改楼上的代码(如下),不调用view.requestLayout(),取而代之执行view.layout(l,t,r,b)。

    public void slideView(final View view, final float fromX, final float toX) {
        Logger.i(TAG, "++slideView++");
        Logger.i(TAG, "fromX:"+fromX+", toX:"+toX);
        logView(view);
        Animation.AnimationListener animationListener = new Animation.AnimationListener() {
                                                                                                                                                                                                                                                                                                                                                                                     
            @Override
            public void onAnimationStart(Animation animation) {
                Logger.i(TAG, "++onAnimationStart++");
                logView(view);
            }
                                                                                                                                                                                                                                                                                                                                                                                     
            @Override
            public void onAnimationRepeat(Animation animation) {
                Logger.i(TAG, "++onAnimationRepeat++");
                logView(view);
            }
                                                                                                                                                                                                                                                                                                                                                                                     
            @Override
            public void onAnimationEnd(Animation animation) {
                Logger.i(TAG, "++onAnimationEnd++");
                logView(view);
                view.clearAnimation();
                Logger.i(TAG, "++clear animation++");
                logView(view);
                float offset = toX - fromX;
                view.setLeft(view.getLeft() + (int)offset);
                view.setRight(view.getRight() + (int)offset);
                Logger.i(TAG, "++modify left & right++");
                logView(view);
//              view.requestLayout();
//              Logger.i(TAG, "++requestLayout++");
//              logView(view);
                view.layout(view.getLeft(), view.getTop(), view.getRight(), view.getBottom());
                Logger.i(TAG, "layout("+view.getLeft()+"," +view.getTop()+"," +view.getRight()+"," +view.getBottom()+")");
                logView(view);
            }
        };
        TranslateAnimation animation = new TranslateAnimation(fromX, toX, 0, 0);
        animation.setInterpolator(new OvershootInterpolator());
        animation.setDuration(500);
        animation.setStartOffset(0);
        animation.setAnimationListener(animationListener);
        view.startAnimation(animation);
    }

程序执行记录如下:

(1)从右往左滑,没有闪屏,也没有自己滑回去,结果在预期位置。

11-13 12:06:20.353: D/PullToRefreshView(11605): ++onFling++
11-13 12:06:20.353: D/PullToRefreshView(11605): velocityX:-1541.0804, velocityY:138.03113
11-13 12:06:20.353: D/WatchTvFragment(11605): ++slideRight2LeftProgramView++
11-13 12:06:20.353: D/WatchTvFragment(11605): ++slideView++
11-13 12:06:20.353: D/WatchTvFragment(11605): fromX:0.0, toX:-426.0
11-13 12:06:20.353: D/WatchTvFragment(11605): left:427, right:986, top:0, bottom:703
11-13 12:06:20.353: D/PullToRefreshView(11605): ++onTouchEvent++
11-13 12:06:20.353: D/WatchTvFragment(11605): ++onAnimationStart++
11-13 12:06:20.353: D/WatchTvFragment(11605): left:427, right:986, top:0, bottom:703
11-13 12:06:20.873: D/WatchTvFragment(11605): ++onAnimationEnd++
11-13 12:06:20.873: D/WatchTvFragment(11605): left:427, right:986, top:0, bottom:703
11-13 12:06:20.873: D/WatchTvFragment(11605): ++clear animation++
11-13 12:06:20.873: D/WatchTvFragment(11605): left:427, right:986, top:0, bottom:703
11-13 12:06:20.873: D/WatchTvFragment(11605): ++modify left & right++
11-13 12:06:20.873: D/WatchTvFragment(11605): left:1, right:560, top:0, bottom:703
11-13 12:06:20.873: D/WatchTvFragment(11605): layout(1,0,560,703)
11-13 12:06:20.873: D/WatchTvFragment(11605): left:1, right:560, top:0, bottom:703

(2)从左往右滑,滑到原处之后,又往右滑了一段出去,结果不在预期位置。

11-13 12:06:45.853: D/PullToRefreshView(11605): ++onFling++
11-13 12:06:45.853: D/PullToRefreshView(11605): velocityX:2519.4294, velocityY:-122.3643
11-13 12:06:45.853: D/WatchTvFragment(11605): ++slideLeft2RightProgramView++
11-13 12:06:45.853: D/WatchTvFragment(11605): ++slideView++
11-13 12:06:45.853: D/WatchTvFragment(11605): fromX:-426.0, toX:0.0
11-13 12:06:45.853: D/WatchTvFragment(11605): left:1, right:560, top:0, bottom:703
11-13 12:06:45.853: D/PullToRefreshView(11605): ++onTouchEvent++
11-13 12:06:45.873: D/WatchTvFragment(11605): ++onAnimationStart++
11-13 12:06:45.873: D/WatchTvFragment(11605): left:427, right:986, top:0, bottom:703
11-13 12:06:46.393: D/WatchTvFragment(11605): ++onAnimationEnd++
11-13 12:06:46.393: D/WatchTvFragment(11605): left:427, right:986, top:0, bottom:703
11-13 12:06:46.393: D/WatchTvFragment(11605): ++clear animation++
11-13 12:06:46.393: D/WatchTvFragment(11605): left:427, right:986, top:0, bottom:703
11-13 12:06:46.393: D/WatchTvFragment(11605): ++modify left & right++
11-13 12:06:46.393: D/WatchTvFragment(11605): left:853, right:1412, top:0, bottom:703
11-13 12:06:46.393: D/WatchTvFragment(11605): layout(853,0,1412,703)
11-13 12:06:46.393: D/WatchTvFragment(11605): left:853, right:1412, top:0, bottom:703

(3)从右往左滑,滑到原处之后,再往左滑了一段,结果在预期位置。

11-13 12:07:43.193: D/PullToRefreshView(11605): ++onFling++
11-13 12:07:43.193: D/PullToRefreshView(11605): velocityX:-6216.4023, velocityY:-10.168142
11-13 12:07:43.193: D/WatchTvFragment(11605): ++slideRight2LeftProgramView++
11-13 12:07:43.193: D/WatchTvFragment(11605): ++slideView++
11-13 12:07:43.193: D/WatchTvFragment(11605): fromX:0.0, toX:-426.0
11-13 12:07:43.193: D/WatchTvFragment(11605): left:427, right:986, top:0, bottom:703
11-13 12:07:43.193: D/PullToRefreshView(11605): ++onTouchEvent++
11-13 12:07:43.223: I/dalvikvm(11605): Jit: resizing JitTable from 4096 to 8192
11-13 12:07:43.253: D/WatchTvFragment(11605): ++onAnimationStart++
11-13 12:07:43.253: D/WatchTvFragment(11605): left:427, right:986, top:0, bottom:703
11-13 12:07:43.753: D/WatchTvFragment(11605): ++onAnimationEnd++
11-13 12:07:43.753: D/WatchTvFragment(11605): left:427, right:986, top:0, bottom:703
11-13 12:07:43.753: D/WatchTvFragment(11605): ++clear animation++
11-13 12:07:43.753: D/WatchTvFragment(11605): left:427, right:986, top:0, bottom:703
11-13 12:07:43.753: D/WatchTvFragment(11605): ++modify left & right++
11-13 12:07:43.753: D/WatchTvFragment(11605): left:1, right:560, top:0, bottom:703
11-13 12:07:43.753: D/WatchTvFragment(11605): layout(1,0,560,703)
11-13 12:07:43.753: D/WatchTvFragment(11605): left:1, right:560, top:0, bottom:703

试验7

以上调用的slidRight2LeftProgramView和slideLeft2RightProgramView两个方法的实现是

public void slideRight2LeftProgramView() {
    if(bAtLeft) return;
    bAtLeft = true;
    Logger.i(TAG, "++slideRight2LeftProgramView++");
    slideView(programView, 0, -channelView.getMeasuredWidth());
}
public void slideLeft2RightProgramView() {
    if(!bAtLeft) return;
    bAtLeft = false;
    Logger.i(TAG, "++slideLeft2RightProgramView++");
    slideView(programView, -channelView.getMeasuredWidth(), 0);
}

修改slideLeft2RightProgramView的实现(代码如下)

public void slideLeft2RightProgramView() {
    if(!bAtLeft) return;
    bAtLeft = false;
    Logger.i(TAG, "++slideLeft2RightProgramView++");
    slideView(programView, 0, channelView.getMeasuredWidth());
}

再执行程序,

(1)从左往右滑,打印日志

11-13 13:13:57.953: D/PullToRefreshView(14409): ++onFling++
11-13 13:13:57.953: D/PullToRefreshView(14409): velocityX:-299.23645, velocityY:120.557686
11-13 13:13:57.953: D/WatchTvFragment(14409): ++slideRight2LeftProgramView++
11-13 13:13:57.953: D/WatchTvFragment(14409): ++slideView++
11-13 13:13:57.953: D/WatchTvFragment(14409): fromX:0.0, toX:-426.0
11-13 13:13:57.953: D/WatchTvFragment(14409): left:427, right:986, top:0, bottom:703
11-13 13:13:57.953: D/PullToRefreshView(14409): ++onTouchEvent++
11-13 13:13:57.963: D/WatchTvFragment(14409): ++onAnimationStart++
11-13 13:13:57.963: D/WatchTvFragment(14409): left:427, right:986, top:0, bottom:703
11-13 13:13:58.473: D/WatchTvFragment(14409): ++onAnimationEnd++
11-13 13:13:58.473: D/WatchTvFragment(14409): left:427, right:986, top:0, bottom:703
11-13 13:13:58.473: D/WatchTvFragment(14409): ++clear animation++
11-13 13:13:58.473: D/WatchTvFragment(14409): left:427, right:986, top:0, bottom:703
11-13 13:13:58.473: D/WatchTvFragment(14409): ++modify left & right++
11-13 13:13:58.473: D/WatchTvFragment(14409): left:1, right:560, top:0, bottom:703
11-13 13:13:58.483: D/WatchTvFragment(14409): layout(1,0,560,703)
11-13 13:13:58.483: D/WatchTvFragment(14409): left:1, right:560, top:0, bottom:703

从左往右滑,打印日志

11-13 13:14:22.633: D/PullToRefreshView(14409): ++onFling++
11-13 13:14:22.633: D/PullToRefreshView(14409): velocityX:8061.372, velocityY:-391.0305
11-13 13:14:22.633: D/WatchTvFragment(14409): ++slideLeft2RightProgramView++
11-13 13:14:22.633: D/WatchTvFragment(14409): ++slideView++
11-13 13:14:22.633: D/WatchTvFragment(14409): fromX:0.0, toX:426.0
11-13 13:14:22.633: D/WatchTvFragment(14409): left:427, right:986, top:0, bottom:703
11-13 13:14:22.633: D/PullToRefreshView(14409): ++onTouchEvent++
11-13 13:14:22.643: D/WatchTvFragment(14409): ++onAnimationStart++
11-13 13:14:22.643: D/WatchTvFragment(14409): left:427, right:986, top:0, bottom:703
11-13 13:14:23.163: D/WatchTvFragment(14409): ++onAnimationEnd++
11-13 13:14:23.163: D/WatchTvFragment(14409): left:427, right:986, top:0, bottom:703
11-13 13:14:23.163: D/WatchTvFragment(14409): ++clear animation++
11-13 13:14:23.163: D/WatchTvFragment(14409): left:427, right:986, top:0, bottom:703
11-13 13:14:23.163: D/WatchTvFragment(14409): ++modify left & right++
11-13 13:14:23.163: D/WatchTvFragment(14409): left:853, right:1412, top:0, bottom:703
11-13 13:14:23.163: D/WatchTvFragment(14409): layout(853,0,1412,703)
11-13 13:14:23.163: D/WatchTvFragment(14409): left:853, right:1412, top:0, bottom:703

从上面的日志分析得出结果:从右往左滑动之后,left的值从427变为1;但是下次从左往右滑动时,left不是从1开始,而是从427开始。

试验8

在slieView方法调用startAnimation之前,调用animation的setFillAfter方法。

TranslateAnimation animation = new TranslateAnimation(fromX, toX, 0, 0);
animation.setInterpolator(new OvershootInterpolator());
animation.setDuration(500);
animation.setStartOffset(0);
animation.setAnimationListener(animationListener);
animation.setFillAfter(true);
view.startAnimation(animation);

然后再执行程序,打印日志

(1)从右往左滑

11-13 13:25:40.013: D/PullToRefreshView(15284): ++onFling++
11-13 13:25:40.013: D/PullToRefreshView(15284): velocityX:-876.824, velocityY:100.79468
11-13 13:25:40.013: D/WatchTvFragment(15284): ++slideRight2LeftProgramView++
11-13 13:25:40.013: D/WatchTvFragment(15284): ++slideView++
11-13 13:25:40.013: D/WatchTvFragment(15284): fromX:0.0, toX:-426.0
11-13 13:25:40.013: D/WatchTvFragment(15284): left:427, right:986, top:0, bottom:703
11-13 13:25:40.013: D/PullToRefreshView(15284): ++onTouchEvent++
11-13 13:25:40.023: D/WatchTvFragment(15284): ++onAnimationStart++
11-13 13:25:40.023: D/WatchTvFragment(15284): left:427, right:986, top:0, bottom:703
11-13 13:25:40.543: D/WatchTvFragment(15284): ++onAnimationEnd++
11-13 13:25:40.543: D/WatchTvFragment(15284): left:427, right:986, top:0, bottom:703
11-13 13:25:40.543: D/WatchTvFragment(15284): ++clear animation++
11-13 13:25:40.543: D/WatchTvFragment(15284): left:427, right:986, top:0, bottom:703
11-13 13:25:40.543: D/WatchTvFragment(15284): ++modify left & right++
11-13 13:25:40.543: D/WatchTvFragment(15284): left:1, right:560, top:0, bottom:703
11-13 13:25:40.543: D/WatchTvFragment(15284): layout(1,0,560,703)
11-13 13:25:40.543: D/WatchTvFragment(15284): left:1, right:560, top:0, bottom:703

(2)从左往右滑

11-13 13:26:00.083: D/PullToRefreshView(15284): ++onFling++
11-13 13:26:00.093: D/PullToRefreshView(15284): velocityX:1673.9954, velocityY:-381.92545
11-13 13:26:00.093: D/WatchTvFragment(15284): ++slideLeft2RightProgramView++
11-13 13:26:00.093: D/WatchTvFragment(15284): ++slideView++
11-13 13:26:00.093: D/WatchTvFragment(15284): fromX:0.0, toX:426.0
11-13 13:26:00.093: D/WatchTvFragment(15284): left:1, right:560, top:0, bottom:703
11-13 13:26:00.093: D/PullToRefreshView(15284): ++onTouchEvent++
11-13 13:26:00.103: D/WatchTvFragment(15284): ++onAnimationStart++
11-13 13:26:00.103: D/WatchTvFragment(15284): left:427, right:986, top:0, bottom:703
11-13 13:26:00.613: D/WatchTvFragment(15284): ++onAnimationEnd++
11-13 13:26:00.613: D/WatchTvFragment(15284): left:427, right:986, top:0, bottom:703
11-13 13:26:00.613: D/WatchTvFragment(15284): ++clear animation++
11-13 13:26:00.613: D/WatchTvFragment(15284): left:427, right:986, top:0, bottom:703
11-13 13:26:00.613: D/WatchTvFragment(15284): ++modify left & right++
11-13 13:26:00.613: D/WatchTvFragment(15284): left:853, right:1412, top:0, bottom:703
11-13 13:26:00.613: D/WatchTvFragment(15284): layout(853,0,1412,703)
11-13 13:26:00.613: D/WatchTvFragment(15284): left:853, right:1412, top:0, bottom:703

(3)从右往左滑

11-13 13:26:18.113: D/PullToRefreshView(15284): ++onFling++
11-13 13:26:18.113: D/PullToRefreshView(15284): velocityX:-1004.43695, velocityY:-184.0056
11-13 13:26:18.113: D/WatchTvFragment(15284): ++slideRight2LeftProgramView++
11-13 13:26:18.113: D/WatchTvFragment(15284): ++slideView++
11-13 13:26:18.113: D/WatchTvFragment(15284): fromX:0.0, toX:-426.0
11-13 13:26:18.113: D/WatchTvFragment(15284): left:853, right:1412, top:0, bottom:703
11-13 13:26:18.113: D/PullToRefreshView(15284): ++onTouchEvent++
11-13 13:26:18.133: D/WatchTvFragment(15284): ++onAnimationStart++
11-13 13:26:18.133: D/WatchTvFragment(15284): left:427, right:986, top:0, bottom:703
11-13 13:26:18.643: D/WatchTvFragment(15284): ++onAnimationEnd++
11-13 13:26:18.643: D/WatchTvFragment(15284): left:427, right:986, top:0, bottom:703
11-13 13:26:18.643: D/WatchTvFragment(15284): ++clear animation++
11-13 13:26:18.643: D/WatchTvFragment(15284): left:427, right:986, top:0, bottom:703
11-13 13:26:18.643: D/WatchTvFragment(15284): ++modify left & right++
11-13 13:26:18.643: D/WatchTvFragment(15284): left:1, right:560, top:0, bottom:703
11-13 13:26:18.643: D/WatchTvFragment(15284): layout(1,0,560,703)
11-13 13:26:18.643: D/WatchTvFragment(15284): left:1, right:560, top:0, bottom:703

(4)从左往右滑

11-13 13:26:32.733: D/PullToRefreshView(15284): ++onFling++
11-13 13:26:32.733: D/PullToRefreshView(15284): velocityX:2957.727, velocityY:-363.21652
11-13 13:26:32.733: D/WatchTvFragment(15284): ++slideLeft2RightProgramView++
11-13 13:26:32.733: D/WatchTvFragment(15284): ++slideView++
11-13 13:26:32.733: D/WatchTvFragment(15284): fromX:0.0, toX:426.0
11-13 13:26:32.733: D/WatchTvFragment(15284): left:1, right:560, top:0, bottom:703
11-13 13:26:32.733: D/PullToRefreshView(15284): ++onTouchEvent++
11-13 13:26:32.733: D/WatchTvFragment(15284): ++onAnimationStart++
11-13 13:26:32.733: D/WatchTvFragment(15284): left:427, right:986, top:0, bottom:703
11-13 13:26:33.243: D/WatchTvFragment(15284): ++onAnimationEnd++
11-13 13:26:33.243: D/WatchTvFragment(15284): left:427, right:986, top:0, bottom:703
11-13 13:26:33.253: D/WatchTvFragment(15284): ++clear animation++
11-13 13:26:33.253: D/WatchTvFragment(15284): left:427, right:986, top:0, bottom:703
11-13 13:26:33.253: D/WatchTvFragment(15284): ++modify left & right++
11-13 13:26:33.263: D/WatchTvFragment(15284): left:853, right:1412, top:0, bottom:703
11-13 13:26:33.263: D/WatchTvFragment(15284): layout(853,0,1412,703)
11-13 13:26:33.263: D/WatchTvFragment(15284): left:853, right:1412, top:0, bottom:703

从日志中分析得出结果:不管从左往右滑还是从右往左滑之后,下次再调用slideView时view的left值保持上次动画结束的位置。但是在onAnimationStart中,view的left值就发生了改变,又还原为view刚加载完时的初始left数值(此时为427)。