關於拖動事件很酷的事情是,你可以在父母的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"
};
}
退房答案在這裏:http://stackoverflow.com/questions/12236035/android如何自動滾動一個gridview垂直拖動一個項目的edg rq = 1 – dennisdrew 2013-04-22 22:03:14
@dennisdrew謝謝,已經看到了這一點。沒有關於拖動滾動的解釋。 – HGPB 2013-04-22 22:27:22
您可以查看DragDrop教程http://blahti.wordpress。com/2011/10/03/drag-drop-for-android-gridview /這可能會幫助你。 – GrIsHu 2013-05-02 08:06:34