web-dev-qa-db-ja.com

ObjectAnimatorのtranslationX / Y値の決定。ビューを正確な画面位置に移動する方法は?

ObjectAnimator.ofFloat(...)を使用して、ビューを画面の右上隅に移動しようとしていますが、期待した結果が得られません。 ViewTreeListenerなどを使用して、ビューの座標を事前に取得しており、幅全体の端からオフセットする必要があるx値をすでに知っています。どちらの次元も目的の場所に移動できません。関連コード:

開始座標を取得します。現在のビューは次のとおりです。

_int[] userCoords = new int[]{0,0};
userControlLayout.getLocationInWindow(userCoords);
//also tried getLocationInScreen(userCoords); same result
userUpLeft = userCoords[0];
userUpTop = userCoords[1];
_

驚いたことに、userControlLayout.getLeft()を呼び出すと、userUpLeft(画面座標にあり、親に対してではない)と同じ値が得られます。ドキュメントを理解しているため、これらは異なると思います。とにかく...

ObjectAnimatorsの構築:

_//testXTranslate is a magic number of 390 that works; arrived at by trial. no idea why that 
// value puts the view where I want it; can't find any correlation between the dimension 
// and measurements I've got
ObjectAnimator translateX = ObjectAnimator.ofFloat(userControlLayout, "translationX",
                                                                  testXTranslate);

//again, using another magic number of -410f puts me at the Y I want, but again, no idea //why; currently trying the two argument call, which I understand is from...to
//if userUpTop was derived using screen coordinates, then isn't it logical to assume that -//userUpTop would result in moving to Y 0, which is what I want? Doesn't happen
ObjectAnimator translateY = ObjectAnimator.ofFloat(userControlLayout, "translationY",
                                                                  userUpTop, -(userUpTop));
_

私の理解では、1つの引数の呼び出しは、変換/移動する終了座標を指定することと同等であり、2つの引数のバージョンは、開始時、終了時、または終了時からです。両方とそこに到達することはできません。

明らかに、私は非常に基本的な知識を欠いており、それが正確に何であるかを理解しようとしています。どんなガイダンスも大歓迎です。ありがとう。

6
wkhatch

まず、userControlLayout.getLeft()は親ビューに関連しています。この親が画面の左端に配置されている場合、これらの値は一致します。 getTop()の場合、getLocationInWindow()absolute座標を返すという理由だけで、一般的に異なります。つまり、y = 0はウィンドウの左上、つまり、アクションバー。

通常、コントロールをその親を基準にして変換する必要があります(これらの境界の外に移動しても、コントロールは描画されないため)。したがって、コントロールを(targetX, targetY)に配置する場合は、次を使用する必要があります。

int deltaX = targetX - button.getLeft();
int deltaY = targetY - button.getTop();

ObjectAnimator translateX = ObjectAnimator.ofFloat(button, "translationX", deltaX);
ObjectAnimator translateY = ObjectAnimator.ofFloat(button, "translationY", deltaY);

ObjectAnimatorに複数の値を指定すると、アニメーションの中間値を示します。したがって、あなたの場合、userUpTop, -userUpTopにより、翻訳が最初にダウンし、次にアップします。平行移動(および回転と他のすべての変換)は常に元の位置を基準にしていることに注意してください。

16
matiash