【问题标题】:Android Drag and Drop GridViewAndroid 拖放 GridView
【发布时间】:2013-05-19 21:04:32
【问题描述】:

我正试图在我的 gridview 上阻止 Androids drag and drop。我为网格适配器中的每个视图设置了一个 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;
    }

}

【问题讨论】:

  • 您想说 DragEvent 正在返回 screenPosition 并且您期望绝对位置或其他方式?为什么不直接获取滚动位置并将其用作偏移量
  • 谢谢我试过这个,它似乎有效。我刚开始使用拖放,并认为这会是一个更复杂的解决方案,但从未想过要尝试。

标签: android drag-and-drop android-gridview


【解决方案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(视频说明中的源代码链接)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多