2015-08-28 29 views
7

Düğmelerin yığınlarını hareket ettirmem gereken bir uygulama var (tıpkı bir kart yığınının bir kısmını bir yığından diğerine taşımak gibi). Tüm düğmeleri bir xml düzeninde tanımladım ve tüm kullanıcılar için dokunma ve sürükleme dinleyicileri. Ekranın herhangi bir tuşunu tek tek sürükleyip bırakabilirim. ama bazı durumlarda yapmam gereken şey, aynı düğmeyi tıklattığım orijinal düğmenin üzerine yığılmış olan diğer düğmeleri sürüklemektir. Başka bir düğmeye basılmasının "kandırılması" veya simüle edilmesinin bir yolu var mı (böylece dinleyici bunu kaydeder)? Teşekkürler *** Düzenlendi 9/8/15 @Override public boolean onTouch (Görüntüle v, MotionEvent e) { // tosty ("mclicking:" + mClicking); int startpos = 0; anahtarı (e.getAction() & MotionEvent.ACTION_MASK) {Java'da çoklu düğme görünümlerini sürükleme

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

ayrıca netleştirmek için, tek taş yapmam gerekenleri iyi bir örnektir. Kart destesinin herhangi bir yerinde bir kart üzerine tıklayın ve tıklanan orijinal düğmenin üstüne tüm kartları sürükleyin. Diğer tüm kartların arka planlarını, görünürlüğünü vs. değiştirebilirim, ancak hepsini sürükleyemiyorum. – huskyd97

+0

Bir Görünüm'ü taşımak için zaten bir şeyiniz olduğunu varsayalım, o halde neden bir Düğmeyi hareket ettirmek yerine, içindeki Düğmelerle bir Layout oluşturup taşıyın? – Templerschaf

+0

evet, doğru Doğrusal bir düzende düğmeler var. Doğrusal düzen görünümünü sürükleme gölge oluşturucuya iletirsem, tüm düğmeler hareket eder. ancak sadece düğmelerle geçici bir doğrusal düzeni yeniden oluşturmaya çalıştığımda, örneğin yığının yarısını taşımak istiyorum, sürükle ile ilgili sorunlara koşuyorum. İşte ben – huskyd97

cevap

4

Aksine her düğme için dinleyicileri çoğaltmak için çalışmak yerine, ben grupları gibi düğmeleri ele alacak. Bir grup içindeki bir düğmeye tıkladığınızda, iki gruba ayrılır: düğmelerin üstündeki düğme ve geride bıraktığınız şey. Grup daha sonra diğer gruplara sürüklenir ve bırakılır. Templerschaf anlaşılacağı gibi

grupları LinearLayouts olabilir:

  • Sen LinearLayout tıklayın
  • O
  • doğru konumda o öğenin altındaki öğeleri içeren yeni LinearLayout yapar hangi madde kaydeder
  • Tıklatılan öğenin altındaki öğeleri siler ve buna göre yeniden boyutlandırır
  • Ardından düzen,
  • .210
  • Daha sonra kendi listesinden

Bu oldukça ListView animasyonlar gibi öğeler katacak başka LinearLayout, üzerinde bırakılabilir. Bkz:

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

denediğim bazı kodlar Ne demek istediğimi biraz takip ediyorum, yeni LinearLayout'u oluşturduktan sonra takılıp kalıyorum (dragshadow yeni mizanpaj ile güncellenmiyor) zaten düğmeye basıyorum çünkü önerilen işlemi başlatır , 1., düzeni tıklayarak, 2. Hangi düğmeyi algılar/kaydederim, 3. Üstte bulunan düğmelerle yeni bir sıcaklık çizgisel düzen oluşturur ve bunu sürükleyiciye aktarabilirim, ancak görüntüyü aşağıdakileri kullanarak nasıl güncelleyebilirim? Düğmeye hala dokunurken yeni doğrusal düzen? Sürük sırasında hala tıklattığım orijinal düğmeyi sürükler. – huskyd97

+0

Sürüklemeyi bitirdikten sonra, yeni doğrusal hizalama ekrana çizilir. İlk basında ya da çekmeden hemen önce uzun basında da buna ihtiyacım var. Umarım bu mantıklıdır – huskyd97

+0

Muhtemelen düğmeyi içeren Düğme ve satır düzeni üzerinde tıklanabilir olarak ayarlamak için LinearLayout öğesinin sürüklemeyi üstlenmesini isteyebilirsiniz. Hem ilk tıklamaya hem de sürüklemeye ayrı ayrı yanıt vermeniz gerekir, böylece onTouchEvent öğesine ihtiyacınız olabilir. Bunun, bağlandığım ilk videoda yapıldığını düşünüyorum. Bu videoda yapıldığı gibi bir BitmapDrawable oluşturmanız gerektiğine ikna olmadım: bir LinearLayout ile mümkün olmalıdır. – TTransmit

İlgili konular