将拖动项目实现到屏幕边缘function

当项目在屏幕边缘附近(左侧或右侧)拖动时,我需要实现当前的选项卡更改。

拖放N拖放function和当前标签开关没有问题。 我只是不能正确处理这个事件 – 当拖动项目靠近屏幕的边缘。

你会怎么做?

我试过的:

<FrameLayout android:id="@+id/left_toggle_area" android:layout_width="30dp" android:layout_height="fill_parent" android:layout_alignParentStart="true" android:layout_alignParentLeft="true"> </FrameLayout> <FrameLayout android:id="@+id/right_toggle_area" android:layout_width="30dp" android:layout_height="fill_parent" android:layout_alignParentEnd="true" android:layout_alignParentRight="true"> </FrameLayout> <GridView android:layout_width="match_parent" android:layout_height="match_parent" ... /> 

这个想法是当在切换区域拖动项目时以编程方式改变当前标签。

但事件DragEvent.ACTION_DRAG_ENTERED在该地区从来没有发生,因为(我相信) GridView占据了整个屏幕,只是与切换区域重叠。

当拖动开始事件被触发时,我已经尝试将这些区域放在前面。 但是这不起作用。

 FrameLayout toggleView = (FrameLayout) v; toggleView.bringToFront(); toggleView.requestLayout(); toggleView.invalidate(); 

如果有人遇到这样的问题,请分享您的经验。 或者也许还有另一个更好的解决scheme。 请给我一个提示。

Solutions Collecting From Web of "将拖动项目实现到屏幕边缘function"

我现在所使用的解决scheme(或多或less)是使用嵌套在PagerTabStrip标题中的TextView作为拖放区域。 这种方法最大的缺点是那些切换区域由于某种原因而太小。 ENTER事件仅在这些区域触发。

在这里输入图像说明

我相信这个解决scheme将与老学校标签。 因此,这里的代码。 可能对某人有用。

1)。 从PagerTabStripparsingTextViews

 private ArrayList <TextView> titles; ... public void setPager(PagerTabStrip mPagerTabStrip) { for (int i = 0; i < mPagerTabStrip.getChildCount(); ++i) { View nextChild = mPagerTabStrip.getChildAt(i); if (nextChild instanceof TextView) { TextView textViewToConvert = (TextView) nextChild; if (textViewToConvert.getText().toString().contains(TabsFragment.TAG_MONITOR)){ // I take only few tabs if (!titles.contains(textViewToConvert)) { titles.add(textViewToConvert); } } } } } public ArrayList<TextView> getTitles() { return titles; } 

这个操作后,我有3个TextViews需要拖放导航。

2)。 将您的TextViews列表传递给实现DragListeners类:

  public void setUpDragNDropTabMoves(ArrayList<TextView> views) { if (views != null) { for (TextView tv : views){ tv.setOnDragListener(TabToggleDragListener); } } } 

3)。 而听众本身

  View.OnDragListener TabToggleDragListener = new View.OnDragListener() { @Override public boolean onDrag(View v, DragEvent event) { TextView toggleView = (TextView) v; String title = toggleView.getText().toString(); switch (event.getAction()) { case DragEvent.ACTION_DROP: ... break; case DragEvent.ACTION_DRAG_ENTERED: int tabId = -1; //define which tab is destination if (title.contains(TabsFragment.TAG_MONITOR1)){ tabId = 1; } else if (title.contains(TabsFragment.TAG_MONITOR2)){ tabId = 2; } else if (title.contains(TabsFragment.TAG_MONITOR3)){ tabId = 3; } //send event to tab host fragment/activity and perform tab change to passed index //you may use EventBus or Otto for this. I used Local Broadcast BroadcastSender.sendMessageToUI(getContext(), BroadcastSender.TABS_FRAGMENT, BroadcastActions.TF_TOGGLE_TAB, tabId ); break; case DragEvent.ACTION_DRAG_EXITED: ... break; case DragEvent.ACTION_DRAG_ENDED: ... break; } return true; } }; 

我把它的三个视图(切换区域和GridView )的父母是一个RelativeLayout 。 首先,replaceGridView ,成为其父项的第一个子项。 完全按原样保留布局的其余部分。

其次,为了使用View.OnDragListener接口捕获drop事件,需要在AndroidManifest.xml中将最小的SDK版本设置为11。 之后,您可以将侦听器传递给切换区域:

 View.OnDragListener dragListener = new View.OnDragListener() { @Override public boolean onDrag(View v, DragEvent event) { // you can check for event.ACTION_DRAG_ENTERED here return true; } }; FrameLayout leftToggleArea = (FrameLayout) findViewById(R.id.left_toggle_area); leftToggleArea.setOnDragListener(dragListener); 

如果你仍然有问题,发布更多的代码。