我已经创建了自己的扩展组件RelativeLayout
,在其中我有一个View
类型的字段,该字段被定位为边距:
蓝色四边形代表我的父视图,红色圆圈是子视图。
现在我想允许用户在屏幕上移动手指时移动这个红色圆圈。这是我的onTouchEvent()
方法:
@Override
public boolean onTouchEvent(MotionEvent event) {
int eventAction = event.getAction();
switch (eventAction) {
case MotionEvent.ACTION_DOWN:
// finger touches the screen
break;
case MotionEvent.ACTION_MOVE:
marginX = (int)event.getX();
marginY = (int)event.getY();
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)pointer.getLayoutParams(); // pointer is this red circle
lp.setMargins(marginX, marginY, 0, 0);
break;
case MotionEvent.ACTION_UP:
// finger leaves the screen
break;
}
return true;
}
但我很快发现,当用户在屏幕上移动手指时它不会刷新它的位置,而是只有当用户从屏幕上松开手指时才会刷新。所以基本上,当我移动我的手指时,圆圈保持在相同的位置,但是当我停止移动时,圆圈被绘制在新的位置。我尝试invalidate()
在父视图和子视图上都使用方法,但没有帮助。我认为它可能与 UI 线程有关,但我无权访问runOnUiThread()' method as it's not an
Activity`。
编辑:我将一项活动传递给我的班级,以便我可以使用runOnUiThread()
. 我case: ACTION_MOVE
现在看起来像这样:
case MotionEvent.ACTION_MOVE:
marginX = (int)event.getX();
marginY = (int)event.getY();
activity.runOnUiThread(new Runnable() {
public void run() {
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams)pointer.getLayoutParams();
lp.setMargins(marginX, marginY, 0, 0);
pointer.invalidate();
}
});
break;