Skip to content

Commit 1ccc218

Browse files
committed
added attr fling_handle_id, cleaned code a bit
1 parent 1bbcf0c commit 1ccc218

File tree

3 files changed

+78
-55
lines changed

3 files changed

+78
-55
lines changed

library/res/values/dslv_attrs.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
<enum name="onLongPress" value="2"/>
2828
</attr>
2929
<attr name="drag_handle_id" format="integer" />
30+
<attr name="fling_handle_id" format="integer" />
3031
<attr name="click_remove_id" format="integer" />
3132
<attr name="use_default_controller" format="boolean" />
3233
</declare-styleable>

library/src/com/mobeta/android/dslv/DragSortController.java

Lines changed: 73 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public class DragSortController extends SimpleFloatViewManager implements View.O
6060
public static final int MISS = -1;
6161

6262
private int mHitPos = MISS;
63-
private int mRemoveHitPos = MISS;
63+
private int mFlingHitPos = MISS;
6464

6565
private int mClickRemoveHitPos = MISS;
6666

@@ -82,9 +82,11 @@ public class DragSortController extends SimpleFloatViewManager implements View.O
8282

8383
private int mClickRemoveId;
8484

85+
private int mFlingHandleId;
86+
private boolean mCanDrag;
87+
8588
private DragSortListView mDslv;
8689
private int mPositionX;
87-
private boolean mCanDrag;
8890

8991

