GridView元素上的OnTouchListener

时间:2012-02-11 16:49:19

标签: android gridview ontouchlistener

我正在尝试开发一种应用程序抽屉。我使用带适配器的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;
    }

1 个答案:

答案 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);
    }
}