mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8a9b534a69 | ||
|
|
b9a4b117ce | ||
|
|
cad4686b2a | ||
|
|
49de9bd4d4 | ||
|
|
147e9c3816 | ||
|
|
7a51edea32 | ||
|
|
0dffbf10f4 | ||
|
|
b15a83a0ca | ||
|
|
3c2f0ed4e3 | ||
|
|
e5a69770a8 |
@@ -0,0 +1,127 @@
|
||||
/**
|
||||
* The examples provided by Facebook are for non-commercial testing and
|
||||
* evaluation purposes only.
|
||||
*
|
||||
* Facebook reserves all rights not expressly granted.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NON INFRINGEMENT. IN NO EVENT SHALL
|
||||
* FACEBOOK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
*/
|
||||
'use strict';
|
||||
|
||||
const React = require('react-native');
|
||||
const {
|
||||
ScrollView,
|
||||
StyleSheet,
|
||||
PullToRefreshViewAndroid,
|
||||
Text,
|
||||
TouchableWithoutFeedback,
|
||||
View,
|
||||
} = React;
|
||||
|
||||
const styles = StyleSheet.create({
|
||||
row: {
|
||||
borderColor: 'grey',
|
||||
borderWidth: 1,
|
||||
padding: 20,
|
||||
backgroundColor: '#3a5795',
|
||||
margin: 5,
|
||||
},
|
||||
text: {
|
||||
alignSelf: 'center',
|
||||
color: '#fff',
|
||||
|
||||
},
|
||||
layout: {
|
||||
flex: 1,
|
||||
},
|
||||
scrollview: {
|
||||
flex: 1,
|
||||
},
|
||||
});
|
||||
|
||||
const Row = React.createClass({
|
||||
_onClick: function() {
|
||||
this.props.onClick(this.props.data);
|
||||
},
|
||||
render: function() {
|
||||
return (
|
||||
<TouchableWithoutFeedback onPress={this._onClick} >
|
||||
<View style={styles.row}>
|
||||
<Text style={styles.text}>
|
||||
{this.props.data.text + ' (' + this.props.data.clicks + ' clicks)'}
|
||||
</Text>
|
||||
</View>
|
||||
</TouchableWithoutFeedback>
|
||||
);
|
||||
},
|
||||
});
|
||||
const PullToRefreshViewAndroidExample = React.createClass({
|
||||
statics: {
|
||||
title: '<PullToRefreshViewAndroid>',
|
||||
description: 'Container that adds pull-to-refresh support to its child view.'
|
||||
},
|
||||
|
||||
getInitialState() {
|
||||
return {
|
||||
isRefreshing: false,
|
||||
loaded: 0,
|
||||
rowData: Array.from(new Array(20)).map(
|
||||
(val, i) => {return {text: 'Initial row' + i, clicks: 0}}),
|
||||
};
|
||||
},
|
||||
|
||||
_onClick(row) {
|
||||
row.clicks++;
|
||||
this.setState({
|
||||
rowData: this.state.rowData,
|
||||
});
|
||||
},
|
||||
|
||||
render() {
|
||||
const rows = this.state.rowData.map((row) => {
|
||||
return <Row data={row} onClick={this._onClick}/>;
|
||||
});
|
||||
return (
|
||||
<PullToRefreshViewAndroid
|
||||
style={styles.layout}
|
||||
refreshing={this.state.isRefreshing}
|
||||
onRefresh={this._onRefresh}
|
||||
colors={['#ff0000', '#00ff00', '#0000ff']}
|
||||
progressBackgroundColor={'#ffff00'}
|
||||
>
|
||||
<ScrollView style={styles.scrollview}>
|
||||
{rows}
|
||||
</ScrollView>
|
||||
</PullToRefreshViewAndroid>
|
||||
);
|
||||
},
|
||||
|
||||
_onRefresh() {
|
||||
this.setState({isRefreshing: true});
|
||||
setTimeout(() => {
|
||||
// prepend 10 items
|
||||
const rowData = Array.from(new Array(10))
|
||||
.map((val, i) => {return {
|
||||
text: 'Loaded row' + (+this.state.loaded + i),
|
||||
clicks: 0,
|
||||
}})
|
||||
.concat(this.state.rowData);
|
||||
|
||||
this.setState({
|
||||
loaded: this.state.loaded + 10,
|
||||
isRefreshing: false,
|
||||
rowData: rowData,
|
||||
});
|
||||
}, 5000);
|
||||
},
|
||||
|
||||
});
|
||||
|
||||
|
||||
module.exports = PullToRefreshViewAndroidExample;
|
||||
@@ -27,6 +27,7 @@ var COMPONENTS = [
|
||||
require('./ProgressBarAndroidExample'),
|
||||
require('./ScrollViewSimpleExample'),
|
||||
require('./SwitchAndroidExample'),
|
||||
require('./PullToRefreshViewAndroidExample.android'),
|
||||
require('./TextExample.android'),
|
||||
require('./TextInputExample.android'),
|
||||
require('./ToolbarAndroidExample'),
|
||||
|
||||
@@ -47,6 +47,14 @@ var ViewStylePropTypes = {
|
||||
),
|
||||
shadowOpacity: ReactPropTypes.number,
|
||||
shadowRadius: ReactPropTypes.number,
|
||||
/**
|
||||
* (Android-only) Sets the elevation of a view, using Android's underlying
|
||||
* [elevation API](https://developer.android.com/training/material/shadows-clipping.html#Elevation).
|
||||
* This adds a drop shadow to the item and affects z-order for overlapping views.
|
||||
* Only supported on Android 5.0+, has no effect on earlier versions.
|
||||
* @platform android
|
||||
*/
|
||||
elevation: ReactPropTypes.number,
|
||||
};
|
||||
|
||||
module.exports = ViewStylePropTypes;
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
* @providesModule PullToRefreshViewAndroid
|
||||
*/
|
||||
'use strict';
|
||||
|
||||
var React = require('React');
|
||||
var RefreshLayoutConsts = require('NativeModules').UIManager.AndroidSwipeRefreshLayout.Constants;
|
||||
var View = require('View');
|
||||
|
||||
var onlyChild = require('onlyChild');
|
||||
var processColor = require('processColor');
|
||||
var requireNativeComponent = require('requireNativeComponent');
|
||||
|
||||
var NATIVE_REF = 'native_swiperefreshlayout';
|
||||
|
||||
/**
|
||||
* React view that supports a single scrollable child view (e.g. `ScrollView`). When this child
|
||||
* view is at `scrollY: 0`, swiping down triggers an `onRefresh` event.
|
||||
*/
|
||||
var PullToRefreshViewAndroid = React.createClass({
|
||||
statics: {
|
||||
SIZE: RefreshLayoutConsts.SIZE,
|
||||
},
|
||||
|
||||
propTypes: {
|
||||
...View.propTypes,
|
||||
/**
|
||||
* Whether the pull to refresh functionality is enabled
|
||||
*/
|
||||
enabled: React.PropTypes.bool,
|
||||
/**
|
||||
* The colors (at least one) that will be used to draw the refresh indicator
|
||||
*/
|
||||
colors: React.PropTypes.arrayOf(React.PropTypes.string),
|
||||
/**
|
||||
* The background color of the refresh indicator
|
||||
*/
|
||||
progressBackgroundColor: React.PropTypes.string,
|
||||
/**
|
||||
* Whether the view should be indicating an active refresh
|
||||
*/
|
||||
refreshing: React.PropTypes.bool,
|
||||
/**
|
||||
* Size of the refresh indicator, see PullToRefreshViewAndroid.SIZE
|
||||
*/
|
||||
size: React.PropTypes.oneOf(RefreshLayoutConsts.SIZE.DEFAULT, RefreshLayoutConsts.SIZE.LARGE),
|
||||
},
|
||||
|
||||
getInnerViewNode: function() {
|
||||
return this.refs[NATIVE_REF];
|
||||
},
|
||||
|
||||
render: function() {
|
||||
return (
|
||||
<NativePullToRefresh
|
||||
colors={this.props.colors && this.props.colors.map(processColor)}
|
||||
enabled={this.props.enabled}
|
||||
onRefresh={this._onRefresh}
|
||||
progressBackgroundColor={this.props.progressBackgroundColor}
|
||||
ref={NATIVE_REF}
|
||||
refreshing={this.props.refreshing}
|
||||
size={this.props.size}
|
||||
style={this.props.style}>
|
||||
{onlyChild(this.props.children)}
|
||||
</NativePullToRefresh>
|
||||
);
|
||||
},
|
||||
|
||||
_onRefresh: function() {
|
||||
this.props.onRefresh && this.props.onRefresh();
|
||||
this.refs[NATIVE_REF].setNativeProps({refreshing: !!this.props.refreshing});
|
||||
}
|
||||
});
|
||||
|
||||
var NativePullToRefresh = requireNativeComponent(
|
||||
'AndroidSwipeRefreshLayout',
|
||||
PullToRefreshViewAndroid
|
||||
);
|
||||
|
||||
module.exports = PullToRefreshViewAndroid;
|
||||
@@ -0,0 +1,13 @@
|
||||
/**
|
||||
* 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.
|
||||
*
|
||||
* @providesModule PullToRefreshViewAndroid
|
||||
*/
|
||||
'use strict';
|
||||
|
||||
module.exports = require('UnimplementedView');
|
||||
+1
@@ -37,6 +37,7 @@ var ReactNative = Object.assign(Object.create(require('React')), {
|
||||
SliderIOS: require('SliderIOS'),
|
||||
SnapshotViewIOS: require('SnapshotViewIOS'),
|
||||
Switch: require('Switch'),
|
||||
PullToRefreshViewAndroid: require('PullToRefreshViewAndroid'),
|
||||
SwitchAndroid: require('SwitchAndroid'),
|
||||
SwitchIOS: require('SwitchIOS'),
|
||||
TabBarIOS: require('TabBarIOS'),
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = "React"
|
||||
s.version = "0.15.0"
|
||||
s.version = "0.16.0-rc"
|
||||
s.summary = "Build high quality mobile apps using React."
|
||||
s.description = <<-DESC
|
||||
React Native apps are built using the React JS
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
VERSION_NAME=0.12.0-SNAPSHOT
|
||||
VERSION_NAME=0.16.1
|
||||
GROUP=com.facebook.react
|
||||
|
||||
POM_NAME=ReactNative
|
||||
|
||||
@@ -39,6 +39,7 @@ import com.facebook.react.views.textinput.ReactTextInputManager;
|
||||
import com.facebook.react.views.toolbar.ReactToolbarManager;
|
||||
import com.facebook.react.views.view.ReactViewManager;
|
||||
import com.facebook.react.views.viewpager.ReactViewPagerManager;
|
||||
import com.facebook.react.views.swiperefresh.SwipeRefreshLayoutManager;
|
||||
|
||||
/**
|
||||
* Package defining basic modules and view managers.
|
||||
@@ -78,6 +79,7 @@ public class MainReactPackage implements ReactPackage {
|
||||
new ReactViewManager(),
|
||||
new ReactViewPagerManager(),
|
||||
new ReactTextInlineImageViewManager(),
|
||||
new ReactVirtualTextViewManager());
|
||||
new ReactVirtualTextViewManager(),
|
||||
new SwipeRefreshLayoutManager());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,8 @@ package com.facebook.react.uimanager;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import android.graphics.Matrix;
|
||||
import android.graphics.PointF;
|
||||
import android.view.MotionEvent;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
@@ -25,6 +27,9 @@ import com.facebook.react.bridge.UiThreadUtil;
|
||||
public class TouchTargetHelper {
|
||||
|
||||
private static final float[] mEventCoords = new float[2];
|
||||
private static final PointF mTempPoint = new PointF();
|
||||
private static final float[] mMatrixTransformCoords = new float[2];
|
||||
private static final Matrix mInverseMatrix = new Matrix();
|
||||
|
||||
/**
|
||||
* Find touch event target view within the provided container given the coordinates provided
|
||||
@@ -94,31 +99,60 @@ public class TouchTargetHelper {
|
||||
int childrenCount = viewGroup.getChildCount();
|
||||
for (int i = childrenCount - 1; i >= 0; i--) {
|
||||
View child = viewGroup.getChildAt(i);
|
||||
if (isTouchPointInView(eventCoords[0], eventCoords[1], viewGroup, child)) {
|
||||
// Apply offset to event coordinates to transform them into the coordinate space of the
|
||||
// child view, taken from {@link ViewGroup#dispatchTransformedTouchEvent()}.
|
||||
eventCoords[0] += viewGroup.getScrollY() - child.getTop();
|
||||
eventCoords[1] += viewGroup.getScrollX() - child.getLeft();
|
||||
PointF childPoint = mTempPoint;
|
||||
if (isTransformedTouchPointInView(eventCoords[0], eventCoords[1], viewGroup, child, childPoint)) {
|
||||
// If it is contained within the child View, the childPoint value will contain the view
|
||||
// coordinates relative to the child
|
||||
// We need to store the existing X,Y for the viewGroup away as it is possible this child
|
||||
// will not actually be the target and so we restore them if not
|
||||
float restoreY = eventCoords[0];
|
||||
float restoreX = eventCoords[1];
|
||||
eventCoords[0] = childPoint.y;
|
||||
eventCoords[1] = childPoint.x;
|
||||
View targetView = findTouchTargetViewWithPointerEvents(eventCoords, child);
|
||||
if (targetView != null) {
|
||||
return targetView;
|
||||
}
|
||||
eventCoords[0] -= viewGroup.getScrollY() - child.getTop();
|
||||
eventCoords[1] -= viewGroup.getScrollX() - child.getLeft();
|
||||
eventCoords[0] = restoreY;
|
||||
eventCoords[1] = restoreX;
|
||||
}
|
||||
}
|
||||
return viewGroup;
|
||||
}
|
||||
|
||||
// Taken from {@link ViewGroup#isTransformedTouchPointInView()}
|
||||
private static boolean isTouchPointInView(float y, float x, ViewGroup parent, View child) {
|
||||
float localY = y + parent.getScrollY() - child.getTop();
|
||||
/**
|
||||
* Returns whether the touch point is within the child View
|
||||
* It is transform aware and will invert the transform Matrix to find the true local points
|
||||
* This code is taken from {@link ViewGroup#isTransformedTouchPointInView()}
|
||||
*/
|
||||
private static boolean isTransformedTouchPointInView(
|
||||
float y,
|
||||
float x,
|
||||
ViewGroup parent,
|
||||
View child,
|
||||
PointF outLocalPoint) {
|
||||
float localX = x + parent.getScrollX() - child.getLeft();
|
||||
// Taken from {@link View#pointInView()}.
|
||||
return localY >= 0 && localY < (child.getBottom() - child.getTop())
|
||||
&& localX >= 0 && localX < (child.getRight() - child.getLeft());
|
||||
float localY = y + parent.getScrollY() - child.getTop();
|
||||
Matrix matrix = child.getMatrix();
|
||||
if (!matrix.isIdentity()) {
|
||||
float[] localXY = mMatrixTransformCoords;
|
||||
localXY[0] = localX;
|
||||
localXY[1] = localY;
|
||||
Matrix inverseMatrix = mInverseMatrix;
|
||||
matrix.invert(inverseMatrix);
|
||||
inverseMatrix.mapPoints(localXY);
|
||||
localX = localXY[0];
|
||||
localY = localXY[1];
|
||||
}
|
||||
if ((localX >= 0 && localX < (child.getRight() - child.getLeft()))
|
||||
&& (localY >= 0 && localY < (child.getBottom() - child.getTop()))) {
|
||||
outLocalPoint.set(localX, localY);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Returns the touch target View of the event given, or null if neither the given View nor any of
|
||||
* its descendants are the touch target.
|
||||
|
||||
+35
@@ -0,0 +1,35 @@
|
||||
/**
|
||||
* 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.swiperefresh;
|
||||
|
||||
import android.support.v4.widget.SwipeRefreshLayout;
|
||||
import android.view.MotionEvent;
|
||||
|
||||
import com.facebook.react.bridge.ReactContext;
|
||||
import com.facebook.react.uimanager.events.NativeGestureUtil;
|
||||
|
||||
/**
|
||||
* Basic extension of {@link SwipeRefreshLayout} with ReactNative-specific functionality.
|
||||
*/
|
||||
public class ReactSwipeRefreshLayout extends SwipeRefreshLayout {
|
||||
|
||||
public ReactSwipeRefreshLayout(ReactContext reactContext) {
|
||||
super(reactContext);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onInterceptTouchEvent(MotionEvent ev) {
|
||||
if (super.onInterceptTouchEvent(ev)) {
|
||||
NativeGestureUtil.notifyNativeGestureStarted(this, ev);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
/**
|
||||
* 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.swiperefresh;
|
||||
|
||||
import com.facebook.react.uimanager.events.Event;
|
||||
import com.facebook.react.uimanager.events.RCTEventEmitter;
|
||||
|
||||
public class RefreshEvent extends Event<RefreshEvent> {
|
||||
|
||||
protected RefreshEvent(int viewTag, long timestampMs) {
|
||||
super(viewTag, timestampMs);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getEventName() {
|
||||
return "topRefresh";
|
||||
}
|
||||
|
||||
@Override
|
||||
public void dispatch(RCTEventEmitter rctEventEmitter) {
|
||||
rctEventEmitter.receiveEvent(getViewTag(), getEventName(), null);
|
||||
}
|
||||
}
|
||||
+106
@@ -0,0 +1,106 @@
|
||||
/**
|
||||
* 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.swiperefresh;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import android.graphics.Color;
|
||||
import android.os.SystemClock;
|
||||
import android.support.v4.widget.SwipeRefreshLayout;
|
||||
import android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener;
|
||||
|
||||
import com.facebook.react.bridge.ReadableArray;
|
||||
import com.facebook.react.common.MapBuilder;
|
||||
import com.facebook.react.uimanager.ReactProp;
|
||||
import com.facebook.react.uimanager.ThemedReactContext;
|
||||
import com.facebook.react.uimanager.UIManagerModule;
|
||||
import com.facebook.react.uimanager.ViewGroupManager;
|
||||
import com.facebook.react.uimanager.ViewProps;
|
||||
|
||||
/**
|
||||
* ViewManager for {@link ReactSwipeRefreshLayout} which allows the user to "pull to refresh" a
|
||||
* child view. Emits an {@code onRefresh} event when this happens.
|
||||
*/
|
||||
public class SwipeRefreshLayoutManager extends ViewGroupManager<ReactSwipeRefreshLayout> {
|
||||
|
||||
@Override
|
||||
protected ReactSwipeRefreshLayout createViewInstance(ThemedReactContext reactContext) {
|
||||
return new ReactSwipeRefreshLayout(reactContext);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "AndroidSwipeRefreshLayout";
|
||||
}
|
||||
|
||||
@ReactProp(name = ViewProps.ENABLED, defaultBoolean = true)
|
||||
public void setEnabled(ReactSwipeRefreshLayout view, boolean enabled) {
|
||||
view.setEnabled(enabled);
|
||||
}
|
||||
|
||||
@ReactProp(name = "colors")
|
||||
public void setColors(ReactSwipeRefreshLayout view, @Nullable ReadableArray colors) {
|
||||
if (colors != null) {
|
||||
int[] colorValues = new int[colors.size()];
|
||||
for (int i = 0; i < colors.size(); i++) {
|
||||
colorValues[i] = colors.getInt(i);
|
||||
}
|
||||
view.setColorSchemeColors(colorValues);
|
||||
} else {
|
||||
view.setColorSchemeColors();
|
||||
}
|
||||
}
|
||||
|
||||
@ReactProp(name = "progressBackgroundColor", defaultInt = Color.TRANSPARENT, customType = "Color")
|
||||
public void setProgressBackgroundColor(ReactSwipeRefreshLayout view, int color) {
|
||||
view.setProgressBackgroundColorSchemeColor(color);
|
||||
}
|
||||
|
||||
@ReactProp(name = "size", defaultInt = SwipeRefreshLayout.DEFAULT)
|
||||
public void setSize(ReactSwipeRefreshLayout view, int size) {
|
||||
view.setSize(size);
|
||||
}
|
||||
|
||||
@ReactProp(name = "refreshing")
|
||||
public void setRefreshing(ReactSwipeRefreshLayout view, boolean refreshing) {
|
||||
view.setRefreshing(refreshing);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addEventEmitters(
|
||||
final ThemedReactContext reactContext,
|
||||
final ReactSwipeRefreshLayout view) {
|
||||
view.setOnRefreshListener(
|
||||
new OnRefreshListener() {
|
||||
@Override
|
||||
public void onRefresh() {
|
||||
reactContext.getNativeModule(UIManagerModule.class).getEventDispatcher()
|
||||
.dispatchEvent(new RefreshEvent(view.getId(), SystemClock.uptimeMillis()));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public Map<String, Object> getExportedViewConstants() {
|
||||
return MapBuilder.<String, Object>of(
|
||||
"SIZE",
|
||||
MapBuilder.of("DEFAULT", SwipeRefreshLayout.DEFAULT, "LARGE", SwipeRefreshLayout.LARGE));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, Object> getExportedCustomDirectEventTypeConstants() {
|
||||
return MapBuilder.<String, Object>builder()
|
||||
.put("topRefresh", MapBuilder.of("registrationName", "onRefresh"))
|
||||
.build();
|
||||
}
|
||||
}
|
||||
+19
@@ -17,12 +17,14 @@ import android.graphics.Canvas;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.ColorFilter;
|
||||
import android.graphics.DashPathEffect;
|
||||
import android.graphics.Outline;
|
||||
import android.graphics.Paint;
|
||||
import android.graphics.Path;
|
||||
import android.graphics.PathEffect;
|
||||
import android.graphics.Rect;
|
||||
import android.graphics.RectF;
|
||||
import android.graphics.drawable.Drawable;
|
||||
import android.os.Build;
|
||||
|
||||
import com.facebook.react.common.annotations.VisibleForTesting;
|
||||
import com.facebook.csslayout.CSSConstants;
|
||||
@@ -123,6 +125,23 @@ import com.facebook.csslayout.Spacing;
|
||||
return ColorUtil.getOpacityFromColor(ColorUtil.multiplyColorAlpha(mColor, mAlpha));
|
||||
}
|
||||
|
||||
/* Android's elevation implementation requires this to be implemented to know where to draw the shadow. */
|
||||
@Override
|
||||
public void getOutline(Outline outline) {
|
||||
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
|
||||
super.getOutline(outline);
|
||||
return;
|
||||
}
|
||||
if(!CSSConstants.isUndefined(mBorderRadius) && mBorderRadius > 0) {
|
||||
float extraRadiusFromBorderWidth = (mBorderWidth != null)
|
||||
? mBorderWidth.get(Spacing.ALL) / 2f
|
||||
: 0;
|
||||
outline.setRoundRect(getBounds(), mBorderRadius + extraRadiusFromBorderWidth);
|
||||
} else {
|
||||
super.getOutline(outline);
|
||||
}
|
||||
}
|
||||
|
||||
public void setBorderWidth(int position, float width) {
|
||||
if (mBorderWidth == null) {
|
||||
mBorderWidth = new Spacing();
|
||||
|
||||
@@ -64,6 +64,14 @@ public class ReactViewManager extends ViewGroupManager<ReactViewGroup> {
|
||||
view.setBorderStyle(borderStyle);
|
||||
}
|
||||
|
||||
@ReactProp(name = "elevation")
|
||||
public void setElevation(ReactViewGroup view, float elevation) {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
|
||||
view.setElevation(PixelUtil.toPixelFromDIP(elevation));
|
||||
}
|
||||
// Do nothing on API < 21
|
||||
}
|
||||
|
||||
@ReactProp(name = "pointerEvents")
|
||||
public void setPointerEvents(ReactViewGroup view, @Nullable String pointerEventsStr) {
|
||||
if (pointerEventsStr != null) {
|
||||
|
||||
@@ -74,5 +74,5 @@ android {
|
||||
dependencies {
|
||||
compile fileTree(dir: "libs", include: ["*.jar"])
|
||||
compile "com.android.support:appcompat-v7:23.0.1"
|
||||
compile "com.facebook.react:react-native:0.13.0"
|
||||
compile "com.facebook.react:react-native:0.16.+"
|
||||
}
|
||||
|
||||
@@ -16,5 +16,8 @@ allprojects {
|
||||
repositories {
|
||||
mavenLocal()
|
||||
jcenter()
|
||||
jcenter {
|
||||
url "http://dl.bintray.com/mkonicek/maven"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+2
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "react-native",
|
||||
"version": "0.12.0",
|
||||
"version": "0.16.0",
|
||||
"description": "A framework for building native apps using React",
|
||||
"license": "BSD-3-Clause",
|
||||
"repository": {
|
||||
@@ -69,6 +69,7 @@
|
||||
"babel-plugin-transform-es2015-computed-properties": "^6.0.14",
|
||||
"babel-plugin-transform-es2015-constants": "^6.0.15",
|
||||
"babel-plugin-transform-es2015-destructuring": "^6.0.18",
|
||||
"babel-plugin-transform-es2015-for-of": "^6.0.14",
|
||||
"babel-plugin-transform-es2015-modules-commonjs": "^6.1.3",
|
||||
"babel-plugin-transform-es2015-parameters": "^6.0.18",
|
||||
"babel-plugin-transform-es2015-shorthand-properties": "^6.0.14",
|
||||
|
||||
@@ -23,7 +23,8 @@
|
||||
"transform-object-rest-spread",
|
||||
"transform-react-display-name",
|
||||
"transform-react-jsx",
|
||||
"transform-regenerator"
|
||||
"transform-regenerator",
|
||||
"transform-es2015-for-of"
|
||||
],
|
||||
"sourceMaps": false
|
||||
}
|
||||
|
||||
@@ -11,8 +11,10 @@
|
||||
/* eslint-disable strict */
|
||||
|
||||
// Created by running:
|
||||
// require('babel-core').buildExternalHelpers('_extends classCallCheck createClass createRawReactElement defineProperty get inherits objectWithoutProperties possibleConstructorReturn slicedToArray toConsumableArray'.split(' '))
|
||||
// require('babel-core').buildExternalHelpers('_extends classCallCheck createClass createRawReactElement defineProperty get inherits interopRequireDefault interopRequireWildcard objectWithoutProperties possibleConstructorReturn slicedToArray toConsumableArray'.split(' '))
|
||||
// then replacing the `global` reference in the last line to also use `this`.
|
||||
//
|
||||
// actually, that's a lie, because babel6 omits _extends and createRawReactElement
|
||||
|
||||
(function (global) {
|
||||
var babelHelpers = global.babelHelpers = {};
|
||||
@@ -125,6 +127,29 @@
|
||||
if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;
|
||||
};
|
||||
|
||||
babelHelpers.interopRequireDefault = function (obj) {
|
||||
return obj && obj.__esModule ? obj : {
|
||||
default: obj
|
||||
};
|
||||
};
|
||||
|
||||
babelHelpers.interopRequireWildcard = function (obj) {
|
||||
if (obj && obj.__esModule) {
|
||||
return obj;
|
||||
} else {
|
||||
var newObj = {};
|
||||
|
||||
if (obj != null) {
|
||||
for (var key in obj) {
|
||||
if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key];
|
||||
}
|
||||
}
|
||||
|
||||
newObj.default = obj;
|
||||
return newObj;
|
||||
}
|
||||
};
|
||||
|
||||
babelHelpers.objectWithoutProperties = function (obj, keys) {
|
||||
var target = {};
|
||||
|
||||
|
||||
@@ -48,6 +48,7 @@ function transform(src, filename, options) {
|
||||
// Only resolve the plugin if it's a string reference.
|
||||
if (typeof plugin[0] === 'string') {
|
||||
plugin[0] = require(`babel-plugin-${plugin[0]}`);
|
||||
plugin[0] = plugin[0].__esModule ? plugin[0].default : plugin[0];
|
||||
}
|
||||
return plugin;
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user