@@ -60,7 +60,7 @@ public class DragSortController extends SimpleFloatViewManager implements View.O
60
60
public static final int MISS = -1 ;
61
61
62
62
private int mHitPos = MISS ;
63
- private int mRemoveHitPos = MISS ;
63
+ private int mFlingHitPos = MISS ;
64
64
65
65
private int mClickRemoveHitPos = MISS ;
66
66
@@ -82,9 +82,11 @@ public class DragSortController extends SimpleFloatViewManager implements View.O
82
82
83
83
private int mClickRemoveId ;
84
84
85
+ private int mFlingHandleId ;
86
+ private boolean mCanDrag ;
87
+
85
88
private DragSortListView mDslv ;
86
89
private int mPositionX ;
87
- private boolean mCanDrag ;
88
90
89
91
90
92
/**
@@ -102,6 +104,10 @@ public DragSortController(DragSortListView dslv) {
102
104
public DragSortController (DragSortListView dslv , int dragHandleId , int dragInitMode , int removeMode ) {
103
105
this (dslv , dragHandleId , dragInitMode , removeMode , 0 );
104
106
}
107
+ public DragSortController (DragSortListView dslv , int dragHandleId , int dragInitMode , int removeMode , int clickRemoveId )
108
+ {
109
+ this (dslv , dragHandleId , dragInitMode , removeMode , clickRemoveId ,0 );
110
+ }
105
111
106
112
/**
107
113
* By default, sorting is enabled, and removal is disabled.
@@ -110,7 +116,8 @@ public DragSortController(DragSortListView dslv, int dragHandleId, int dragInitM
110
116
* @param dragHandleId The resource id of the View that represents
111
117
* the drag handle in a list item.
112
118
*/
113
- public DragSortController (DragSortListView dslv , int dragHandleId , int dragInitMode , int removeMode , int clickRemoveId ) {
119
+ public DragSortController (DragSortListView dslv , int dragHandleId , int dragInitMode , int removeMode , int clickRemoveId , int flingHandleId )
120
+ {
114
121
super (dslv );
115
122
mDslv = dslv ;
116
123
mDetector = new GestureDetector (dslv .getContext (), this );
@@ -119,6 +126,7 @@ public DragSortController(DragSortListView dslv, int dragHandleId, int dragInitM
119
126
mTouchSlop = ViewConfiguration .get (dslv .getContext ()).getScaledTouchSlop ();
120
127
mDragHandleId = dragHandleId ;
121
128
mClickRemoveId = clickRemoveId ;
129
+ mFlingHandleId = flingHandleId ;
122
130
setRemoveMode (removeMode );
123
131
setDragInitMode (dragInitMode );
124
132
mOrigFloatAlpha = dslv .getFloatAlpha ();
@@ -186,6 +194,16 @@ public boolean isRemoveEnabled() {
186
194
*/
187
195
public void setDragHandleId (int id ) {
188
196
mDragHandleId = id ;
197
+ }
198
+
199
+ /**
200
+ * Set the resource id for the View that represents the fling
201
+ * handle in a list item.
202
+ *
203
+ * @param id An android resource id.
204
+ */
205
+ public void setFlingHandleId (int id ) {
206
+ mFlingHandleId = id ;
189
207
}
190
208
191
209
/**
@@ -213,22 +231,21 @@ public void setClickRemoveId(int id) {
213
231
public boolean startDrag (int position , int deltaX , int deltaY ) {
214
232
215
233
int dragFlags = 0 ;
216
- if (mSortEnabled && ( !mIsRemoving || mRemoveMode != FLING_OR_SLIDE_REMOVE ) ) {
234
+ if (mSortEnabled && !mIsRemoving ) {
217
235
dragFlags |= DragSortListView .DRAG_POS_Y | DragSortListView .DRAG_NEG_Y ;
218
- //dragFlags |= DRAG_POS_Y; //for fun
219
236
}
220
237
if (mRemoveEnabled ) {
221
238
if (mRemoveMode == FLING_RIGHT_REMOVE ) {
222
239
dragFlags |= DragSortListView .DRAG_POS_X ;
223
240
} else if (mRemoveMode == FLING_LEFT_REMOVE ) {
224
241
dragFlags |= DragSortListView .DRAG_NEG_X ;
225
242
}
226
- else if ( mIsRemoving && mRemoveMode == FLING_OR_SLIDE_REMOVE ){
243
+ else if ( mRemoveMode == FLING_OR_SLIDE_REMOVE && mIsRemoving ){
227
244
dragFlags |= DragSortListView .DRAG_POS_X ;
228
245
dragFlags |= DragSortListView .DRAG_NEG_X ;
229
246
}
230
247
}
231
-
248
+
232
249
mDragging = mDslv .startDrag (position - mDslv .getHeaderViewsCount (), dragFlags , deltaX , deltaY );
233
250
return mDragging ;
234
251
}
@@ -253,11 +270,9 @@ public boolean onTouch(View v, MotionEvent ev) {
253
270
break ;
254
271
case MotionEvent .ACTION_UP :
255
272
if (mRemoveEnabled ) {
256
- if (mIsRemoving && mRemoveMode == FLING_OR_SLIDE_REMOVE ) {
257
- int x = mPositionX ;
258
- if ( x < 0 )
259
- x = -x ;
260
- int removePoint = mDslv .getWidth () / 3 ;
273
+ if ( mRemoveMode == FLING_OR_SLIDE_REMOVE && mIsRemoving ) {
274
+ int x = mPositionX >= 0 ? mPositionX : -mPositionX ;
275
+ int removePoint = mDslv .getWidth () / 2 ;
261
276
if ( x > removePoint ){
262
277
mDslv .stopDragWithVelocity (true ,0 );
263
278
}
@@ -341,8 +356,8 @@ public void onDragFloatView(View floatView, Point position, Point touch) {
341
356
public int startDragPosition (MotionEvent ev ) {
342
357
return dragHandleHitPosition (ev );
343
358
}
344
- public int startRemovePosition (MotionEvent ev ) {
345
- return removeHandleHitPosition (ev );
359
+ public int startFlingPosition (MotionEvent ev ) {
360
+ return mRemoveMode == FLING_OR_SLIDE_REMOVE ? flingHandleHitPosition (ev ) : MISS ;
346
361
}
347
362
348
363
/**
@@ -358,8 +373,8 @@ public int startRemovePosition(MotionEvent ev) {
358
373
public int dragHandleHitPosition (MotionEvent ev ) {
359
374
return viewIdHitPosition (ev , mDragHandleId );
360
375
}
361
- public int removeHandleHitPosition (MotionEvent ev ) {
362
- return viewIdHitPosition (ev , 0 );
376
+ public int flingHandleHitPosition (MotionEvent ev ) {
377
+ return viewIdHitPosition (ev , mFlingHandleId );
363
378
}
364
379
365
380
public int viewIdHitPosition (MotionEvent ev , int id ) {
@@ -408,56 +423,60 @@ public boolean onDown(MotionEvent ev) {
408
423
}
409
424
410
425
mHitPos = startDragPosition (ev );
411
- mRemoveHitPos = MISS ;
412
- boolean startedDrag = false ;
413
426
if (mHitPos != MISS && mDragInitMode == ON_DOWN ) {
414
- startedDrag = startDrag (mHitPos , (int ) ev .getX () - mItemX , (int ) ev .getY () - mItemY );
415
- }
416
- if ( !startedDrag && mRemoveMode == FLING_OR_SLIDE_REMOVE )
417
- {
418
- mCanDrag = true ;
419
- mPositionX = 0 ;
420
- mRemoveHitPos = startRemovePosition (ev );
427
+ startDrag (mHitPos , (int ) ev .getX () - mItemX , (int ) ev .getY () - mItemY );
421
428
}
429
+
430
+ mIsRemoving = false ;
431
+ mCanDrag = true ;
432
+ mPositionX = 0 ;
433
+ mFlingHitPos = startFlingPosition (ev );
422
434
423
435
return true ;
424
436
}
425
437
426
438
@ Override
427
439
public boolean onScroll (MotionEvent e1 , MotionEvent e2 , float distanceX , float distanceY ) {
428
- //Log.d("mobeta", "lift listener scrolled dX="+distanceX+" dY="+distanceY);
429
440
441
+ final int x1 = (int ) e1 .getX ();
442
+ final int y1 = (int ) e1 .getY ();
443
+ final int x2 = (int ) e2 .getX ();
444
+ final int y2 = (int ) e2 .getY ();
445
+ final int deltaX = x2 -mItemX ;
446
+ final int deltaY = y2 -mItemY ;
430
447
431
- if ( mRemoveMode ==FLING_OR_SLIDE_REMOVE && mCanDrag && !mDragging && (mHitPos != MISS || mRemoveHitPos !=MISS )) {
432
- final int x1 = (int ) e1 .getX ();
433
- final int y1 = (int ) e1 .getY ();
434
- final int x2 = (int ) e2 .getX ();
435
- final int y2 = (int ) e2 .getY ();
436
-
437
- boolean start = false ;
438
- if (mHitPos != MISS && mSortEnabled ) {
439
- start = Math .abs (y2 - y1 ) > mTouchSlop ;
440
- if ( start )
441
- mIsRemoving = false ;
442
- }
443
- if (mRemoveEnabled && !start ) {
444
- start = Math .abs (x2 - x1 ) > mTouchSlop ;
445
- if ( start )
446
- mIsRemoving = true ;
447
- }
448
- if (start ) {
449
- startDrag (mHitPos !=MISS ? mHitPos : mRemoveHitPos , x2 - mItemX , y2 - mItemY );
448
+ if ( mRemoveMode ==FLING_OR_SLIDE_REMOVE && mCanDrag && !mDragging && (mHitPos != MISS || mFlingHitPos !=MISS )) {
449
+
450
+ if ( mHitPos != MISS )
451
+ {
452
+ if ( mDragInitMode == ON_DRAG )
453
+ {
454
+ if ( Math .abs (y2 -y1 )>mTouchSlop && mSortEnabled )
455
+ {
456
+ startDrag (mHitPos , deltaX , deltaY );
457
+ }
458
+ else if ( Math .abs (x2 - x1 ) > mTouchSlop && mRemoveEnabled )
459
+ {
460
+ mIsRemoving = true ;
461
+ startDrag (mFlingHitPos , deltaX , deltaY );
462
+ }
463
+ }
464
+ //if mDragInitMode != ON_DRAG shloudn't do anything
450
465
}
451
- else if ( Math . abs ( y2 - y1 ) > mTouchSlop )
466
+ else if ( mFlingHitPos != MISS )
452
467
{
453
- mCanDrag = false ;
468
+ if ( Math .abs (x2 - x1 ) > mTouchSlop && mRemoveEnabled )
469
+ {
470
+ mIsRemoving = true ;
471
+ startDrag (mFlingHitPos , deltaX , deltaY );
472
+ }
473
+ else if ( Math .abs (y2 -y1 ) > mTouchSlop )
474
+ {
475
+ mCanDrag = false ; //if started to scroll the list then don't allow sorting nor fling-removing
476
+ }
454
477
}
455
478
}
456
479
else if (mHitPos != MISS && mDragInitMode == ON_DRAG && !mDragging ) {
457
- final int x1 = (int ) e1 .getX ();
458
- final int y1 = (int ) e1 .getY ();
459
- final int x2 = (int ) e2 .getX ();
460
- final int y2 = (int ) e2 .getY ();
461
480
462
481
boolean start = false ;
463
482
if (mRemoveEnabled && mSortEnabled ) {
@@ -469,7 +488,7 @@ else if (mHitPos != MISS && mDragInitMode == ON_DRAG && !mDragging) {
469
488
}
470
489
471
490
if (start ) {
472
- startDrag (mHitPos , x2 - mItemX , y2 - mItemY );
491
+ startDrag (mHitPos , deltaX , deltaY );
473
492
}
474
493
}
475
494
// return whatever
@@ -513,11 +532,10 @@ public void onShowPress(MotionEvent ev) {
513
532
@ Override
514
533
public final boolean onFling (MotionEvent e1 , MotionEvent e2 , float velocityX , float velocityY ) {
515
534
//Log.d("mobeta", "on fling remove called");
516
- mIsRemoving = false ;
517
535
if (mRemoveEnabled ) {
518
536
switch (mRemoveMode ) {
519
537
case FLING_OR_SLIDE_REMOVE :
520
- if ( mIsRemoving ) {
538
+ if ( mIsRemoving ) {
521
539
int w = mDslv .getWidth ();
522
540
int minPos = w /5 ;
523
541
if (velocityX > mFlingSpeed )
@@ -548,6 +566,7 @@ else if (velocityX < -mFlingSpeed )
548
566
break ;
549
567
}
550
568
}
569
+ mIsRemoving = false ;
551
570
return false ;
552
571
}
553
572
};
0 commit comments