我有一个带有 TextView 元素的 LinearLayout。每个 TextView 元素都分配有一个处理程序
... new View.OnTouchListener() {
int initialX = 0;
int initialY = 0;
static final int MAX_CLICK_DURATION = 200;
long startClickTime;
@Override
public boolean onTouch(View v, MotionEvent event) {
long clickDuration = Calendar.getInstance().getTimeInMillis() - startClickTime;
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
initialX = (int) event.getX();
initialY = (int) event.getY();
startClickTime = Calendar.getInstance().getTimeInMillis();
break;
case MotionEvent.ACTION_MOVE:
if (clickDuration > MAX_CLICK_DURATION) {
int currentX = (int) event.getX();
int currentY = (int) event.getY();
dcl.setText(String.format(Locale.getDefault(), "(%d,%d)", currentX, currentY));
}
break;
case MotionEvent.ACTION_UP:
if (clickDuration < MAX_CLICK_DURATION) v.performClick();
break;
}
return true;
}
});
理想情况下,当我松开手指时,我打算将开始拖放的元素放在它被拉伸到的元素之前,但现在我只显示坐标,检查监听器的工作。
问题是当手指离开原始元素时,包括移动到另一个 TextView 元素,处理程序停止工作(在这个“预调试”示例中,坐标停止更新),这开始滚动包含此 LinearLayout 元素的 ScrollView .
如何使其在离开原始元素时也可以拖动,并且仅当您将手指从 TextView 元素中捏在 ScrollView 的可用空间上时才进行滚动?即使短按,您也需要保存 TextView 的 OnClick,但我或多或少想通了,这行负责:
if (clickDuration < MAX_CLICK_DURATION) v.performClick();
PS。我知道使用 DragListView 更容易做到这一点,但在这种情况下这是不可能的。TextView所在的LinearLayout是继承在层次结构深处的组件的一部分,您不能将LinearLayout更改为ListView,因为 此层次结构的其他组件将崩溃。
我通过以下方式解决了它:
因此,拖放提供了三个功能:删除元素、移动元素(如果目标不在屏幕上,则可以在拖动时滚动)和插入新元素。这保留了元素的 onClick 和 ScrollView 的滚动。