сохранить событие ontouch при удалении вида и добавить - PullRequest
3 голосов
/ 14 декабря 2011

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

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

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

кто-то знает, как я могу сохранить атташевент или позволить ему активировать, не заменяя мой палец?

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

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

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

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

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

moveView будет вызываться longpress

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

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

Ответы [ 2 ]

0 голосов
/ 14 декабря 2011

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

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

0 голосов
/ 14 декабря 2011

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

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

...