HGP*_*GPB 9 java android drag-and-drop android-gridview
我正在开发api> 14,我已经实现了拖放功能GridView.
但是,在将项目拖动到屏幕的顶部或底部时,GridView不会滚动.
当你移动到边缘时,我想让它向你拖动项目的方向滚动,当你将项目移回屏幕的垂直中心时,它会变慢.
当然,这种功能应该是任何拖放的标准功能吗?
无论如何,有谁知道最好的方法来解决这个问题?
更新:我实际上在互联网上找不到一个例子,甚至试图用拖动的网格项目滚动(我在这里错过了什么?)更不用说解决我的问题了.
你如何获得可拖动的项目(显示为阴影)来滚动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);
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码创建了可拖动的阴影,所有其他项目当前变暗.但我不确定如何让阴影滚动网格视图.
关于拖动事件很酷的事情是,你可以在父听他们ViewGroup 太.扩展GridView并覆盖onDragEvent以监控DragEvent.ACTION_DRAG_LOCATION.在那里,获取event.getY()拖动的Y坐标().确保从中返回true ACTION_DRAG_STARTED,否则您将无法收到该事件ACTION_DRAG_LOCATION.
确定你的"命中框",可能使用jaibatrik建议的技术,或者只使用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"
};
}
Run Code Online (Sandbox Code Playgroud)
我认为你需要使用smoothScrollToPosition(int position)或smoothScrollByOffset(int offset)的方法GridView。在屏幕的顶部和底部取两个矩形。如果在拖动时在这些矩形上接收到触摸事件,则滚动GridView. 您可以使用该方法在任何给定时间获取最后一个可见位置getLastVisiblePosition()。
| 归档时间: |
|
| 查看次数: |
2932 次 |
| 最近记录: |