通过触摸移动后,以相对布局更新textview / imageview的位置

时间:2013-10-23 11:40:26

标签: android layout touch motion

我希望有可能通过触摸更改屏幕上的项目(textviews / imageview)的位置。所以我制作了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;
    }

}

动画方法中oobject的移动看起来很棒,一切都很流畅。当我添加像这样的代码

时,只有问题与更新布局有关
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

2 个答案:

答案 0 :(得分:0)

它可能是动画问题,你正在使用ViewAnimation尝试使用Object animator中的更改。它支持表单API 11。

ObjectAnimator.ofFloat(视图, “翻译”,X,Y,TOX,玩具);

答案 1 :(得分:0)

我遇到了类似的问题(被触摸的物体在移动时振动)并使用getRawX()getRawY()代替getX()getY()

来解决它