删除视图并添加时保持ontouch事件

时间:2011-12-14 14:16:54

标签: android ontouchevent ontouchlistener

我在线性布局中有一个视图。当视图被长按时,视图将从该线性布局中移除,并且在屏幕的相同位置放置到相对布局。通过这种方式,我可以用手指在屏幕上移动视图。

它几乎可以工作: 我让longpress事件工作(删除视图并将视图放到relativelayout)。之后,我添加了一个ontoucheventlistener,所以我的视图保持在我的手指,,但只有一秒。触发器最后一次被解雇后,我得到了“MotionEvent.ACTION_CANCEL”。当我移开我的手指并再次将手指放在视图上时,我可以使用我的动作进行观察,然后它将一直保持到我移开手指为止。

我认为我的问题是它在短时间内删除的视图,当时我得到一个“MotionEvent.ACTION_CANCEL”,但是,仍然有一些未处理的事件,它们将首先被触发。这就是为什么我还有大约1秒的时间才能完成任务。 (这只是一个想法)。

有人想知道我怎样才能保持上瘾,或者在没有替换我的手指的情况下开启上瘾?

被修改

我的想法不正确。当我做长按时,视图会保持在我的手指上,但是当我向任何方向移动大约50到100个像素时,我就会丢失视图。

已编辑2

linearlayout内部视图的longpress代码

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

,这是代码的相关部分,而不是原始代码

2 个答案:

答案 0 :(得分:0)

只是抛出一些可能性,因为我无法看到代码,但可以调用MotionEvent.ACTION_CANCEL,因为父布局已切换,视图正在重新绘制。

您可以尝试覆盖onTouchEvent并在发送ACTION_CANCEL事件时尝试在新布局中获取等效视图并对其进行操作但我仍然认为更好的想法是重新设计所有这一切以相同的布局进行。

答案 1 :(得分:0)

查看Experience - Android Drag and Drop List帖子。还有a source code与你想要获得的东西非常相似。该帖子的作者Eric使用单独的临时ImageView来保存使用getDrawingCache()拍摄的拖动视图图像。他还隐藏了setVisibility(View.INVISIBLE)的原始列表项。

在DragNDrop项目(上面的链接)中,您可以在DragNDrop.java中用drag(0,y)替换drag(x,y)次调用,以查看所有方向的拖动。