我正在尝试开发一种应用程序抽屉。我使用带适配器的gridview来绘制图标。我想在它们上实现drap& drop,所以我写了一个ontouchlistener,它可以在其他元素上正常工作,但是在gridview中的图标有问题......
当我长按一个图标时,我可以水平拖动它但只有一些像素垂直,而不是运动事件给予MotionEvent.ACTION_CANCEL,拖动停止并且gridview开始滚动。 我怎么能避免呢?我尝试了gridview.setEnable(false),以便使gridview不可滚动,但拖动停止像以前一样..
有人能帮助我吗?这里有一些代码可以帮助...
@Override
public boolean onTouch(View view, MotionEvent me) {
int action = me.getAction();
switch(action){
case MotionEvent.ACTION_DOWN:
status = START_DRAGGING;
params = new RelativeLayout.LayoutParams(dim,dim);
params.leftMargin=(int) me.getRawX()-60;
params.topMargin= (int) me.getRawY()-90;
parenty=bglayout.getHeight();
view.setDrawingCacheEnabled(true);
image.setImageBitmap(view.getDrawingCache());
bglayout.addView(image, params);
grview.setOnItemSelectedListener(null);
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
status = STOP_DRAGGING;
Log.v("Drag", "Stopped Dragging");
bglayout.removeView(image);
break;
case MotionEvent.ACTION_MOVE:
if (status == START_DRAGGING) {
System.out.println("Dragging");
params = new RelativeLayout.LayoutParams(dim,dim);
params.leftMargin= (int) Math.min(me.getRawX()-dim/2, bglayout.getWidth()-dim) ;
params.topMargin= (int) Math.min(me.getRawY()-dim/2, bglayout.getHeight()-dim) ;
Log.v("DRAG", params.leftMargin + " " + params.topMargin);
image.setLayoutParams(params);
image.invalidate();
}
}
return false;
}
答案 0 :(得分:1)
您应该尝试在每个MotionEvent.ACTION_DOWN或MotionEvent.ACTION_MOVE期间在视图的父级上调用requestDisallowInterceptTouchEvent()。
此代码是从android.widget.SeekBar中提取的:
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
attemptClaimDrag();
break;
case MotionEvent.ACTION_MOVE:
attemptClaimDrag();
break;
}
return super.onTouchEvent(event);
}
private void attemptClaimDrag() {
ViewParent parent = getParent();
if (parent != null) {
parent.requestDisallowInterceptTouchEvent(true);
}
}