OnTouchListener для элементов GridView - PullRequest
0 голосов
/ 11 февраля 2012

Я пытаюсь разработать вид приложений.Я использую gridview с адаптером для рисования иконок.Я хотел бы реализовать Drap & Drop для них, поэтому я написал ontouchlistener, который отлично работает на других элементах, но имеет некоторые проблемы с иконкой в ​​виде сетки ...

Когда я долго нажимаю на иконку, я могуперетащите его горизонтально, но только для некоторого пикселя по вертикали, чем MotionEvent.ACTION_CANCEL, чем событие motionement, перетаскивание прекращается и вид сетки начинает прокручиваться.Как я могу избежать этого?Я попытался gridview.setEnable (false), чтобы отключить просмотр сетки, но перетаскивание, как и раньше, прекращается.

Может кто-нибудь мне помочь?Вот код, если он может помочь ...

    @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 Ответ

1 голос
/ 26 марта 2012

Вы должны попытаться вызвать requestDisallowInterceptTouchEvent () для родителя представления во время каждого MotionEvent.ACTION_DOWN или MotionEvent.ACTION_MOVE.

Этот код был извлечен из 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);
    }
}
...