2013-04-22 75 views
9

我正在爲api> 14進行開發,並且我在GridView上實現了拖放功能。拖動gridview時拖動項目(作爲影子)

但是,在將項目拖動到屏幕的頂部或底部時,GridView不會滾動。

我想讓它向您拖動的方向滾動,當您移動到邊緣時項目變快,並且在將項目移回屏幕的垂直中心時速度變慢。

當然,這種功能應該在任何拖放中都是標準的?

無論如何,有沒有人知道最好的方法來解決這個問題?

UPDATE: 我不能真正發現,即使試圖用拖電網項目滾動在互聯網上只舉一個例子更別說解決我的問題(我在這裏失去了一些東西?)。

如何獲得可拖動的項目(顯示爲陰影)來滾動gridview?我分配的阻力如下:

int gridChildPosition = position - mGridView.getFirstVisiblePosition();      
ViewFlipper gridItem = (ViewFlipper) mGridView.getChildAt(gridChildPosition); 

ClipData data = ClipData.newPlainText("", ""); 
DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(gridItem); 

if (mGridView.startDrag(data, shadowBuilder, gridItem, 0)) { 

    int lastVisiblePosition = mGridView.getLastVisiblePosition() - mGridView.getFirstVisiblePosition(); 
    for (int i=0; i<=lastVisiblePosition; i++) { 
     if (i == gridChildPosition) { 
      continue; 
     } 
     mGridView.getChildAt(i).setOnDragListener(new GridItemDragListener(position)); 
     mGridView.getChildAt(i).setAlpha(0.4f); 
    } 
} 

上面的代碼創建了可拖動的陰影和所有其他項目,目前得到變暗。但我不確定如何讓陰影滾動gridview。

+0

退房答案在這裏:http://stackoverflow.com/questions/12236035/android如何自動滾動一個gridview垂直拖動一個項目的edg rq = 1 – dennisdrew 2013-04-22 22:03:14

+0

@dennisdrew謝謝,已經看到了這一點。沒有關於拖動滾動的解釋。 – HGPB 2013-04-22 22:27:22

+0

您可以查看DragDrop教程http://blahti.wordpress。com/2011/10/03/drag-drop-for-android-gridview /這可能會幫助你。 – GrIsHu 2013-05-02 08:06:34

回答

1

我認爲您需要使用GridView的方法smoothScrollToPosition(int position)smoothScrollByOffset(int offset)。在屏幕的頂部和底部取兩個矩形。如果觸摸事件在拖動時接收到這些矩形,則請滾動GridView。您可以使用getLastVisiblePosition()方法在任何給定時間獲取最後一個可見位置。

7

關於拖動事件很酷的事情是,你可以在父母的ViewGroup也可以聽他們。擴展GridView,並覆蓋onDragEvent以監視DragEvent.ACTION_DRAG_LOCATION。在那裏,獲取拖動的Y座標(event.getY())。請務必從ACTION_DRAG_STARTED返回true,否則您將不會收到ACTION_DRAG_LOCATION中的活動。

確定您的「點擊框」,或許使用jaibatrik suggests的技術,或者只是使用GridView的測量高度的百分比。

這可能是最有意義的使用smoothScrollByOffset(int offset),這樣你可以實現階梯/指數滾動。意思是說,用戶在拖動項目的時間越長,偏移量就越大。

聽起來像是一個開源的庫/組件的一個很酷的想法。 ;-)

編輯:

這裏是你如何能做到這一點的例子:

import android.app.Activity; 
import android.content.ClipData; 
import android.content.ClipData.Item; 
import android.content.Context; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.DragEvent; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemLongClickListener; 
import android.widget.ArrayAdapter; 
import android.widget.GridView; 

public class GridDragActivity extends Activity implements OnItemLongClickListener { 

    private static final String TAG = "GridDragActivity"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     MyGridView gridView = new MyGridView(this); 
     gridView.setNumColumns(3); 
     gridView.setOnItemLongClickListener(this); 
     gridView.setAdapter(new ArrayAdapter<String>(
       this, 
       android.R.layout.simple_list_item_1, 
       COUNTRIES)); 