9092
/**
@@ -102,6 +104,10 @@ public DragSortController(DragSortListView dslv) {
102104
public DragSortController(DragSortListView dslv, int dragHandleId, int dragInitMode, int removeMode) {
103105
this(dslv, dragHandleId, dragInitMode, removeMode, 0);
104106
}
107+
public DragSortController(DragSortListView dslv, int dragHandleId, int dragInitMode, int removeMode, int clickRemoveId)
108+
{
109+
this(dslv, dragHandleId, dragInitMode, removeMode, clickRemoveId,0);
110+
}
105111

106112
/**
107113
* By default, sorting is enabled, and removal is disabled.
@@ -110,7 +116,8 @@ public DragSortController(DragSortListView dslv, int dragHandleId, int dragInitM
110116
* @param dragHandleId The resource id of the View that represents
111117
* the drag handle in a list item.
112118
*/
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+
{
114121
super(dslv);
115122
mDslv = dslv;
116123
mDetector = new GestureDetector(dslv.getContext(), this);
@@ -119,6 +126,7 @@ public DragSortController(DragSortListView dslv, int dragHandleId, int dragInitM
119126
mTouchSlop = ViewConfiguration.get(dslv.getContext()).getScaledTouchSlop();
120127
mDragHandleId = dragHandleId;
121128
mClickRemoveId = clickRemoveId;
129+
mFlingHandleId = flingHandleId;
122130
setRemoveMode(removeMode);
123131
setDragInitMode(dragInitMode);
124132
mOrigFloatAlpha = dslv.getFloatAlpha();
@@ -186,6 +194,16 @@ public boolean isRemoveEnabled() {
186194
*/
187195
public void setDragHandleId(int id) {
188196
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;
189207
}
190208

191209
/**
@@ -213,22 +231,21 @@ public void setClickRemoveId(int id) {
213231
public boolean startDrag(int position, int deltaX, int deltaY) {
214232

215233
int dragFlags = 0;
216-
if (mSortEnabled && (!mIsRemoving || mRemoveMode != FLING_OR_SLIDE_REMOVE )) {
234+
if (mSortEnabled && !mIsRemoving) {
217235
dragFlags |= DragSortListView.DRAG_POS_Y | DragSortListView.DRAG_NEG_Y;
218-
//dragFlags |= DRAG_POS_Y; //for fun
219236
}
220237
if (mRemoveEnabled) {
221238
if (mRemoveMode == FLING_RIGHT_REMOVE) {
222239
dragFlags |= DragSortListView.DRAG_POS_X;
223240
} else if (mRemoveMode == FLING_LEFT_REMOVE) {
224241
dragFlags |= DragSortListView.DRAG_NEG_X;
225242
}
226-
else if( mIsRemoving && mRemoveMode == FLING_OR_SLIDE_REMOVE ){
243+
else if( mRemoveMode == FLING_OR_SLIDE_REMOVE && mIsRemoving){
227244
dragFlags |= DragSortListView.DRAG_POS_X;
228245
dragFlags |= DragSortListView.DRAG_NEG_X;
229246
}
230247
}
231-
248+
232249
mDragging = mDslv.startDrag(position - mDslv.getHeaderViewsCount(), dragFlags, deltaX, deltaY);
233250
return mDragging;
234251
}
@@ -253,11 +270,9 @@ public boolean onTouch(View v, MotionEvent ev) {
253270
break;
254271
case MotionEvent.ACTION_UP:
255272
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;
261276
if( x > removePoint ){
262277
mDslv.stopDragWithVelocity(true,0);
263278
}
@@ -341,8 +356,8 @@ public void onDragFloatView(View floatView, Point position, Point touch) {
341356
public int startDragPosition(MotionEvent ev) {
342357
return dragHandleHitPosition(ev);
343358
}
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;
346361
}
347362

348363
/**
@@ -358,8 +373,8 @@ public int startRemovePosition(MotionEvent ev) {
358373
public int dragHandleHitPosition(MotionEvent ev) {
359374
return viewIdHitPosition(ev, mDragHandleId);
360375
}
361-
public int removeHandleHitPosition(MotionEvent ev) {
362-
return viewIdHitPosition(ev, 0);
376+
public int flingHandleHitPosition(MotionEvent ev) {
377+
return viewIdHitPosition(ev, mFlingHandleId);
363378
}
364379

365380
public int viewIdHitPosition(MotionEvent ev, int id) {
@@ -408,56 +423,60 @@ public boolean onDown(MotionEvent ev) {
408423
}
409424

410425
mHitPos = startDragPosition(ev);
411-
mRemoveHitPos = MISS;
412-
boolean startedDrag = false;
413426
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);
421428
}
429+
430+
mIsRemoving = false;
431+
mCanDrag = true;
432+
mPositionX = 0;
433+
mFlingHitPos = startFlingPosition(ev);
422434

423435
return true;
424436
}
425437

426438
@Override
427439
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
428-
//Log.d("mobeta", "lift listener scrolled dX="+distanceX+" dY="+distanceY);
429440

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;
430447

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
450465
}
451-
else if( Math.abs(y2-y1) > mTouchSlop)
466+
else if( mFlingHitPos != MISS)
452467
{
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+
}
454477
}
455478
}
456479
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();
461480

462481
boolean start = false;
463482
if (mRemoveEnabled && mSortEnabled) {
@@ -469,7 +488,7 @@ else if (mHitPos != MISS && mDragInitMode == ON_DRAG && !mDragging) {
469488
}
470489

471490
if (start) {
472-
startDrag(mHitPos, x2 - mItemX, y2 - mItemY);
491+
startDrag(mHitPos, deltaX, deltaY);
473492
}
474493
}
475494
// return whatever
@@ -513,11 +532,10 @@ public void onShowPress(MotionEvent ev) {
513532
@Override
514533
public final boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
515534
//Log.d("mobeta", "on fling remove called");
516-
mIsRemoving = false;
517535
if (mRemoveEnabled) {
518536
switch (mRemoveMode) {
519537
case FLING_OR_SLIDE_REMOVE:
520-
if( mIsRemoving) {
538+
if( mIsRemoving ) {
521539
int w = mDslv.getWidth();
522540
int minPos = w/5;
523541
if (velocityX > mFlingSpeed )
@@ -548,6 +566,7 @@ else if (velocityX < -mFlingSpeed )
548566
break;
549567
}
550568
}
569+
mIsRemoving = false;
551570
return false;
552571
}
553572
};

library/src/com/mobeta/android/dslv/DragSortListView.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -513,6 +513,9 @@ public DragSortListView(Context context, AttributeSet attrs) {
513513
int dragHandleId = a.getResourceId(
514514
R.styleable.DragSortListView_drag_handle_id,
515515
0);
516+
int flingHandleId = a.getResourceId(
517+
R.styleable.DragSortListView_fling_handle_id,
518+
0);
516519
int clickRemoveId = a.getResourceId(
517520
R.styleable.DragSortListView_click_remove_id,
518521
0);
@@ -522,7 +525,7 @@ public DragSortListView(Context context, AttributeSet attrs) {
522525

523526
DragSortController controller = new DragSortController(
524527
this, dragHandleId, dragInitMode, removeMode,
525-
clickRemoveId);
528+
clickRemoveId,flingHandleId);
526529
controller.setRemoveEnabled(removeEnabled);
527530
controller.setSortEnabled(sortEnabled);
528531
controller.setBackgroundColor(bgColor);

0 commit comments

Comments
 (0)