Commit 00dcb459 authored by xwenliang's avatar xwenliang

new feature pickerTextEllipsisLen and fix IndexOutOfBoundsException for Android

parent 6cd818fa
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
|Key | Type | Default| Support | Description | |Key | Type | Default| Support | Description |
| --- | --- | ---- | ------ | ----------- | | --- | --- | ---- | ------ | ----------- |
|isLoop | Boolean | false | Android | | |isLoop | Boolean | false | Android | |
|pickerTextEllipsisLen | number | 6 | Android | |
|pickerConfirmBtnText | string | confirm | iOS/Android | | |pickerConfirmBtnText | string | confirm | iOS/Android | |
|pickerCancelBtnText | string | cancel | iOS/Android | | |pickerCancelBtnText | string | cancel | iOS/Android | |
|pickerTitleText | string | pls select | iOS/Android | | |pickerTitleText | string | pls select | iOS/Android | |
...@@ -60,13 +61,13 @@ ...@@ -60,13 +61,13 @@
#### Step 3 - import and use in project #### Step 3 - import and use in project
```javascript ```javascript
import Picker from 'react-native-picker'; import Picker from 'react-native-picker';
let data = []; let data = [];
for(var i=0;i<100;i++){ for(var i=0;i<100;i++){
data.push(i); data.push(i);
} }
Picker.init({ Picker.init({
pickerData: data, pickerData: data,
selectedValue: [59], selectedValue: [59],
onPickerConfirm: data => { onPickerConfirm: data => {
...@@ -78,8 +79,8 @@ ...@@ -78,8 +79,8 @@
onPickerSelect: data => { onPickerSelect: data => {
console.log(data); console.log(data);
} }
}); });
Picker.show(); Picker.show();
``` ```
...@@ -113,19 +114,19 @@ $ pod install ...@@ -113,19 +114,19 @@ $ pod install
- single wheel: - single wheel:
```javascript ```javascript
pickerData = [1,2,3,4]; pickerData = [1,2,3,4];
selectedValue = 3; selectedValue = 3;
``` ```
- two or more wheel: - two or more wheel:
```javascript ```javascript
pickerData = [ pickerData = [
[1,2,3,4], [1,2,3,4],
[5,6,7,8], [5,6,7,8],
... ...
]; ];
selectedValue = [1, 5]; selectedValue = [1, 5];
``` ```
#### cascade: #### cascade:
...@@ -133,7 +134,7 @@ $ pod install ...@@ -133,7 +134,7 @@ $ pod install
- two wheel - two wheel
```javascript ```javascript
pickerData = [ pickerData = [
{ {
a: [1, 2, 3, 4] a: [1, 2, 3, 4]
}, },
...@@ -141,14 +142,14 @@ $ pod install ...@@ -141,14 +142,14 @@ $ pod install
b: [5, 6, 7, 8] b: [5, 6, 7, 8]
}, },
... ...
]; ];
selectedValue = ['a', 2]; selectedValue = ['a', 2];
``` ```
- three wheel - three wheel
```javascript ```javascript
pickerData = [ pickerData = [
{ {
a: [ a: [
{ {
...@@ -189,7 +190,7 @@ $ pod install ...@@ -189,7 +190,7 @@ $ pod install
] ]
}, },
... ...
] ]
``` ```
### For pure javascript version -> [v3.0.5](https://github.com/beefe/react-native-picker/tree/pure-javascript-version) ### For pure javascript version -> [v3.0.5](https://github.com/beefe/react-native-picker/tree/pure-javascript-version)
...@@ -101,6 +101,7 @@ public class PickerViewModule extends ReactContextBaseJavaModule implements Life ...@@ -101,6 +101,7 @@ public class PickerViewModule extends ReactContextBaseJavaModule implements Life
private static final String PICKER_TEXT_COLOR = "pickerFontColor"; private static final String PICKER_TEXT_COLOR = "pickerFontColor";
private static final String PICKER_TEXT_SIZE = "pickerFontSize"; private static final String PICKER_TEXT_SIZE = "pickerFontSize";
private static final String PICKER_TEXT_ELLIPSIS_LEN = "pickerTextEllipsisLen";
private static final String PICKER_EVENT_NAME = "pickerEvent"; private static final String PICKER_EVENT_NAME = "pickerEvent";
private static final String EVENT_KEY_CONFIRM = "confirm"; private static final String EVENT_KEY_CONFIRM = "confirm";
...@@ -116,6 +117,7 @@ public class PickerViewModule extends ReactContextBaseJavaModule implements Life ...@@ -116,6 +117,7 @@ public class PickerViewModule extends ReactContextBaseJavaModule implements Life
private String confirmText; private String confirmText;
private String cancelText; private String cancelText;
private String titleText; private String titleText;
private int pickerTextEllipsisLen;
private double[] weights; private double[] weights;
...@@ -239,6 +241,10 @@ public class PickerViewModule extends ReactContextBaseJavaModule implements Life ...@@ -239,6 +241,10 @@ public class PickerViewModule extends ReactContextBaseJavaModule implements Life
} }
}); });
if(options.hasKey(PICKER_TEXT_ELLIPSIS_LEN)){
pickerTextEllipsisLen = options.getInt(PICKER_TEXT_ELLIPSIS_LEN);
}
if (options.hasKey(IS_LOOP)) { if (options.hasKey(IS_LOOP)) {
isLoop = options.getBoolean(IS_LOOP); isLoop = options.getBoolean(IS_LOOP);
} }
...@@ -298,6 +304,7 @@ public class PickerViewModule extends ReactContextBaseJavaModule implements Life ...@@ -298,6 +304,7 @@ public class PickerViewModule extends ReactContextBaseJavaModule implements Life
pickerViewLinkage.setPickerData(pickerData, weights); pickerViewLinkage.setPickerData(pickerData, weights);
pickerViewLinkage.setTextColor(pickerTextColor); pickerViewLinkage.setTextColor(pickerTextColor);
pickerViewLinkage.setTextSize(pickerTextSize); pickerViewLinkage.setTextSize(pickerTextSize);
pickerViewLinkage.setTextEllipsisLen(pickerTextEllipsisLen);
pickerViewLinkage.setIsLoop(isLoop); pickerViewLinkage.setIsLoop(isLoop);
pickerViewLinkage.setOnSelectListener(new OnSelectedListener() { pickerViewLinkage.setOnSelectListener(new OnSelectedListener() {
...@@ -317,6 +324,7 @@ public class PickerViewModule extends ReactContextBaseJavaModule implements Life ...@@ -317,6 +324,7 @@ public class PickerViewModule extends ReactContextBaseJavaModule implements Life
pickerViewAlone.setPickerData(pickerData, weights); pickerViewAlone.setPickerData(pickerData, weights);
pickerViewAlone.setTextColor(pickerTextColor); pickerViewAlone.setTextColor(pickerTextColor);
pickerViewAlone.setTextSize(pickerTextSize); pickerViewAlone.setTextSize(pickerTextSize);
pickerViewAlone.setTextEllipsisLen(pickerTextEllipsisLen);
pickerViewAlone.setIsLoop(isLoop); pickerViewAlone.setIsLoop(isLoop);
pickerViewAlone.setOnSelectedListener(new OnSelectedListener() { pickerViewAlone.setOnSelectedListener(new OnSelectedListener() {
...@@ -346,9 +354,6 @@ public class PickerViewModule extends ReactContextBaseJavaModule implements Life ...@@ -346,9 +354,6 @@ public class PickerViewModule extends ReactContextBaseJavaModule implements Life
int height = barViewHeight + pickerViewHeight; int height = barViewHeight + pickerViewHeight;
if (dialog == null) { if (dialog == null) {
dialog = new Dialog(activity, R.style.Dialog_Full_Screen); dialog = new Dialog(activity, R.style.Dialog_Full_Screen);
} else {
dialog.dismiss();
}
dialog.setContentView(view); dialog.setContentView(view);
WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(); WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
Window window = dialog.getWindow(); Window window = dialog.getWindow();
...@@ -366,6 +371,10 @@ public class PickerViewModule extends ReactContextBaseJavaModule implements Life ...@@ -366,6 +371,10 @@ public class PickerViewModule extends ReactContextBaseJavaModule implements Life
layoutParams.gravity = Gravity.BOTTOM; layoutParams.gravity = Gravity.BOTTOM;
window.setAttributes(layoutParams); window.setAttributes(layoutParams);
} }
} else {
dialog.dismiss();
dialog.setContentView(view);
}
} }
} }
......
...@@ -67,6 +67,7 @@ public class LoopView extends View { ...@@ -67,6 +67,7 @@ public class LoopView extends View {
private String selectedItem; private String selectedItem;
private int selectedIndex; private int selectedIndex;
private int preCurrentIndex; private int preCurrentIndex;
private int textEllipsisLen = 7;
// 显示几个条目 // 显示几个条目
...@@ -216,6 +217,10 @@ public class LoopView extends View { ...@@ -216,6 +217,10 @@ public class LoopView extends View {
} }
} }
public final void setTextEllipsisLen(int len){
textEllipsisLen = len;
}
public boolean hasItem(String item) { public boolean hasItem(String item) {
int result = items.indexOf(item); int result = items.indexOf(item);
return result != -1; return result != -1;
...@@ -275,6 +280,33 @@ public class LoopView extends View { ...@@ -275,6 +280,33 @@ public class LoopView extends View {
} }
} }
protected final void drawText(Canvas canvas, String text, float posX, float posY, Paint paint) {
StringBuffer stringBuffer = new StringBuffer();
char[] array = text.toCharArray();
int sum = 0;
for(int i=0;i<array.length;i++){
if(sum >= (textEllipsisLen * 2)){
break;
}
char bt = array[i];
if(bt > 127 || bt == 94){
sum += 2;
}
else{
sum ++;
}
stringBuffer.append(String.valueOf(bt));
}
String string = "";
if(array.length != stringBuffer.toString().toCharArray().length){
string = stringBuffer.toString() + "...";
}
else{
string = text;
}
canvas.drawText(string, posX, posY, paint);
}
@Override @Override
protected void onDraw(Canvas canvas) { protected void onDraw(Canvas canvas) {
if (items == null) { if (items == null) {
...@@ -346,32 +378,32 @@ public class LoopView extends View { ...@@ -346,32 +378,32 @@ public class LoopView extends View {
// 条目经过第一条线 // 条目经过第一条线
canvas.save(); canvas.save();
canvas.clipRect(0, 0, getWidth(), firstLineY - translateY); canvas.clipRect(0, 0, getWidth(), firstLineY - translateY);
canvas.drawText(text, getX(text, paintOuterText), getY(paintOuterText), paintOuterText); drawText(canvas, text, getX(text, paintOuterText), getY(paintOuterText), paintOuterText);
canvas.restore(); canvas.restore();
canvas.save(); canvas.save();
canvas.clipRect(0, firstLineY - translateY, getWidth(), (int) (itemHeight)); canvas.clipRect(0, firstLineY - translateY, getWidth(), (int) (itemHeight));
canvas.drawText(text, getX(text, paintCenterText), getY(paintCenterText), paintCenterText); drawText(canvas, text, getX(text, paintCenterText), getY(paintCenterText), paintCenterText);
canvas.restore(); canvas.restore();
} else if (translateY <= secondLineY && maxTextHeight + translateY >= secondLineY) { } else if (translateY <= secondLineY && maxTextHeight + translateY >= secondLineY) {
// 条目经过第二条线 // 条目经过第二条线
canvas.save(); canvas.save();
canvas.clipRect(0, 0, getWidth(), secondLineY - translateY); canvas.clipRect(0, 0, getWidth(), secondLineY - translateY);
canvas.drawText(text, getX(text, paintCenterText), getY(paintCenterText), paintCenterText); drawText(canvas, text, getX(text, paintCenterText), getY(paintCenterText), paintCenterText);
canvas.restore(); canvas.restore();
canvas.save(); canvas.save();
canvas.clipRect(0, secondLineY - translateY, getWidth(), (int) (itemHeight)); canvas.clipRect(0, secondLineY - translateY, getWidth(), (int) (itemHeight));
canvas.drawText(text, getX(text, paintOuterText), getY(paintOuterText), paintOuterText); drawText(canvas, text, getX(text, paintOuterText), getY(paintOuterText), paintOuterText);
canvas.restore(); canvas.restore();
} else if (translateY >= firstLineY && maxTextHeight + translateY <= secondLineY) { } else if (translateY >= firstLineY && maxTextHeight + translateY <= secondLineY) {
// 中间条目 // 中间条目
canvas.clipRect(0, 0, getWidth(), (int) (itemHeight)); canvas.clipRect(0, 0, getWidth(), (int) (itemHeight));
canvas.drawText(text, getX(text, paintCenterText), getY(paintCenterText), paintCenterText); drawText(canvas, text, getX(text, paintCenterText), getY(paintCenterText), paintCenterText);
selectedItem = text; selectedItem = text;
selectedIndex = items.indexOf(text); selectedIndex = items.indexOf(text);
} else { } else {
// 其他条目 // 其他条目
canvas.clipRect(0, 0, getWidth(), (int) (itemHeight)); canvas.clipRect(0, 0, getWidth(), (int) (itemHeight));
canvas.drawText(text, getX(text, paintOuterText), getY(paintOuterText), paintOuterText); drawText(canvas, text, getX(text, paintOuterText), getY(paintOuterText), paintOuterText);
} }
canvas.restore(); canvas.restore();
} }
...@@ -381,8 +413,14 @@ public class LoopView extends View { ...@@ -381,8 +413,14 @@ public class LoopView extends View {
private float getX(String text, Paint paint) { private float getX(String text, Paint paint) {
paint.getTextBounds(text, 0, text.length(), tempRect); paint.getTextBounds(text, 0, text.length(), tempRect);
//return (getWidth() - tempRect.width() * scaleX) / 2;
if((getWidth() - tempRect.width() * scaleX)/2 > 0){
return (getWidth() - tempRect.width() * scaleX) / 2; return (getWidth() - tempRect.width() * scaleX) / 2;
} }
else{
return 0;
}
}
/** /**
* Added by shexiaoheng * Added by shexiaoheng
......
...@@ -212,6 +212,17 @@ public class PickerViewAlone extends LinearLayout { ...@@ -212,6 +212,17 @@ public class PickerViewAlone extends LinearLayout {
} }
} }
public void setTextEllipsisLen(int len){
int viewCount = pickerViewAloneLayout.getChildCount();
for (int i = 0; i < viewCount; i++) {
View view = pickerViewAloneLayout.getChildAt(i);
if (view instanceof LoopView) {
LoopView loopView = (LoopView) view;
loopView.setTextEllipsisLen(len);
}
}
}
public void setIsLoop(boolean isLoop) { public void setIsLoop(boolean isLoop) {
if (!isLoop) { if (!isLoop) {
int viewCount = pickerViewAloneLayout.getChildCount(); int viewCount = pickerViewAloneLayout.getChildCount();
......
...@@ -252,6 +252,12 @@ public class PickerViewLinkage extends LinearLayout { ...@@ -252,6 +252,12 @@ public class PickerViewLinkage extends LinearLayout {
selectTwoIndex = index; selectTwoIndex = index;
ReadableArray arr = data.get(selectOneIndex).getArray(oneList.get(selectOneIndex)); ReadableArray arr = data.get(selectOneIndex).getArray(oneList.get(selectOneIndex));
int arrSize = arr.size();
//fix IndexOutOfBoundsException
//by zooble @2018-1-10
if(index > arrSize){
index = arrSize - 1;
}
ReadableMap childMap = arr.getMap(index); ReadableMap childMap = arr.getMap(index);
String key = childMap.keySetIterator().nextKey(); String key = childMap.keySetIterator().nextKey();
ReadableArray sunArray = childMap.getArray(key); ReadableArray sunArray = childMap.getArray(key);
...@@ -288,6 +294,17 @@ public class PickerViewLinkage extends LinearLayout { ...@@ -288,6 +294,17 @@ public class PickerViewLinkage extends LinearLayout {
loopViewThree.setListener(new OnItemSelectedListener() { loopViewThree.setListener(new OnItemSelectedListener() {
@Override @Override
public void onItemSelected(String item, int index) { public void onItemSelected(String item, int index) {
//fix IndexOutOfBoundsException
//by zooble @2018-1-10
int arrOneSize = oneList.size();
if(selectOneIndex >= arrOneSize){
selectOneIndex = arrOneSize - 1;
}
int arrTwoSize = twoList.size();
if(selectTwoIndex >= arrTwoSize){
selectTwoIndex = arrTwoSize - 1;
}
returnData = new ReturnData(); returnData = new ReturnData();
returnData.setItem(oneList.get(selectOneIndex)); returnData.setItem(oneList.get(selectOneIndex));
returnData.setIndex(loopViewOne.getSelectedIndex()); returnData.setIndex(loopViewOne.getSelectedIndex());
...@@ -586,6 +603,20 @@ public class PickerViewLinkage extends LinearLayout { ...@@ -586,6 +603,20 @@ public class PickerViewLinkage extends LinearLayout {
} }
} }
public void setTextEllipsisLen(int len){
switch (curRow) {
case 2:
loopViewOne.setTextEllipsisLen(len);
loopViewTwo.setTextEllipsisLen(len);
break;
case 3:
loopViewOne.setTextEllipsisLen(len);
loopViewTwo.setTextEllipsisLen(len);
loopViewThree.setTextEllipsisLen(len);
break;
}
}
public void setTextColor(int color){ public void setTextColor(int color){
switch (curRow) { switch (curRow) {
case 2: case 2:
......
...@@ -77,8 +77,6 @@ export default class PickerTest extends Component { ...@@ -77,8 +77,6 @@ export default class PickerTest extends Component {
_showDatePicker() { _showDatePicker() {
Picker.init({ Picker.init({
pickerData: this._createDateData(), pickerData: this._createDateData(),
pickerToolBarFontSize: 16,
pickerFontSize: 16,
pickerFontColor: [255, 0 ,0, 1], pickerFontColor: [255, 0 ,0, 1],
onPickerConfirm: (pickedValue, pickedIndex) => { onPickerConfirm: (pickedValue, pickedIndex) => {
console.log('date', pickedValue, pickedIndex); console.log('date', pickedValue, pickedIndex);
......
...@@ -16,6 +16,7 @@ const options = { ...@@ -16,6 +16,7 @@ const options = {
pickerCancelBtnColor: [1, 186, 245, 1], pickerCancelBtnColor: [1, 186, 245, 1],
pickerTitleColor: [20, 20, 20, 1], pickerTitleColor: [20, 20, 20, 1],
pickerToolBarBg: [232, 232, 232, 1], pickerToolBarBg: [232, 232, 232, 1],
pickerTextEllipsisLen: 6,
pickerBg: [196, 199, 206, 1], pickerBg: [196, 199, 206, 1],
pickerRowHeight: 24, pickerRowHeight: 24,
wheelFlex: [1, 1, 1], wheelFlex: [1, 1, 1],
......
{ {
"name": "react-native-picker", "name": "react-native-picker",
"version": "4.3.2", "version": "4.3.4",
"description": "A Native Picker with high performance.", "description": "A Native Picker with high performance.",
"main": "index.js", "main": "index.js",
"types": "index.d.ts", "types": "index.d.ts",
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment