【发布时间】: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