Android FlipView使ViewPager无需动画即可滑动第一个项目

时间:2016-02-26 04:01:38

标签: android android-viewpager android-animation android-scrollview flipview

我有一个关于这个主题的问题,现在我的情况是我在scrollview里面有一个viewpager,这些内部的emilsjolander FlipView,结构看起来像:

@Component({
    selector: 'navbar',
    template: require('./navbar.html'),
    styles: [style],
    directives: [RouterLink, NgClass, NgIf],
    providers: [UserService],
    changeDetection: ChangeDetectionStrategy.OnPush
})

export class Navbar implements OnInit {
    isLoggedIn: boolean = false;
    constructor(private location: Location, public userService: UserService) {}

    isLocationEqual(loc:string):boolean {
        return this.location.path() === loc;
    }

    ngOnInit(): void {
        this.userService.isLoggedIn.subscribe((isLoggedIn: boolean) => {
            console.log('RECEIVED!!', isLoggedIn);
            this.isLoggedIn = isLoggedIn;
        });
    }
}

因为viewpager的某些问题无法检测到触摸,所以我只是实现了自定义Viewpager。

在我实现自定义Viewpager之后,触摸问题已修复,但是viewpager有关于动画的问题。

当我滑动viewpager时,有时候它工作得很完美,但有时候viewpager只是更改了没有动画的项目,而且似乎第二项更改为Sec Item必须导致这种情况。所以我只是将一些日志放入ScrollerCustomDuration类的startScroll方法中,我发现当viewpager没有动画时更改时,ScrollerCustomDuration的startScroll方法不会被调用。

很抱歉我的英语很差,感谢您的帮助,如果您需要我提供更多详细信息,请告诉我。

CustomViewPager类:

 <FlipView>
        <ScrollView>
        <ViewPager>
        </ViewPager>
        </ScrollView>
 </FlipView>

ScrollerCustomDuration类:

public class CustomViewPager extends ViewPager {

private ScrollerCustomDuration mScroller = null;
public CustomViewPager(Context context) {
    super(context);
    postInitViewPager();
}

public CustomViewPager(Context context, AttributeSet attrs) {
    super(context, attrs);
    postInitViewPager();
}


@Override
public boolean onInterceptTouchEvent(MotionEvent event) {

    Log.e("onInterceptTouchEvent",event.toString());

    switch (event.getAction()) {
        case MotionEvent.ACTION_MOVE:

            this.getParent().requestDisallowInterceptTouchEvent(true);
            break;
        case MotionEvent.ACTION_UP:
        case MotionEvent.ACTION_CANCEL:
            this.getParent().requestDisallowInterceptTouchEvent(false);
            break;
    }


    return super.onInterceptTouchEvent(event);


}

private void postInitViewPager() {
    try {
        Class<?> viewpager = ViewPager.class;
        Field scroller = viewpager.getDeclaredField("mScroller");
        scroller.setAccessible(true);
        Field interpolator = viewpager.getDeclaredField("sInterpolator");
        interpolator.setAccessible(true);

        mScroller = new ScrollerCustomDuration(getContext(),
                (Interpolator) interpolator.get(null));
        scroller.set(this, mScroller);
    } catch (Exception e) {
        Log.e("MyPager", e.getMessage());
    }
}


public void setScrollDurationFactor(double scrollFactor) {
    mScroller.setScrollDurationFactor(scrollFactor);
}}

1 个答案:

答案 0 :(得分:0)

我刚刚解决了这个问题。 似乎问题不在于触控。 我只是在flipview翻转时刷新flipview

以下代码解决了我的问题

fv.setOnFlipListener(new FlipView.OnFlipListener() {
        @Override
        public void onFlippedToPage(FlipView v, int position, long id) {

            ((BaseAdapter)fv.getAdapter()).notifyDataSetChanged();
        }
    });