是否可以在 android 中创建一个未固定到特定位置的列表视图,并且用户可以在手势上移动列表视图一些可以在屏幕上任何位置移动的浮动列表视图?我尝试找到它但找不到一些链接。有人对此有所了解吗?
4 回答
我会使用布局中的边距移动列表视图。
大纲:
- 覆盖 OnTouch,并基于
event.getX()
andevent.getY()
,更新 listview 的边距如下:
如果父级是相对布局:
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)mListView.getLayoutParams();
lp.leftMargin = event.getX();
lp.topMargin = event.getY();
mListView.setLayoutParams(lp);
将 dispatchTouchEvent 添加到您的活动中,以便将来自列表视图的事件传递给 onTouch:
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
onTouchEvent(ev);
return super.dispatchTouchEvent(ev);
}
希望这可以帮助。
您可以通过在列表视图上设置 OnTouchListener 并覆盖它的 onTouch() 方法来实现此目的。在 onTouch() 方法中,您必须处理触摸事件,例如 (ACTION_DOWN, ACTION_MOVE)。以下是处理触摸事件的方法:
@Override
public boolean onTouch (View v, MotionEvent event)
{
switch(event.getAction() & MotionEvent.ACTION_MASK)
{
case MotionEvent.ACTION_DOWN:
start.set(event.getX(), event.getY()); //saving the initial x and y position
mode = DRAG;
break;
case MotionEvent.ACTION_MOVE:
if(mode == DRAG) {
float scrollByX = event.getX() - start.x; //computing the scroll in X
float scrollByY = event.getY() - start.y; //computing the scroll in Y
v.scrollBy((int)scrollByX/20, 0);
}
break;
}
return false;
}
当用户将手指放在屏幕上时,触发 ACTION_DOWN 事件;当用户在屏幕上拖动手指时,触发 ACTION_MOVE 事件。因此,拖动事件是 ACTION_DOWN 和 ACTION_MOVE 的组合。
一旦有了 scrollX 和 scrollY 值,您就可以通过将这些值传递给 View 类的 scrollBy() 方法来在屏幕上移动视图。
在代码中,有两点需要注意:
- 首先是我将 0 作为 scrollY 的值传递,因为它会阻止列表视图同时被拖动和滚动。
- 第二个是返回值为 false,因为您希望 android 处理列表项的滚动
虽然很难维护,但AbsoluteLayout允许您在 (x,y) 坐标中指定位置。您只需在 AbsoluteLayout 中声明您的 ListView,在 java 代码中获取它的句柄,您可以在其中拦截点击,然后设置新坐标。
在 Android 框架中,“floating”这个词通常是 new 的同义词Window
(例如 a Dialog
)。这在某种程度上取决于您的最终目标是什么,但是如果您想创建一个ListView
浮动在层次结构中的其余内容上的 a ,您可以轻松隐藏和显示,您可能应该考虑将该视图包装在 aPopupWindow
中,它有方法让您可以轻松地使用 和 显示窗口,showAsDropdown()
并shotAtLocation()
在可见时移动它update()
。
Spinner
这就是较新版本的 SDK 为和创建弹出列表的方式Menu