Перетаскивание нескольких видов кнопок в java

У меня есть приложение, где мне нужно переместить стопки кнопок (точно так же, как перемещение части стопки карточек из одной кучи в другую). Я определил все кнопки в макете xml и установил касание и перетащите слушателей для всех. Я могу перетащить любую кнопку по экрану отдельно. Но то, что мне нужно сделать в некоторых случаях, это перетащить другие кнопки, уложенные поверх исходной кнопки, которую я нажал одновременно. Есть ли способ «обмануть» или имитировать, что нажата другая кнопка (так что слушатель регистрирует ее)? Спасибо *** Отредактировано 9/8/15 @Override public boolean onTouch (View v, MotionEvent e) {// tosty ("mclicking:" + mClicking); Int startpos = 0; Switch (e.getAction () & MotionEvent.ACTION_MASK) {

case MotionEvent.ACTION_DOWN: isWastePile=false; get_selected_deck(v); // determines which of 7 decks or layouts in the tablau you have // clicked FromDeck = selecteddeck; FromDeckCard = deckcard; FromDeckButton = deckbutton; // if (!mClicking) { mClicking = true; //String piecetag = (String) v.getTag(); // // IDEA!!!/ /// /* * I wrote a function that finds all the ImageButtons below where * the user clicked, and set them all to invisible. I then created a * new Linear Layout within the Linear Layout that the user clicked (during the ACTION_DOWN event), * and passed that into the Drag Shadow builder during the ACTION_MOVE event. * * Once into the ACTION_DROP portion, I simply referenced global * variables to figure out if the user dropped in one or multiple * ImageButtons, and dealt with them accordingly. */ //if (!isWastePile) { //draglayout.setClipChildren(false); lltemp = new LinearLayout(this); lltemp.setOrientation(LinearLayout.VERTICAL); LinearLayout.LayoutParams llparams = new LinearLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); llparams.setMargins(0, -52, 0, 0); lltemp.setLayoutParams(llparams); draglayout.addView(lltemp); for (int i = 0; i < deckstack_list[selecteddeck].size(); i++) { if (v == (draglayout.getChildAt(i))) { startpos = i; for (int o = i; o < deckstack_list[selecteddeck].size(); o++) { // layout5.removeViewAt(o); draglayout.getChildAt(o).setVisibility(View.GONE); // all // buttons // being dragtempstack.push((Integer) deckstack_list[selecteddeck].get(o)) ; // dragged // to // invisible // then recreate another linear layout within layout5 // and pass to dragshadow builder // to do // also set a GLOBAL variable with stack count (number // of cards dragged) lltemp.setClipChildren(false); lltemp.addView(createtempButtons(o, startpos)); } } } //} // end if wastepile check statement //tosty("dragtempstack size: "+dragtempstack.size()); break; case MotionEvent.ACTION_MOVE: //tosty("Action MOVE"); Log.i("ACTION Event: ", "ACTION MOVE"); // v = layout5; v = lltemp; v.setVisibility(View.INVISIBLE); v.bringToFront(); v.invalidate(); v.setVisibility(View.VISIBLE); //DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(v); DeckDragShadow shadowBuilder = new DeckDragShadow(v); v.startDrag(null, shadowBuilder, v, 0); correctDrag = false; break; private Button createtempButtons(final int i, final int startpos) { final Button b = new Button(this); b.setOnTouchListener(this); b.setOnDragListener(new DeckDragListener()); b.setBackgroundResource(cardimagearray[dragdeckstack.get(i)]); float width = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 45, getResources().getDisplayMetrics()); float height = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 61, getResources().getDisplayMetrics()); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams( (int) width, (int) height); float margTop = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, -36, getResources().getDisplayMetrics()); if (i > startpos) { params.setMargins(0, -57, 0, 0); } b.setLayoutParams(params); // b.bringToFront(); // b.invalidate(); b.setVisibility(View.VISIBLE); return b; 

Вместо того, чтобы пытаться воспроизвести слушателей для каждой кнопки, я бы рассмотрел кнопки как группы. Когда вы нажимаете кнопку внутри группы, она разбивается на две группы: кнопка с кнопками над ней и то, что вы оставляете. Затем группу перетаскивают и удаляют на другие группы.

Группы могут быть LinearLayouts, поскольку Templerschaf предлагает:

  • Вы нажимаете LinearLayout
  • Он регистрирует, какой элемент
  • Создает новый LinearLayout, содержащий элементы ниже этого элемента в правильном положении
  • Удаляет элементы под щелчком элемента и соответственно изменяет размер
  • Затем макет можно продолжать перетаскивать
  • Затем он может быть сброшен на другой LinearLayout, который добавит элементы в свой собственный список

Это похоже на анимацию ListView. Видеть:

https://www.youtube.com/watch?v=_BZIvjMgH-Q

https://www.youtube.com/watch?v=mwE61B56pVQ

https://github.com/bauerca/drag-sort-listview/blob/master/library/src/com/mobeta/android/dslv/DragSortListView.java