Add onPageScrollStateChanged for ViewPagerAndroid

Summary:
I have an issue when combining `PullToRefreshViewAndroid` and `ViewPagerAndroid`.
`ViewPagerAndroid` will not able to scroll that gesture handler is being taken by `PullToRefreshViewAndroid`
One solution is to disable `PullToRefreshViewAndroid` if `ViewPagerAndroid` is scrolling (i.e. not idle).
[Reference solution here](http://stackoverflow.com/a/29946734/2590265)

So here need to expose the `onPageScrollStateChanged` event.
Some code referenced from  DrawerLayoutAndroid, especially the `VIEWPAGER_PAGE_SCROLL_STATES` array.
Please feel free give me comments.
Thanks.
Closes https://github.com/facebook/react-native/pull/5026

Reviewed By: svcscm

Differential Revision: D2830623

Pulled By: andreicoman11

fb-gh-sync-id: c2a6920c6f4c7daab0115f13864db83b93b31abf
This commit is contained in:
Kudo Chien
2016-01-29 01:16:40 -08:00
committed by facebook-github-bot-9
parent 5e82094fcb
commit 8de86a0d65
5 changed files with 102 additions and 1 deletions

View File

@@ -0,0 +1,49 @@
/**
* Copyright (c) 2015-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
package com.facebook.react.views.viewpager;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.uimanager.events.Event;
import com.facebook.react.uimanager.events.RCTEventEmitter;
/**
* Event emitted by {@link ReactViewPager} when user scrolling state changed.
*
* Additional data provided by this event:
* - pageScrollState - {Idle,Dragging,Settling}
*/
class PageScrollStateChangedEvent extends Event<PageScrollStateChangedEvent> {
public static final String EVENT_NAME = "topPageScrollStateChanged";
private final String mPageScrollState;
protected PageScrollStateChangedEvent(int viewTag, long timestampMs, String pageScrollState) {
super(viewTag, timestampMs);
mPageScrollState = pageScrollState;
}
@Override
public String getEventName() {
return EVENT_NAME;
}
@Override
public void dispatch(RCTEventEmitter rctEventEmitter) {
rctEventEmitter.receiveEvent(getViewTag(), getEventName(), serializeEventData());
}
private WritableMap serializeEventData() {
WritableMap eventData = Arguments.createMap();
eventData.putString("pageScrollState", mPageScrollState);
return eventData;
}
}

View File

@@ -104,7 +104,22 @@ import com.facebook.react.uimanager.events.NativeGestureUtil;
@Override
public void onPageScrollStateChanged(int state) {
// don't send events
String pageScrollState;
switch (state) {
case SCROLL_STATE_IDLE:
pageScrollState = "idle";
break;
case SCROLL_STATE_DRAGGING:
pageScrollState = "dragging";
break;
case SCROLL_STATE_SETTLING:
pageScrollState = "settling";
break;
default:
throw new IllegalStateException("Unsupported pageScrollState");
}
mEventDispatcher.dispatchEvent(
new PageScrollStateChangedEvent(getId(), SystemClock.uptimeMillis(), pageScrollState));
}
}

View File

@@ -50,6 +50,7 @@ public class ReactViewPagerManager extends ViewGroupManager<ReactViewPager> {
public Map getExportedCustomDirectEventTypeConstants() {
return MapBuilder.of(
PageScrollEvent.EVENT_NAME, MapBuilder.of("registrationName", "onPageScroll"),
PageScrollStateChangedEvent.EVENT_NAME, MapBuilder.of("registrationName", "onPageScrollStateChanged"),
PageSelectedEvent.EVENT_NAME, MapBuilder.of("registrationName", "onPageSelected")
);
}