0

グリッドビューで Android のドラッグ アンド ドロップを実装しようとしています。グリッド アダプターの各ビューに 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;
    }

}
4

1 に答える 1

0

タッチイベントをどのように処理していますか? すべてのタッチ操作を 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 (ビデオの説明にあるソース コード リンク)。

于 2013-11-26T10:52:25.523 に答える