|
|
@@ -0,0 +1,144 @@
|
|
|
+package com.picker;
|
|
|
+
|
|
|
+import android.graphics.Color;
|
|
|
+import android.graphics.Paint;
|
|
|
+import android.util.DisplayMetrics;
|
|
|
+
|
|
|
+import android.view.View;
|
|
|
+import android.widget.EditText;
|
|
|
+import android.widget.NumberPicker;
|
|
|
+
|
|
|
+import com.facebook.react.bridge.Arguments;
|
|
|
+import com.facebook.react.bridge.ReadableArray;
|
|
|
+import com.facebook.react.bridge.ReadableMap;
|
|
|
+import com.facebook.react.bridge.WritableMap;
|
|
|
+import com.facebook.react.common.MapBuilder;
|
|
|
+import com.facebook.react.uimanager.SimpleViewManager;
|
|
|
+import com.facebook.react.uimanager.ThemedReactContext;
|
|
|
+import com.facebook.react.uimanager.annotations.ReactProp;
|
|
|
+import com.facebook.react.uimanager.events.RCTEventEmitter;
|
|
|
+
|
|
|
+import java.lang.reflect.Field;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+/**
|
|
|
+ * Created by haoxinlei on 2018/3/27.
|
|
|
+ */
|
|
|
+
|
|
|
+public class NumberPickerManager extends SimpleViewManager<NumberPicker> {
|
|
|
+
|
|
|
+ private ThemedReactContext context;
|
|
|
+ private final String ONVALUECHANGE = "onValueChange";
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String getName() {
|
|
|
+ return "AndroidPicker";
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected NumberPicker createViewInstance(ThemedReactContext reactContext) {
|
|
|
+ NumberPicker numberPicker = new NumberPicker(reactContext);
|
|
|
+ context = reactContext;
|
|
|
+ return numberPicker;
|
|
|
+ }
|
|
|
+
|
|
|
+ @ReactProp(name = "data")
|
|
|
+ public void setValues(NumberPicker numberPicker, ReadableArray array) {
|
|
|
+ String[] values = new String[array.size()];
|
|
|
+ List<String> data = new ArrayList<>();
|
|
|
+ for (int i = 0; i < array.size(); i++) {
|
|
|
+ values[i] = array.getString(i);
|
|
|
+ data.add(array.getString(i));
|
|
|
+ }
|
|
|
+ numberPicker.setMaxValue(data.size()-1);
|
|
|
+ numberPicker.setMinValue(0);
|
|
|
+ numberPicker.setDisplayedValues(values);
|
|
|
+ numberPicker.setDescendantFocusability(NumberPicker.FOCUS_BLOCK_DESCENDANTS);
|
|
|
+ numberPicker.setWrapSelectorWheel(false);//禁止循环滚动
|
|
|
+
|
|
|
+ try {
|
|
|
+ //设置分割线高度
|
|
|
+ Field dividerHeight = numberPicker.getClass().getDeclaredField("mSelectionDividerHeight");
|
|
|
+ dividerHeight.setAccessible(true);
|
|
|
+ dividerHeight.set(numberPicker,1);
|
|
|
+ } catch (Exception e){
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ numberPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
|
|
|
+ @Override
|
|
|
+ public void onValueChange(NumberPicker numberPicker, int i, int i1) {
|
|
|
+ WritableMap map = Arguments.createMap();
|
|
|
+ map.putString("item",numberPicker.getDisplayedValues()[i1]);
|
|
|
+ map.putInt("index",i1);
|
|
|
+ context.getJSModule(RCTEventEmitter.class)
|
|
|
+ .receiveEvent(numberPicker.getId(),"onValueChange",map);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ numberPicker.invalidate();
|
|
|
+ }
|
|
|
+
|
|
|
+ @ReactProp(name = "dataAndSelectedIndex")
|
|
|
+ public void setDataAndSelectedIndex(NumberPicker numberPicker, ReadableMap map) {
|
|
|
+ if(map.hasKey("list")) {
|
|
|
+ this.setValues(numberPicker, map.getArray("list"));
|
|
|
+ }
|
|
|
+ if(map.hasKey("selectedIndex")) {
|
|
|
+ this.setDefaultValue(numberPicker, map.getInt("selectedIndex"));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @ReactProp(name = "itemStyle")
|
|
|
+ public void setItemStyle(NumberPicker numberPicker, ReadableMap map) {
|
|
|
+ float fontSize = 28;
|
|
|
+ String textColor = "#000000";
|
|
|
+ if (map.hasKey("fontSize"))
|
|
|
+ fontSize = map.getInt("fontSize") * getDensity();
|
|
|
+ if (map.hasKey("color"))
|
|
|
+ textColor = map.getString("color");
|
|
|
+ for (int i = 0; i < numberPicker.getChildCount(); i++) {
|
|
|
+ View view = numberPicker.getChildAt(i);
|
|
|
+ if (view instanceof EditText) {
|
|
|
+ try {
|
|
|
+ Field selectorWheelPaintField = numberPicker.getClass()
|
|
|
+ .getDeclaredField("mSelectorWheelPaint");
|
|
|
+ selectorWheelPaintField.setAccessible(true);
|
|
|
+ ((Paint) selectorWheelPaintField.get(numberPicker)).setColor(Color.parseColor(textColor));
|
|
|
+ ((Paint) selectorWheelPaintField.get(numberPicker)).setTextSize(fontSize);
|
|
|
+ ((EditText) view).setTextColor(Color.parseColor(textColor));
|
|
|
+ ((EditText) view).setTextSize(fontSize/getDensity());
|
|
|
+ numberPicker.invalidate();
|
|
|
+ } catch (Exception e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ numberPicker.invalidate();
|
|
|
+ }
|
|
|
+
|
|
|
+ public float getDensity(){
|
|
|
+ DisplayMetrics dm = new DisplayMetrics();
|
|
|
+ context.getCurrentActivity().getWindowManager().getDefaultDisplay().getMetrics(dm);
|
|
|
+ return dm.density;
|
|
|
+ }
|
|
|
+
|
|
|
+ @ReactProp(name = "selectedIndex")
|
|
|
+ public void setDefaultValue(NumberPicker numberPicker, int i) {
|
|
|
+ numberPicker.setValue(i);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected void addEventEmitters(ThemedReactContext reactContext, NumberPicker view) {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Map<String, Object> getExportedCustomDirectEventTypeConstants() {
|
|
|
+ return MapBuilder.<String, Object>builder()
|
|
|
+ .put(ONVALUECHANGE, MapBuilder.of("registrationName", ONVALUECHANGE))
|
|
|
+ .build();
|
|
|
+ }
|
|
|
+
|
|
|
+}
|