在android中创建类似于启动器的多屏幕拖放
我想实现一个布局,在这个布局中,我可以拖动一个图像并将其放到另一个类似于android launcher的屏幕上,我们可以将应用程序图标放置在一组水平滚动的屏幕上的任何位置。我不知道如何开始,从哪里开始。我正在考虑实现一个比屏幕更大的布局,然后在用户触摸图像时立即开始自动滚动。图像的放置位置将是固定的。有什么参考资料或更好的方法来实现这一点 对多个页面使用ViewPager。 在每个ViewPager页面上的ViewPager片段中使用GridView。 仅在viewPager上设置一次TragListener//重要 页面上每个GridView上的setOnDragListener//重要 get position=pointToPositionevent.getX,event.getY在目标网格上操作时的视图\在此处添加您的图标或任何您正在移动的内容。 操作\拖动\结束以用于从源GridView中删除。 使用操作\u从gridView拖动\u退出可来回更改viewPager页面(&R)。在android中创建类似于启动器的多屏幕拖放,android,android-animation,android-scroll,Android,Android Animation,Android Scroll,我想实现一个布局,在这个布局中,我可以拖动一个图像并将其放到另一个类似于android launcher的屏幕上,我们可以将应用程序图标放置在一组水平滚动的屏幕上的任何位置。我不知道如何开始,从哪里开始。我正在考虑实现一个比屏幕更大的布局,然后在用户触摸图像时立即开始自动滚动。图像的放置位置将是固定的。有什么参考资料或更好的方法来实现这一点 对多个页面使用ViewPager。 在每个ViewPager页面上的ViewPager片段中使用GridView。 仅在viewPager上设置一次Trag
注意:我假设您正在使用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
);