【问题标题】:keep ontouch event when view is removed and add删除并添加视图时保持 ontouch 事件
【发布时间】:2012-01-20 07:30:46
【问题描述】:

我有一个线性布局的视图。当视图被长按时,视图将从这个线性布局中移除,并放置在屏幕的相同位置,以相对布局。这样,我的手指就可以在屏幕上移动视图。

它几乎可以工作: 我得到了长按事件工作(删除视图并将视图放置到相对布局)。之后我添加了一个 ontoucheventlistener,这样我的视图就停留在我的手指上,但只有一秒钟。上次触发触摸事件时,我得到了“MotionEvent.ACTION_CANCEL”。当我移开手指并再次将手指放在视图上时,我可以随着我的运动进入功能,然后它会一直保持到我移开手指为止。

我认为我的问题是它删除了一小会的视图,当时我得到一个“MotionEvent.ACTION_CANCEL”,但是,仍然有一些未处理的事件,它们将首先被触发。这就是为什么我有大约 1 秒钟仍然 ontouchevents。 (这只是一个想法)。

有人知道我如何保持 ontouchevent,或者让 ontouchevent 在不更换手指的情况下触发?

已编辑

我的想法不正确。当我长按时,视图会停留在我的手指上,但是一旦我向任何方向移动大约 50 到 100 像素,我就会失去视图。

已编辑 2

线性布局内视图的长按代码

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

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

【问题讨论】:

  • 听起来更好的设计是不切换布局,而是尝试让它们都在RelativeLayout中工作
  • 是的,不能直接说这是否可行,因为屏幕上的横向和向上滚动以及其他复杂的交互......但也许你是对的。
  • 这是不可能的。该视图位于滚动容器内。但是一旦我可以移动视图,视图也必须从这个滚动容器中移出到屏幕的其他部分。
  • 所以你替换了整个视图,或者你有一个 LinearLayout 被一个 RelativeLayout 完全替换
  • 可以粘贴监听代码吗?

标签: android touch-event ontouchlistener


【解决方案1】:

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

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

【讨论】:

  • 我明白了,这个 eric 在容器上有一个 touchevent,通过 x 和 y 他找到了应该移动的视图。也许它可以帮助..我明天会检查
  • 我有它的工作。我有一个扩展相对布局并覆盖 onintercepttouchevent 的类。在该函数中,它将检查线性布局是否具有该位置(x 和 y)的视图。如果不是,则失去拦截,否则,保持并检查在接下来的 50 个循环中 x 和 y 是否不会移动到很远。 50 个周期后,获得 touchevent 的所有权并从线性布局中删除视图并将其放置到相对布局中。在触摸相对布局时继续重绘视图。所以谢谢你
【解决方案2】:

只是抛出一些可能性,因为我看不到代码,但MotionEvent.ACTION_CANCEL 可能会被调用,因为父布局被切换并且视图正在重绘。

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

【讨论】:

  • 这是我想要的,但无法让它工作......但是.. praetorian droid 的想法可能会帮助我。
猜你喜欢
  • 1970-01-01
  • 2011-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多