Skip to content

Commit

Permalink
new feature pickerTextEllipsisLen and fix IndexOutOfBoundsException f…
Browse files Browse the repository at this point in the history
…or Android
  • Loading branch information
xwenliang committed Jan 10, 2018
1 parent 6cd818f commit 00dcb45
Show file tree
Hide file tree
Showing 8 changed files with 195 additions and 106 deletions.
159 changes: 80 additions & 79 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
|Key | Type | Default| Support | Description |
| --- | --- | ---- | ------ | ----------- |
|isLoop | Boolean | false | Android | |
|pickerTextEllipsisLen | number | 6 | Android | |
|pickerConfirmBtnText | string | confirm | iOS/Android | |
|pickerCancelBtnText | string | cancel | iOS/Android | |
|pickerTitleText | string | pls select | iOS/Android | |
Expand Down Expand Up @@ -60,26 +61,26 @@
#### Step 3 - import and use in project

```javascript
import Picker from 'react-native-picker';
let data = [];
for(var i=0;i<100;i++){
data.push(i);
import Picker from 'react-native-picker';
let data = [];
for(var i=0;i<100;i++){
data.push(i);
}

Picker.init({
pickerData: data,
selectedValue: [59],
onPickerConfirm: data => {
console.log(data);
},
onPickerCancel: data => {
console.log(data);
},
onPickerSelect: data => {
console.log(data);
}

Picker.init({
pickerData: data,
selectedValue: [59],
onPickerConfirm: data => {
console.log(data);
},
onPickerCancel: data => {
console.log(data);
},
onPickerSelect: data => {
console.log(data);
}
});
Picker.show();
});
Picker.show();

```

Expand Down Expand Up @@ -113,83 +114,83 @@ $ pod install
- single wheel:

```javascript
pickerData = [1,2,3,4];
selectedValue = 3;
pickerData = [1,2,3,4];
selectedValue = 3;
```

- two or more wheel:

```javascript
pickerData = [
[1,2,3,4],
[5,6,7,8],
...
];
selectedValue = [1, 5];
pickerData = [
[1,2,3,4],
[5,6,7,8],
...
];
selectedValue = [1, 5];
```

#### cascade:

- two wheel

```javascript
pickerData = [
{
a: [1, 2, 3, 4]
},
{
b: [5, 6, 7, 8]
},
...
];
selectedValue = ['a', 2];
pickerData = [
{
a: [1, 2, 3, 4]
},
{
b: [5, 6, 7, 8]
},
...
];
selectedValue = ['a', 2];
```

- three wheel

```javascript
pickerData = [
{
a: [
{
a1: [1, 2, 3, 4]
},
{
a2: [5, 6, 7, 8]
},
{
a3: [9, 10, 11, 12]
}
]
},
{
b: [
{
b1: [11, 22, 33, 44]
},
{
b2: [55, 66, 77, 88]
},
{
b3: [99, 1010, 1111, 1212]
}
]
},
{
c: [
{
c1: ['a', 'b', 'c']
},
{
c2: ['aa', 'bb', 'cc']
},
{
c3: ['aaa', 'bbb', 'ccc']
}
]
},
...
]
pickerData = [
{
a: [
{
a1: [1, 2, 3, 4]
},
{
a2: [5, 6, 7, 8]
},
{
a3: [9, 10, 11, 12]
}
]
},
{
b: [
{
b1: [11, 22, 33, 44]
},
{
b2: [55, 66, 77, 88]
},
{
b3: [99, 1010, 1111, 1212]
}
]
},
{
c: [
{
c1: ['a', 'b', 'c']
},
{
c2: ['aa', 'bb', 'cc']
},
{
c3: ['aaa', 'bbb', 'ccc']
}
]
},
...
]
```

### For pure javascript version -> [v3.0.5](https://github.com/beefe/react-native-picker/tree/pure-javascript-version)
43 changes: 26 additions & 17 deletions android/src/main/java/com/beefe/picker/PickerViewModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -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_SIZE = "pickerFontSize";
private static final String PICKER_TEXT_ELLIPSIS_LEN = "pickerTextEllipsisLen";

private static final String PICKER_EVENT_NAME = "pickerEvent";
private static final String EVENT_KEY_CONFIRM = "confirm";
Expand All @@ -116,6 +117,7 @@ public class PickerViewModule extends ReactContextBaseJavaModule implements Life
private String confirmText;
private String cancelText;
private String titleText;
private int pickerTextEllipsisLen;

private double[] weights;

Expand Down Expand Up @@ -239,6 +241,10 @@ public void onClick(View v) {
}
});

if(options.hasKey(PICKER_TEXT_ELLIPSIS_LEN)){
pickerTextEllipsisLen = options.getInt(PICKER_TEXT_ELLIPSIS_LEN);
}

