ドラッグイベントのクールなことは、親の中でそれらを聞くことですViewGroup
too。 GridView
を拡張し、onDragEvent
をオーバーライドしてDragEvent.ACTION_DRAG_LOCATION
を監視します。そこに、ドラッグのY座標(event.getY()
)を取得します。 ACTION_DRAG_STARTED
から真を返すか、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を-to-to-auto-scroll-a-gridview-vertical-on-drag-item-to-the-edg?rq = 1 – dennisdrew
@dennisdrewありがとう、すでにこれを見ました。オンドラッグスクロールの説明はありません。 – HGPB
DragDropチュートリアルhttp://blahti.wordpressをご覧ください。com/2011/10/03/android-gridview/for drag-drop-forはあなたを助けるかもしれません。 – GrIsHu