我已经创建了我自己的扩展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;
答案 0 :(得分:2)
答案 1 :(得分:2)
如果它是简单的指针,您可以Canvas
作为Drawable
绘制它:
@Override
protected void onDraw(Canvas canvas) {
pointer.setBounds(marginX, marginY, marginX + pointerWidth, marginY + pointerHeight);
pointer.draw(canvas);
super.onDraw(canvas);
}
然后在invalidate()
方法中的指针上调用onTouchEvent()
。