1

我希望有可能通过使用触摸来更改屏幕上项目(文本视图/图像视图)的位置。所以我做了 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

4

2 回答 2

0

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

ObjectAnimator.ofFloat(view,"翻译",x,y,toX,toY);

于 2013-11-26T11:31:33.017 回答
0

我有一个类似的问题(被触摸的物体在移动时振动)并通过使用getRawX()andgetRawY()而不是getX()and来解决它getY()

于 2015-10-23T20:25:37.147 回答