我希望有可能通过使用触摸来更改屏幕上项目(文本视图/图像视图)的位置。所以我做了 OnTouchListener 看起来像这样:
float x = 0,y = 0 ;
private void clickOnObjectTaker() {
cream.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event) {
boolean touched= false;
if(event.getAction()==MotionEvent.ACTION_DOWN)
{
messageMaker("touched");
x= event.getX();
y= event.getY();
}
if(event.getAction()==MotionEvent.ACTION_MOVE )
{
Animation anim =
new TranslateAnimation(x, event.getX(), y, event.getY());
anim.setFillAfter(true);
anim.setFillEnabled(true);
cream.startAnimation(anim);
x= event.getX();
y= event.getY();
}
if(event.getAction()== MotionEvent.ACTION_CANCEL)
{
cream.setX(x);
cream.setY(y);
}
return true;
}});
}
我的问题是,当我改变对象的位置时,听者没有得到新的位置,所以我在屏幕上看到不同位置的对象,但是当我想移动它时,我必须点击旧位置。我想我通过添加以下行来解决它:
if(event.getAction()== MotionEvent.ACTION_CANCEL)
{
cream.setX(x);
cream.setY(y);
}
但没有任何改变。
更新:我尝试使用此代码。那里|我在更新布局的位置元素方面没有任何问题,除了通过触摸移动对象的过程之外一切正常。我不喜欢这种方法:
- 当我移动它时触摸的物体会振动(它看起来不太好),
- 对象没有完全跟随我的手指,就像我应该缩放坐标的某个地方(例如,我将对象从屏幕的右侧移动到左侧,当我的手指停在屏幕边缘时,对象落后于它。)
这两件事使这种方法对我来说毫无用处。
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction()== MotionEvent.ACTION_DOWN){
dx = event.getX()-v.getX();
dy = event.getY()-v.getY();
}
if(event.getAction()== MotionEvent.ACTION_MOVE)
{
v.setX(event.getX()-dx);
v.setY(event.getY()-dy);
}
return true;
}
}
用动画方法移动物体对我来说看起来很棒,一切都很流畅。当我添加这样的代码时,唯一的问题与更新布局有关
if(event.getAction()==MotionEvent.ACTION_UP )
{
v.setX(event.getX());
v.setY(event.getY());
}
它将物体放在随机位置(我不知道他从哪个位置占据了这个位置),如果有人能给我任何建议,我将不胜感激
已编辑
这段代码几乎完美,我可以在视图中反复移动。它有两个缺陷:
- 移动手势结束后的小重新分配
- 在移动视图的过程中,如果我将手指停在屏幕上,我可以看到旧位置的视图闪烁。
编码
OnTouchListener dealingwithproblems = new OnTouchListener()
{
@Override
public boolean onTouch( View v, MotionEvent event) {
if(event.getActionMasked()== MotionEvent.ACTION_DOWN){
//values for
dx = event.getX()-v.getX();
dy = event.getY()-v.getY();
x= event.getX();
y= event.getY();
}
if(event.getActionMasked()== MotionEvent.ACTION_MOVE)
{
Animation anim =
new TranslateAnimation(x, event.getX() , y, event.getY());
//anim.setFillAfter(true);
anim.setFillEnabled(true);
v.startAnimation(anim);
x= event.getX();
y= event.getY();
}
if(event.getActionMasked() == MotionEvent.ACTION_UP)
{
v.setX(event.getX()-dx);
v.setY(event.getY()-dy);
}
return true;
}
};
如果有人知道如何改进它,请留下答案 pliz