     setContentView(gridView); 
    } 

    @Override 
    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, 
      long id) { 

     ClipData data = ClipData.newPlainText((String) view.getTag(), 
       String.valueOf(position)); 
     View.DragShadowBuilder shadow = new View.DragShadowBuilder(view); 
     view.startDrag(data, shadow, null, 0); 

     return true; 
    } 

    class MyGridView extends GridView { 

     private static final int THRESHHOLD = 200; 
     private static final int OFFSET = 10; 

     public MyGridView(Context context) { 
      super(context); 
     } 

     @Override 
     public boolean onDragEvent(DragEvent event) { 

      int height = getMeasuredHeight(); 

      switch (event.getAction()) { 
       case DragEvent.ACTION_DRAG_STARTED: 
        return true; 

       case DragEvent.ACTION_DRAG_LOCATION: 

        float y = event.getY(); 
        if (height - y < THRESHHOLD) { 
         smoothScrollByOffset(OFFSET); 
        } else if (height - y > height - THRESHHOLD) { 
         smoothScrollByOffset(-OFFSET); 
        } 

        return true; 

       case DragEvent.ACTION_DROP: 

        ClipData data = event.getClipData(); 
        Item item = data.getItemAt(0); 
        int start = Integer.valueOf((String) item.getText()); 
        int end = pointToPosition((int) event.getX(), (int) event.getY()); 

        Log.i(TAG, "DROP started at = " + start + ", ended at = " + end); 

        return true; 
      } 

      return super.onDragEvent(event); 
     } 
    } 

    static final String[] COUNTRIES = new String[] { 
     "Afghanistan", "Albania", "Algeria", "American Samoa", "Andorra", 
     "Angola", "Anguilla", "Antarctica", "Antigua and Barbuda", "Argentina", 
     "Armenia", "Aruba", "Australia", "Austria", "Azerbaijan", 
     "Bahrain", "Bangladesh", "Barbados", "Belarus", "Belgium", 
     "Belize", "Benin", "Bermuda", "Bhutan", "Bolivia", 
     "Bosnia and Herzegovina", "Botswana", "Bouvet Island", "Brazil", 
     "British Indian Ocean Territory", 
     "British Virgin Islands", "Brunei", "Bulgaria", "Burkina Faso", "Burundi", 
     "Cote d'Ivoire", "Cambodia", "Cameroon", "Canada", "Cape Verde", 
     "Cayman Islands", "Central African Republic", "Chad", "Chile", "China", 
     "Christmas Island", "Cocos (Keeling) Islands", "Colombia", "Comoros", "Congo", 
     "Cook Islands", "Costa Rica", "Croatia", "Cuba", "Cyprus", "Czech Republic", 
     "Democratic Republic of the Congo", "Denmark", "Djibouti", "Dominica", 
     "Dominican Republic", 
     "East Timor", "Ecuador", "Egypt", "El Salvador", "Equatorial Guinea", "Eritrea", 
     "Estonia", "Ethiopia", "Faeroe Islands", "Falkland Islands", "Fiji", "Finland", 
     "Former Yugoslav Republic of Macedonia", "France", "French Guiana", "French Polynesia", 
     "French Southern Territories", "Gabon", "Georgia", "Germany", "Ghana", "Gibraltar", 
     "Greece", "Greenland", "Grenada", "Guadeloupe", "Guam", "Guatemala", "Guinea", 
     "Guinea-Bissau", 
     "Guyana", "Haiti", "Heard Island and McDonald Islands", "Honduras", "Hong Kong", 
     "Hungary" 
    }; 
} 
+0

我會玩你的建議。 – HGPB 2013-05-03 15:26:54

+0

@Haraldo請參閱最新答案中的示例代碼。 :-) – 2013-05-03 16:21:31

+0

謝謝你,我需要一些時間來看看這個,因爲我被轉移。不過,如果這個解決方案有幫助,我仍然會兌現獎金。 – HGPB 2013-05-03 19:39:32