if (options.hasKey(IS_LOOP)) {
isLoop = options.getBoolean(IS_LOOP);
}
Expand Down Expand Up @@ -298,6 +304,7 @@ public void onClick(View v) {
pickerViewLinkage.setPickerData(pickerData, weights);
pickerViewLinkage.setTextColor(pickerTextColor);
pickerViewLinkage.setTextSize(pickerTextSize);
pickerViewLinkage.setTextEllipsisLen(pickerTextEllipsisLen);
pickerViewLinkage.setIsLoop(isLoop);

pickerViewLinkage.setOnSelectListener(new OnSelectedListener() {
Expand All @@ -317,6 +324,7 @@ public void onSelected(ArrayList<ReturnData> selectedList) {
pickerViewAlone.setPickerData(pickerData, weights);
pickerViewAlone.setTextColor(pickerTextColor);
pickerViewAlone.setTextSize(pickerTextSize);
pickerViewAlone.setTextEllipsisLen(pickerTextEllipsisLen);
pickerViewAlone.setIsLoop(isLoop);

pickerViewAlone.setOnSelectedListener(new OnSelectedListener() {
Expand Down Expand Up @@ -346,25 +354,26 @@ public void onSelected(ArrayList<ReturnData> selectedList) {
int height = barViewHeight + pickerViewHeight;
if (dialog == null) {
dialog = new Dialog(activity, R.style.Dialog_Full_Screen);
dialog.setContentView(view);
WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
Window window = dialog.getWindow();
if (window != null) {
if (MIUIUtils.isMIUI()) {
layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION;
}else {
//layoutParams.type = WindowManager.LayoutParams.TYPE_TOAST;
}
layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
layoutParams.format = PixelFormat.TRANSPARENT;
layoutParams.windowAnimations = R.style.PickerAnim;
layoutParams.width = WindowManager.LayoutParams.MATCH_PARENT;
layoutParams.height = height;
layoutParams.gravity = Gravity.BOTTOM;
window.setAttributes(layoutParams);
}
} else {
dialog.dismiss();
}
dialog.setContentView(view);
WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
Window window = dialog.getWindow();
if (window != null) {
if (MIUIUtils.isMIUI()) {
layoutParams.type = WindowManager.LayoutParams.TYPE_APPLICATION;
}else {
//layoutParams.type = WindowManager.LayoutParams.TYPE_TOAST;
}
layoutParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
layoutParams.format = PixelFormat.TRANSPARENT;
layoutParams.windowAnimations = R.style.PickerAnim;
layoutParams.width = WindowManager.LayoutParams.MATCH_PARENT;
layoutParams.height = height;
layoutParams.gravity = Gravity.BOTTOM;
window.setAttributes(layoutParams);
dialog.setContentView(view);
}
}
}
Expand Down
52 changes: 45 additions & 7 deletions android/src/main/java/com/beefe/picker/view/LoopView.java
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ enum ACTION {
private String selectedItem;
private int selectedIndex;
private int preCurrentIndex;
private int textEllipsisLen = 7;


// 显示几个条目
Expand Down Expand Up @@ -216,6 +217,10 @@ public final void setTextSize(float size) {
}
}

public final void setTextEllipsisLen(int len){
textEllipsisLen = len;
}

public boolean hasItem(String item) {
int result = items.indexOf(item);
return result != -1;
Expand Down Expand Up @@ -275,6 +280,33 @@ protected final void onItemSelected() {
}
}

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
protected void onDraw(Canvas canvas) {
if (items == null) {
Expand Down Expand Up @@ -346,32 +378,32 @@ protected void onDraw(Canvas canvas) {
// 条目经过第一条线
canvas.save();
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.save();
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();
} else if (translateY <= secondLineY && maxTextHeight + translateY >= secondLineY) {
// 条目经过第二条线
canvas.save();
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.save();
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();
} else if (translateY >= firstLineY && maxTextHeight + translateY <= secondLineY) {
// 中间条目
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;
selectedIndex = items.indexOf(text);
} else {
// 其他条目
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();
}
Expand All @@ -381,7 +413,13 @@ protected void onDraw(Canvas canvas) {

private float getX(String text, Paint paint) {
paint.getTextBounds(text, 0, text.length(), tempRect);
return (getWidth() - tempRect.width() * scaleX) / 2;
//return (getWidth() - tempRect.width() * scaleX) / 2;
if((getWidth() - tempRect.width() * scaleX)/2 > 0){
return (getWidth() - tempRect.width() * scaleX) / 2;
}
else{
return 0;
}
}

/**
Expand Down
Loading

0 comments on commit 00dcb45

Please sign in to comment.