2015-08-28 19 views
7

Tôi có một ứng dụng mà tôi cần phải di chuyển các ngăn xếp của các nút (giống như di chuyển một phần của một chồng thẻ từ một đống khác). Tôi đã xác định tất cả các nút trong một bố trí xml và thiết lập cảm ứng và kéo người nghe cho tất cả. Tôi có thể kéo và thả bất kỳ nút nào quanh màn hình riêng lẻ. nhưng những gì tôi cần làm trong một số trường hợp là kéo các nút khác xếp chồng lên nhau trên đầu nút gốc mà tôi đã nhấp vào cùng một lúc. Có cách nào để "lừa" hoặc mô phỏng một nút khác được nhấn (để người nghe đăng ký nó) không? Cảm ơn *** Đã chỉnh sửa 9/8/15 @Override boolean onTouch công khai (Xem v, MotionEvent e) { // tosty ("mclicking:" + mClicking); int startpos = 0; switch (e.getAction() & MotionEvent.ACTION_MASK) {Kéo nhiều lượt xem nút trong 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

để làm rõ hơn nữa, solitaire là một ví dụ tốt về những gì tôi cần phải làm. nhấp vào một thẻ ở bất kỳ đâu trong ngăn xếp thẻ và kéo tất cả các thẻ lên trên nút gốc đã được nhấp. Tôi có thể thay đổi hình nền, khả năng hiển thị, vv của tất cả các thẻ khác với một vòng lặp, nhưng dường như không thể kéo tất cả chúng. – huskyd97

+0

Tôi cho rằng bạn đã có thứ gì đó để di chuyển Chế độ xem, vậy tại sao không, thay vì di chuyển một Nút, hãy tạo và di chuyển Bố cục bằng các Nút trong đó? – Templerschaf

+0

có, chính xác tôi có các nút trong bố cục tuyến tính. Nếu tôi chuyển chế độ xem bố cục tuyến tính vào trình tạo bóng kéo, tất cả các nút sẽ di chuyển. nhưng khi tôi cố gắng tạo lại bố cục tuyến tính tạm thời chỉ bằng các nút tôi muốn di chuyển, ví dụ như một nửa số cọc, tôi gặp phải sự cố khi kéo. Dưới đây là một số mã mà tôi đã cố gắng – huskyd97

Trả lời

4

Thay vì cố gắng để nhân rộng các thính giả cho mỗi nút, tôi sẽ xem xét các nút như các nhóm. Khi bạn bấm vào một nút trong một nhóm, nó chia thành hai nhóm: nút với các nút ở trên nó và những gì bạn đang để lại phía sau. Nhóm này sau đó được kéo và thả vào các nhóm khác.

Các nhóm có thể là LinearLayouts như Templerschaf gợi ý:

  • Bạn nhấp vào LinearLayout
  • Nó đăng ký mà mục
  • Làm cho một LinearLayout mới có chứa các mục bên dưới mục mà vào đúng vị trí
  • Xóa các mục bên dưới mục được nhấp và thay đổi kích thước tương ứng
  • Sau đó, bố cục có thể tiếp tục được kéo
  • Sau đó nó có thể được thả trên một LinearLayout khác, sẽ thêm các mục vào danh sách riêng của nó

Điều này khá giống với hoạt ảnh ListView. Xem:

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

Tôi phần nào theo ý bạn, tôi gặp khó khăn sau khi tạo LinearLayout mới (dragshadow không cập nhật bố cục mới) vì tôi đã nhấp vào nút, bắt đầu quá trình bạn đề xuất 1. Tôi phát hiện/đăng ký nút nào, 3. Tôi tạo bố cục tuyến tính tạm thời mới với các nút trên cùng được đính kèm và truyền vào trong hình kéo, nhưng làm cách nào để tôi có được hình ảnh cập nhật bằng bố cục tuyến tính mới trong khi tôi vẫn chạm vào nút? Trong khi kéo nó vẫn chỉ kéo nút gốc mà tôi đã nhấp vào. – huskyd97

+0

Khi tôi hoàn thành kéo, linearlayout mới sẽ được vẽ lên màn hình. Tôi cần tất cả điều này xảy ra trên báo chí đầu tiên hoặc báo chí dài ngay trước khi kéo. Hy vọng rằng có ý nghĩa – huskyd97

+0

Bạn có thể muốn đặt có thể nhấp là giả trên bố cục Nút và hàng chứa nút để LinearLayout đang xử lý thao tác kéo. Bạn cần phản hồi cả nhấp chuột ban đầu và kéo riêng để bạn có thể cần onTouchEvent. Tôi nghĩ rằng điều này được thực hiện trong video đầu tiên tôi liên kết tới. Tôi không tin rằng bạn cần phải tạo một BitmapDrawable như được thực hiện trong video đó: nó sẽ có thể với một LinearLayout. – TTransmit

Các vấn đề liên quan