сохранить событие ontouch при удалении представления и добавить

У меня есть представление в linearlayout. При длительном нажатии вид будет удален из этого linearlayout и помещен в ту же позицию экрана в относительный макет. Таким образом, я могу перемещать изображение по экрану пальцем.

это почти работает: у меня работает событие longpress (удалить представление и поместить представление в относительный макет). после этого я добавляю онтоучевентлистенер, чтобы мой взгляд оставался с моим пальцем, но только на секунду. в последний раз, когда было запущено touchevent, я получил «MotionEvent.ACTION_CANCEL». Когда я убираю палец и снова помещаю палец в поле зрения, я могу двигаться, пока я не уберу палец.

Я думаю, что моя проблема в том, что представление было удалено на короткое время, в это время я получаю "MotionEvent.ACTION_CANCEL", однако есть еще некоторые необработанные события, они будут запущены первыми. Вот почему я получил около 1 секунды все еще ontouchevents. (это просто мысль).

кто-нибудь знает, как я могу сохранить ontouchevent или позволить онтоучевенту сработать, не заменяя палец?

Отредактировано

Моя мысль неверна. Когда я делаю долгое нажатие, вид остается с моим пальцем, однако я теряю вид, как только перемещаюсь примерно на 50–100 пикселей в любом направлении.

Отредактировано 2

код длинного нажатия представления внутри linearlayout

view.setOnLongClickListener(new OnLongClickListener() {
    public boolean onLongClick(View v) {
        _linearLayout.removeView(v);
        moveView(v);
        return true;
    }
});

moveView будет вызываться длительным нажатием

private void moveView(View v) {
        _relativeLayout.addView(v);
        v.setOnTouchListener(new OnTouchListener() {
            public boolean onTouch(View v, MotionEvent event) {
                switch(event.getAction()) {
                case MotionEvent.ACTION_MOVE:
                    int x = (int) event.getRawX();
                    int y = (int) event.getRawY();                          
                    v.layout(x, y, x + v.getWidth(), y + v.getHeight());
                    break;
                case MotionEvent.ACTION_UP:
                    _relativeLayout.removeView(v);
                    v = null;
                    break;
                case MotionEvent.ACTION_CANCEL:
                    //it comes here when i move my finger more then 100 pixels
                    break;
                }
                return true;
            }
        });
    }

конечно, это соответствующая часть кода, а не исходный код


person Doomic    schedule 14.12.2011    source источник
comment
Похоже, лучшим дизайном было бы не переключать макеты, а попытаться заставить их оба работать в RelativeLayout.   -  person rogermushroom    schedule 14.12.2011
comment
правда, не могу прямо сказать, возможно ли это, из-за боковой прокрутки, прокрутки вверх и вниз и других сложных взаимодействий на экране ... но, возможно, вы правы.   -  person Doomic    schedule 14.12.2011
comment
а это невозможно. Представление находится внутри контейнера прокрутки. но как только я смогу переместить представление, представление также должно выйти из этого контейнера прокрутки в другие части экрана.   -  person Doomic    schedule 14.12.2011
comment
Итак, вы заменяете весь вид или у вас есть LinearLayout, который полностью заменяется RelativeLayout   -  person rogermushroom    schedule 14.12.2011
comment
Не могли бы вы вставить код слушателя?   -  person rogermushroom    schedule 14.12.2011
comment
linearlayout находится (в прокрутке) на относительном макете. Я удаляю вид из linearlayout и помещаю тот же вид в относительный макет.   -  person Doomic    schedule 14.12.2011


Ответы (2)


Ознакомьтесь с опытом перетаскивания Android Список сообщений. Существует также исходный код, делает что-то очень похожее на то, что вы пытаетесь получить. Эрик, автор этого поста, использует отдельный временный ImageView для хранения перетаскиваемого изображения, снятого с помощью getDrawingCache(). Он также скрывает исходный элемент списка с помощью setVisibility(View.INVISIBLE).

В проекте DragNDrop (ссылка выше) вы можете заменить вызовы drag(0,y) на drag(x,y) в DragNDrop.java, чтобы увидеть перетаскивание во всех направлениях.

person praetorian droid    schedule 14.12.2011
comment
Я вижу, у этого Эрика на контейнере есть touchevent, и с помощью x и y он находит представление, которое нужно переместить. может поможет.. завтра проверю - person Doomic; 14.12.2011
comment
у меня работает. у меня есть класс, который расширяет относительный макет и переопределяет событие onintercepttouchevent. в этой функции он проверит, имеет ли linearlayout представление об этой позиции (x и y). Если нет, потеряйте перехват, в противном случае сохраните и проверьте, не сместятся ли x и y в следующие 50 циклов слишком далеко. Через 50 циклов возьмите во владение touchevent и удалите вид из linearlayout и поместите его в относительный макет. Продолжайте перерисовывать вид, пока касаетесь относительного макета. Так что спасибо тебе - person Doomic; 15.12.2011

Просто добавляю некоторые возможности, потому что я не вижу код, но MotionEvent.ACTION_CANCEL может вызываться при переключении родительского макета и перерисовке представления.

Вы можете попробовать переопределить onTouchEvent, а в момент отправки события ACTION_CANCEL попытаться получить эквивалентное представление в новом макете и работать с ним, но я все же думаю, что лучше перепроектировать, чтобы все это происходило в одном и том же макете.

person rogermushroom    schedule 14.12.2011
comment
это то, что я хочу, но не могу заставить это работать... однако... идея преторианского дроида может мне помочь. - person Doomic; 14.12.2011