在android中创建类似于启动器的多屏幕拖放

在android中创建类似于启动器的多屏幕拖放,android,android-animation,android-scroll,Android,Android Animation,Android Scroll,我想实现一个布局,在这个布局中,我可以拖动一个图像并将其放到另一个类似于android launcher的屏幕上,我们可以将应用程序图标放置在一组水平滚动的屏幕上的任何位置。我不知道如何开始,从哪里开始。我正在考虑实现一个比屏幕更大的布局,然后在用户触摸图像时立即开始自动滚动。图像的放置位置将是固定的。有什么参考资料或更好的方法来实现这一点 对多个页面使用ViewPager。 在每个ViewPager页面上的ViewPager片段中使用GridView。 仅在viewPager上设置一次Trag

我想实现一个布局,在这个布局中,我可以拖动一个图像并将其放到另一个类似于android launcher的屏幕上,我们可以将应用程序图标放置在一组水平滚动的屏幕上的任何位置。我不知道如何开始,从哪里开始。我正在考虑实现一个比屏幕更大的布局,然后在用户触摸图像时立即开始自动滚动。图像的放置位置将是固定的。有什么参考资料或更好的方法来实现这一点

对多个页面使用ViewPager。 在每个ViewPager页面上的ViewPager片段中使用GridView。 仅在viewPager上设置一次TragListener//重要 页面上每个GridView上的setOnDragListener//重要 get position=pointToPositionevent.getX,event.getY在目标网格上操作时的视图\在此处添加您的图标或任何您正在移动的内容。 操作\拖动\结束以用于从源GridView中删除。 使用操作\u从gridView拖动\u退出可来回更改viewPager页面(&R)。
注意:我假设您正在使用gridView.setOnItemLongClickListener for startDrag等。请在android网站上查阅。

我刚刚写了这样一句话:它目前正在工作

只需在ViewPager上添加Draglistener。您不需要在GridView上添加DragListener

获取目标网格上的放置位置

跟踪源GridView和目标GridView,并使用以获取其适配器

然后操纵适配器之间的下降


试试这个,本教程基于一个屏幕。。我正在寻找多屏幕使用Viewpager。我确实想过使用Viewpager。。但我不确定如何在viewpager中将图像从第一页拖到第二页??有一个库。看见
public void setDragListener() {
    pager = getViewPager();

    dragListener = new View.OnDragListener() {
        GridViewAdapter sourceAdapter = null;
        GridViewAdapter targetAdapter = null;
        int currentOffset = 0;

        @Override
        public boolean onDrag(View v, DragEvent event) {
            int currentX = -1;
            int currentY = -1;

            switch (event.getAction()) {
                case DragEvent.ACTION_DRAG_STARTED:
                    if (!pager.isFakeDragging()) {
                        pager.beginFakeDrag();
                    }
                    break;
                case DragEvent.ACTION_DRAG_ENTERED:
                    pager.setCurrentItem(pager.getCurrentItem());
                    currentOffset = (int) (event.getX());
                    if (!pager.isFakeDragging()) {
                        pager.beginFakeDrag();
                    }
                    break;
                case DragEvent.ACTION_DRAG_EXITED:
                    break;
                case DragEvent.ACTION_DRAG_LOCATION:
                    if (pager != null) {
                        if (!pager.isFakeDragging()) {
                            pager.beginFakeDrag();
                        }
                        if (pager.isFakeDragging()) {
                            int maxWidth = pager.getWidth() * pager.getCount();
                            int offset = (int) (event.getX());
                            int scrollX = getScrollX();
                            int dragBy = (int) -1 * (offset - currentOffset);
                            currentOffset = offset;
                            pager.fakeDragBy(dragBy * pager.getCount());
                            int  scrolledPage = (int) (offset + scrollX) / pager.getWidth();
                            if (pager.getCurrentItem() != scrolledPage) {
                                pager.setCurrentItem(Math.abs(scrolledPage));
                            }
                        }
                    }
                    break;
                case DragEvent.ACTION_DRAG_ENDED:
                    if (pager.isFakeDragging()) {
                        pager.endFakeDrag();
                    }
                    break;
                case DragEvent.ACTION_DROP:
                    if (pager.isFakeDragging()) {
                        pager.endFakeDrag();
                    }
                    currentX = (int) event.getX();
                    currentY = (int) event.getY();

                    // u can use meta data and other info which u passed when longPress
                    // u can set sourcePage and sourcePosition in meta data.

                    metaMove = event.getLocalState(); 

                    sourceAdapter = // get Source Gridviews adapter
                    targetAdapter = // get Target GridViews Adapter ie current Page's gridviews adapter.
                    GridView g = // get The gridview current Page gridview
                    if (g != null) {
                        int position = g.pointToPosition(currentX + (getScrollX() - (pager.getWidth() * pager.getCurrentItem())), currentY);
                        metaMove.targetPosition = position;
                        metaMove.targetPage = currentPage;
                        getActivity().runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                // u can move from source to target by inset and remove.
                                // use some broadcast function to reset if page does not have any item left while moving. Ur logic here.
                                move(sourceAdapter, targetAdapter, metaMove);
                            }
                        });
                    }
                    break;
                default:
                    break;
            }
            return true;
        }
    };
    pager.setOnDragListener(dragListener);
}

public int getScrollX() { 
      int maxWidth = pager.getWidth() * pager.getCount();
      int scrollX = pager.getScrollX();
                      if (pager.getScrollX() < 0) {
                            scrollX = maxWidth + scrollX - pager.getWidth();
                        } else if (pager.getScrollX() == 0) {
                            if (pager.getCurrentItem() == (pager.getCount() - 1)) {
                                scrollX = maxWidth + scrollX - pager.getWidth();
                            }
                        }
   return scrollX;
}
                metaMove.sourcePage = // sourcePage;
                metaMove.sourcePosition = position;
                metaMove.targetPosition = -1; // to be set on drop
                metaMove.targetPage = -1 // to be set on drop;

                boolean dragStarted = view.startDrag(null, 
                        myShadow,  
                        metaMove,  
                        0          
                );