我创建了自己的组件,它扩展了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); break; case MotionEvent.ACTION_UP: // finger leaves the screen break; } return true; }
但我很快发现,当用户在屏幕上移动手指时,它不会刷新它的位置,而是只有当用户从屏幕上释放他的手指时才会这样做.所以基本上,当我移动我的手指时,圆圈保持在相同的位置,但是当我停止移动时,圆圈被绘制在新的位置.我尝试在父视图和子视图上使用invalidate()方法,但它没有帮助.我假设它可能与UI线程有关,但我无法访问runOnUiThread()’方法,因为它不是aActivity`.
编辑:
我将一个活动传递给了我的班级,以便我可以使用runOnUiThread().我的情况: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,0); pointer.invalidate(); } }); break;
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。