Перетаскивание Android GridView
Я пытаюсь воспрепятствовать перетаскиванию Android на мой gridview. Я установил dragListener для каждого вида в сеточном адаптере. Он отлично работает, когда сетка недостаточно длинна для прокрутки или если она прокручивается до тех пор, пока виден первый вид в сетке. При прокрутке он перемещает действия вниз на определенную позицию, однако многие виды не видны сверху вместо того, чтобы находиться в правильной позиции.
GridView устанавливает DragListener внутри адаптера:
ImageView i = new ImageView;
i.setImageResource(ImageList.get(position));
i.setOnDragListener(new MyDragImageListener(position));
return i;
MyDragListener:
public class MyDragImageListener implements OnDragListener{
int imagePosition;
public MyDragImageListener(int position) {
imagePosition = position;
}
@Override
public boolean onDrag(View v, DragEvent event) {
switch (event.getAction()) {
case DragEvent.ACTION_DRAG_STARTED:
Log.i("DRAG Started", "" + imagePosition);
break;
case DragEvent.ACTION_DRAG_ENTERED:
Log.i("DRAG Entered", "" + imagePosition);
ImageView imageEnter = (ImageView) Grid.getChildAt(imagePosition);
imageEnter.setBackgroundColor(Color.argb(155, 100, 200, 255));
break;
case DragEvent.ACTION_DRAG_EXITED:
Log.i("DRAG Exited", "" + imagePosition);
ImageView imageExit = (ImageView) Grid.getChildAt(imagePosition);
imageExit.setBackgroundColor(Color.argb(0, 0, 0, 0));
break;
case DragEvent.ACTION_DROP:
Log.i("DRAG Dropped", "" + imagePosition);
break;
case DragEvent.ACTION_DRAG_ENDED:
Log.i("DRAG Ended", "" + imagePosition);
default:
break;
}
return true;
}
}
1 ответ
Как вы справляетесь с сенсорными событиями? Существует тонкий баланс между предложением всех сенсорных действий в одном месте:
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (mDragController == null || !mDragging) {
if (mDragController!=null) mDragController.onInterceptTouchEvent(ev);
if (mSwipeEnabled) {
gestureDetector.onTouchEvent(ev);
return false; //to make sure we receive further messages
}
else
return super.onInterceptTouchEvent(ev); //for scroll, etc
}
else
// controller to handle event
return mDragController.onInterceptTouchEvent(ev);
}
/**
*
*/
@Override
public boolean onTouchEvent(MotionEvent ev) {
if (mDragController == null || !mDragging) {
//if (!gestureDetector.onTouchEvent(ev))
return super.onTouchEvent(ev);
}
// controller to handle event
return mDragController.onTouchEvent(ev);
}
Это прекрасно работает, предоставляя результаты, показанные в этом демонстрационном видео: http://www.youtube.com/watch?v=m4yktX3SWSs (ссылка на исходный код в описании видео).