繁体   English   中英

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

[英]Update the position of textview/imageview at relative layout after moving it by touch

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

如果有人知道如何改进它,请留下答案

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

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

我有一个类似的问题(触摸对象在移动时振动)并通过使用getRawX()getRawY()而不是getX()getY()解决了它

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM