diff --git a/.idea/dictionaries/yatesmiao.xml b/.idea/dictionaries/yatesmiao.xml new file mode 100644 index 0000000..b73f924 --- /dev/null +++ b/.idea/dictionaries/yatesmiao.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..8d66637 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..b34ce5e --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + CoffeeScript + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..71c8639 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..902e335 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,471 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + getConstants + ReactMethod + createNativeModules + NativeModules + ReactNativeWheelPickerPackage + widthMeasureSpec + setData + ItemSelectedEvent + mValueData + indicatorColor + data + state + setIndicator + setSelectedItemTextColor + _onValueChange + textColor + onValueChange + itemStyle + mState + textSize + + + + + + + + + + + + + true + + false + true + + + true + DEFINITION_ORDER + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + project + + + + + + + + + + + + + + + + project + + + true + + + + DIRECTORY + + false + + + + + + + + + + + + 1501577346238 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/WheelCurvedPicker.android.js b/WheelCurvedPicker.android.js index 2cfe37c..5f9112a 100644 --- a/WheelCurvedPicker.android.js +++ b/WheelCurvedPicker.android.js @@ -2,92 +2,140 @@ import React from 'react'; import { - View, - ColorPropType, - requireNativeComponent, + View, + ColorPropType, + requireNativeComponent, } from 'react-native'; var WheelCurvedPicker = React.createClass ({ - propTypes: { - ...View.propTypes, - - data: React.PropTypes.array, - - textColor: ColorPropType, - - textSize: React.PropTypes.number, - - itemStyle: React.PropTypes.object, - - itemSpace: React.PropTypes.number, - - onValueChange: React.PropTypes.func, - - selectedValue: React.PropTypes.any, - - selectedIndex: React.PropTypes.number, - }, - - getDefaultProps(): Object { - return { - itemStyle : {color:"white", fontSize:26}, - itemSpace: 20, - }; - }, - - getInitialState: function() { - return this._stateFromProps(this.props); - }, - - componentWillReceiveProps: function(nextProps) { - this.setState(this._stateFromProps(nextProps)); - }, - - _stateFromProps: function(props) { - var selectedIndex = 0; - var items = []; - React.Children.forEach(props.children, function (child, index) { - if (child.props.value === props.selectedValue) { - selectedIndex = index; - } - items.push({value: child.props.value, label: child.props.label}); - }); - - var textSize = props.itemStyle.fontSize - var textColor = props.itemStyle.color - - return {selectedIndex, items, textSize, textColor}; - }, - - _onValueChange: function(e: Event) { - if (this.props.onValueChange) { - this.props.onValueChange(e.nativeEvent.data); - } - }, - - render() { - return ; - } + propTypes: { + ...View.propTypes, + + data: React.PropTypes.array, + + selectedIndex: React.PropTypes.number, + + selectTextColor: ColorPropType, + + itemStyle: React.PropTypes.object, //textColor textSize + + textSize: React.PropTypes.number, + textColor: ColorPropType, + + // 设置滚轮选择器指示器样式 + indicatorStyle: React.PropTypes.object, //indicatorColor indicatorSize + + indicatorSize: React.PropTypes.number, + indicatorColor: ColorPropType, + + // 设置滚轮选择器是否显示指示器 + indicator: React.PropTypes.bool, + + // 设置滚轮选择器是否显示幕布 + curtain: React.PropTypes.bool, + // 设置滚轮选择器幕布颜色 + curtainColor: ColorPropType, + + // 设置滚轮选择器是否有空气感 + atmospheric: React.PropTypes.bool, + + // 滚轮选择器是否开启卷曲效果 + curved: React.PropTypes.bool, + + // 设置滚轮选择器可见数据项数量 + visibleItemCount: React.PropTypes.number, + + itemSpace: React.PropTypes.number, + + onValueChange: React.PropTypes.func, + + selectedValue: React.PropTypes.any, + + }, + + getDefaultProps(): Object { + return { + itemStyle : {color:"white", fontSize:26}, + indicatorStyle: {color:"red", fontSize:2}, + itemSpace: 20, + }; + }, + + getInitialState: function() { + return this._stateFromProps(this.props); + }, + + componentWillReceiveProps: function(nextProps) { + this.setState(this._stateFromProps(nextProps)); + }, + + _stateFromProps: function(props) { + var selectedIndex = 0; + var items = []; + React.Children.forEach(props.children, function (child, index) { + if (child.props.value === props.selectedValue) { + selectedIndex = index; + } + items.push({value: index, theValue: child.props.value, label: child.props.label}); + }); + + var textSize = props.itemStyle.fontSize + var textColor = props.itemStyle.color + var selectTextColor = props.selectTextColor + var itemSpace = props.itemSpace + var indicator = props.indicator + var indicatorColor = props.indicatorStyle.color + var indicatorSize = props.indicatorStyle.fontSize + var curtain = props.curtain + var curtainColor = props.curtainColor + var atmospheric = props.atmospheric + var curved = props.curved + var visibleItemCount = props.visibleItemCount + + return {selectedIndex, items, textSize, textColor, selectTextColor, itemSpace,indicator, indicatorColor, indicatorSize, curtain, curtainColor, atmospheric, curved, visibleItemCount} ; + }, + + _onValueChange: function(e: Event) { + if (this.props.onValueChange) { + var selectedItem = this.state.items[e.nativeEvent.data]; + !selectedItem && (selectedItem = {theValue:0}); + this.props.onValueChange(selectedItem.theValue); + } + }, + + render() { + return ; + } }); WheelCurvedPicker.Item = React.createClass({ - propTypes: { - value: React.PropTypes.any, // string or integer basically - label: React.PropTypes.string, - }, - - render: function() { - // These items don't get rendered directly. - return null; - }, + propTypes: { + value: React.PropTypes.any, // string or integer basically + label: React.PropTypes.string, + }, + + render: function() { + // These items don't get rendered directly. + return null; + }, }); var WheelCurvedPickerNative = requireNativeComponent('WheelCurvedPicker', WheelCurvedPicker); diff --git a/android/build.gradle b/android/build.gradle index f0a74ba..86bf888 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.library' android { compileSdkVersion 23 - buildToolsVersion "23.0.1" + buildToolsVersion "25.0.0" defaultConfig { minSdkVersion 16 targetSdkVersion 22 @@ -16,6 +16,8 @@ android { dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) - compile "cn.aigestudio.wheelpicker:WheelPicker:1.0.3" +// compile "cn.aigestudio.wheelpicker:WheelPicker:1.0.3" + compile 'cn.aigestudio.wheelpicker:WheelPicker:1.1.2' + compile 'com.facebook.react:react-native:+' } diff --git a/android/src/main/java/com/zyu/ReactWheelCurvedPicker.java b/android/src/main/java/com/zyu/ReactWheelCurvedPicker.java index 126e866..61f6497 100644 --- a/android/src/main/java/com/zyu/ReactWheelCurvedPicker.java +++ b/android/src/main/java/com/zyu/ReactWheelCurvedPicker.java @@ -8,8 +8,9 @@ import android.os.SystemClock; import android.util.AttributeSet; -import com.aigestudio.wheelpicker.core.AbstractWheelPicker; -import com.aigestudio.wheelpicker.view.WheelCurvedPicker; +import com.aigestudio.wheelpicker.WheelPicker; +import com.aigestudio.wheelpicker.WheelPicker; +import com.aigestudio.wheelpicker.WheelPicker.OnWheelChangeListener; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.ReactContext; import com.facebook.react.bridge.WritableMap; @@ -23,61 +24,67 @@ /** * @author Sam Yu */ -public class ReactWheelCurvedPicker extends WheelCurvedPicker { - +public class ReactWheelCurvedPicker extends WheelPicker { +// private Integer indicatorColor = Color.WHITE; private final EventDispatcher mEventDispatcher; private List mValueData; + private int mState; +// public void setIndicatorColor(Integer indicatorColor) { +// this.indicatorColor = indicatorColor; +// } public ReactWheelCurvedPicker(ReactContext reactContext) { super(reactContext); mEventDispatcher = reactContext.getNativeModule(UIManagerModule.class).getEventDispatcher(); setOnWheelChangeListener(new OnWheelChangeListener() { @Override - public void onWheelScrolling(float deltaX, float deltaY) { + public void onWheelScrolled(int offset) { } @Override - public void onWheelSelected(int index, String data) { - if (mValueData != null && index < mValueData.size()) { + public void onWheelSelected(int position) { + if (mValueData != null && position < mValueData.size()) { mEventDispatcher.dispatchEvent( - new ItemSelectedEvent(getId(), mValueData.get(index))); + new ItemSelectedEvent(getId(), mValueData.get(position))); } } @Override public void onWheelScrollStateChanged(int state) { + mState = state; } }); } +// @Override +// protected void drawForeground(Canvas canvas) { +// super.drawForeground(canvas); +// +// Paint paint = new Paint(); +// paint.setColor(this.indicatorColor); +// canvas.drawLine(rectCurItem.left, rectCurItem.top, rectCurItem.right, rectCurItem.top, paint); +// canvas.drawLine(rectCurItem.left, rectCurItem.bottom, rectCurItem.right, rectCurItem.bottom, paint); +// } @Override - protected void drawForeground(Canvas canvas) { - super.drawForeground(canvas); - - Paint paint = new Paint(); - paint.setColor(Color.WHITE); - int colorFrom = 0x00FFFFFF;//Color.BLACK; - int colorTo = Color.WHITE; - LinearGradient linearGradientShader = new LinearGradient(rectCurItem.left, rectCurItem.top, rectCurItem.right/2, rectCurItem.top, colorFrom, colorTo, Shader.TileMode.MIRROR); - paint.setShader(linearGradientShader); - canvas.drawLine(rectCurItem.left, rectCurItem.top, rectCurItem.right, rectCurItem.top, paint); - canvas.drawLine(rectCurItem.left, rectCurItem.bottom, rectCurItem.right, rectCurItem.bottom, paint); + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); } - @Override - public void setItemIndex(int index) { - super.setItemIndex(index); - unitDeltaTotal = 0; - mHandler.post(this); - } +// @Override +// public void setItemIndex(int index) { +// super.setItemIndex(index); +// unitDeltaTotal = 0; +// mHandler.post(this); +// } public void setValueData(List data) { mValueData = data; } public int getState() { - return state; + return mState; } + } class ItemSelectedEvent extends Event { diff --git a/android/src/main/java/com/zyu/ReactWheelCurvedPickerManager.java b/android/src/main/java/com/zyu/ReactWheelCurvedPickerManager.java index cd0e5c4..186de43 100644 --- a/android/src/main/java/com/zyu/ReactWheelCurvedPickerManager.java +++ b/android/src/main/java/com/zyu/ReactWheelCurvedPickerManager.java @@ -2,7 +2,7 @@ import android.graphics.Color; -import com.aigestudio.wheelpicker.core.AbstractWheelPicker; +import com.aigestudio.wheelpicker.WheelPicker; import com.facebook.react.bridge.ReadableArray; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.common.MapBuilder; @@ -27,11 +27,48 @@ public class ReactWheelCurvedPickerManager extends SimpleViewManager