2015-08-28 14 views
7

Mam aplikację, w której muszę przenosić stosy przycisków (podobnie jak ruch części stosu kart z jednego stosu na drugi). Zdefiniowałem wszystkie przyciski w układzie xml i konfiguracji, aby dotknąć i przeciągnąć słuchaczy dla wszystkich. Potrafię przeciągać i upuszczać każdy przycisk na ekranie osobno. ale w niektórych przypadkach muszę przeciągnąć pozostałe przyciski ułożone na oryginalnym przycisku, który kliknąłem w tym samym czasie. Czy istnieje sposób "oszukania" lub zasymulowania innego przycisku (aby słuchacz go zarejestrował)? Dzięki *** Edytowane 9/8/15 @Override public boolean onTouch (Zobacz v, MotionEvent e) { // tosty ("mclicking:" + mClicking); int startpos = 0; przełącznik (e.getAction() & MotionEvent.ACTION_MASK) {Przeciąganie widoków z wieloma przyciskami w java

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; 
+0

wyjaśnienie dalej, pasjans jest dobrym przykładem tego, co muszę zrobić. kliknij kartę w dowolnym miejscu stosu kart i przeciągnij wszystkie karty na górze oryginalnego przycisku, który został kliknięty. Mogę zmienić tło, widoczność itd. Wszystkich innych kart za pomocą pętli, ale po prostu nie mogę ich przeciągnąć. – huskyd97

+0

Zakładam, że masz już coś do przeniesienia widoku, więc dlaczego nie, zamiast przesuwać przycisk, należy utworzyć i przenieść układ z przyciskami? – Templerschaf

+0

tak, poprawne Mam przyciski w układzie liniowym. Jeśli przekażę widok układu liniowego do kreatora przeciągania, wszystkie przyciski będą się poruszać. ale gdy próbuję odtworzyć tymczasowy układ liniowy za pomocą tylko przycisków Chcę przenieść, na przykład połowę stosu, natrafiam na problemy z przeciąganiem. Oto kod, który próbowałem – huskyd97

Odpowiedz

4

Zamiast starać się replikować słuchaczy dla każdego przycisku, uważam przycisków jak grupy. Po kliknięciu przycisku w grupie dzieli się na dwie grupy: przycisk z przyciskami nad nim i to, co pozostawiasz. Grupa jest następnie przeciągana i upuszczana na inne grupy.

Grupy może być LinearLayouts jak Templerschaf proponuje:

  • Kliknięcie LinearLayout
  • Rejestruje który element
  • tworzy nowy LinearLayout zawierający elementy poniżej tego elementu w prawidłowym położeniu
  • Usuwa elementy poniżej klikniętego elementu i odpowiednio zmienia rozmiar.
  • Następnie układ może być nadal przeciągany
  • Można go następnie upuścić na innym LinearLayout, który doda pozycje do swojej własnej listy

To jest zupełnie jak animacje ListView. Zobacz:

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

+0

W pewnym sensie podążam za tym, co masz na myśli, utknąłem po utworzeniu nowego LinearLayout (dragshadow nie aktualizuje się z nowym układem), ponieważ już klikam przycisk, który rozpoczyna proces, który zasugerowałeś , 1. kliknięcie na układ, 2. Wykrywam/rejestruję, który przycisk, 3. Tworzę nowy układ liniowy z zamontowanymi przyciskami na górze i przekazuję go do dragshadow, ale jak mogę go zaktualizować za pomocą nowy układ liniowy, gdy wciąż dotykam przycisku? Podczas przeciągania nadal tylko przeciąga oryginalny przycisk, który kliknąłem. – huskyd97

+0

Po zakończeniu przeciągania nowy ekran liniowy jest wyświetlany na ekranie. Potrzebuję tego również za pierwszym razem lub długim naciśnięciem tuż przed przeciągnięciem. Mam nadzieję, że to ma sens – huskyd97

+0

Prawdopodobnie chcesz ustawić klikalność jako fałsz na przycisku i układzie wiersza zawierającym przycisk, aby LinearLayout obsługiwał przeciąganie. Musisz odpowiedzieć na początkowe kliknięcie i przeciągnij osobno, aby być może potrzebujesz TouchEvent. Myślę, że robi się to w pierwszym filmie, z którym się łączyłem. Nie jestem przekonany, że musisz utworzyć BitmapDrawable, jak to jest zrobione w tym filmie: powinno to być możliwe dzięki LinearLayout. – TTransmit

Powiązane problemy