2016-10-20 14 views
1

私は画面上に2つの画像を持ち、それぞれを個別に動かすことができるリスナーを持っています。さらに、それらの1つは回転することができます。回転した画像を移動するときの数学の複雑さ

異なる設定を選択すると、ユーザーは両方の画像を同時に移動できます。このリスナーは、画像を個別に移動するときに効果的ですが、ユーザーが両方の画像を同時に移動すると、回転した画像は、ユーザーが指を動かしている方向ではなく、傾いた軸に沿って移動します。

たとえば、画像を90度回転させてユーザーが指を動かすと、画像は右に移動します。私はトリグを試してみましたが、回転した画像だけが選択されていると正しく動作する理由は説明しません。

onTouch():

case MotionEvent.ACTION_DOWN: { 
      mPrevX = event.getX(); 
      mPrevY = event.getY(); 

      // Save the ID of this pointer. 
      mActivePointerId = event.getPointerId(0); 
      break; 
     } 

case MotionEvent.ACTION_MOVE: { 
      // Find the index of the active pointer and fetch its position. 
      int pointerIndex = event.findPointerIndex(mActivePointerId); 
      if (pointerIndex != -1) { 
       float currX = event.getX(pointerIndex); 
       float currY = event.getY(pointerIndex); 

       // Only move if the ScaleGestureDetector isn't processing a 
       // gesture. 
       if (!mScaleGestureDetector.isInProgress()) { 
        if(!expandSelection){ 
         adjustTranslation(view, currX - mPrevX, currY - mPrevY); 
        } else { 
         for(int i = 0; i < viewArr.length; i++){        
           adjustTranslation(viewArr[i], currX - mPrevX, currY - mPrevY); 
          } 
         } 
        } 
       } 
      } 

      break; 
     } 

adjustTranslation():私はまだ、スケールファクタのためのいくつかの調整を行う必要があるが、以下、私がこれまでに保存するかもしれませんしたコードである

private static void adjustTranslation(View view, float deltaX, float deltaY) { 
    float[] deltaVector = {deltaX, deltaY}; 
    view.getMatrix().mapVectors(deltaVector); 

    view.setTranslationX((view.getTranslationX() + deltaVector[0])); 
    view.setTranslationY((view.getTranslationY() + deltaVector[1])); 
} 
+0

)(mapVectorsのではなく、()mapPointsを試してみてください。翻訳を含めて2回狂ってしまうかもしれませんが。マッピングが何もしていなければ、それは必要なものを正確に行います。 – Tatarize

答えて

0

あなたが何か似たようなことに出くわしたら、いくつかの頭痛。最初は本当に私を捨てた方程式の兆候でした。

float cos = (float) Math.cos(Math.toRadians(viewArr[i].getRotation())); 
float sin = (float) Math.sin(Math.toRadians(viewArr[i].getRotation())); 

adjustTranslation(viewArr[i], (currX - mPrevX) * cos + (currY - mPrevY) * sin, (currY - mPrevY) * cos - (currX - mPrevX) * sin); 

編集

:ここ は(私は歪んだ画像のためにこれをテストしていない)規模を占めコードです:

関連する問題