1

タッチを使用して、画面上のアイテム (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);
            }           

しかし、何も変わりませんでした。

更新: このコードで試しました。|レイアウトの位置要素の更新に問題はありません。タッチでオブジェクトを移動するプロセスを除いて、すべてが正常に機能します。この方法で気に入らないこと:

  • 触れたものを動かすと振動する(見栄えが悪い)
  • 座標をスケーリングする必要がある場所のように、オブジェクトが指に完全に追従しません (たとえば、オブジェクトを画面の右側から左側に移動し、指が画面の端で停止すると、オブジェクトは遅れます)。

この 2 つのことにより、この方法は役に立たなくなります。

@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());
   }   

オブジェクトをランダムな位置に配置しました (彼がこの位置をどこから取ったかはわかりません)。

編集済み

このコードはほぼ完全に、ビュー上で繰り返し移動することができました。2 つの欠点があります。

  • Moveジェスチャ終了後の小さな再割り当て
  • ビューの移動中に画面上で指を止めると、古い位置でビューが点滅するのがわかります。

コード

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;
               }        
    };

誰かがそれを改善する方法を知っていたら、答えを残してください

4

2 に答える 2

0

アニメーションに問題がある可能性があります。ViewAnimation を使用している場合は、オブジェクト アニメーターでその変更を使用してみてください。フォーム API 11 をサポートします。

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

于 2013-11-26T11:31:33.017 に答える
0

同様の問題があり(触れたオブジェクトが移動時に振動する)、 and の代わりに and を使用して解決getRawX()getRawY()ましgetX()getY()

于 2015-10-23T20:25:37.147 に答える