5

ビューの位置の値を取得する複数の方法を知っています。

getLocationOnScreen()
getLocationInWindow()
getLeft()

ただし、実際には、startAnimation()メソッドで移動したビューの現在の場所を返すものはなく、元の場所のみを返します。

それでは、クリックごとに10ピクセルずつ右に移動するビューを作成しましょう(メインXMLに任意のビューを配置してonClickListenerを指定できるため、レイアウトは省略しています)。

public class AndroidTestActivity extends Activity implements OnClickListener {  
LinearLayout testView;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    testView = (LinearLayout) this.findViewById(R.id.test);
    testView.setOnClickListener(this);
}

public void onClick(View v) {
    int[] pLoS = new int[2];
    testView.getLocationOnScreen(pLoS);
    TranslateAnimation move = new TranslateAnimation(pLoS[0], pLoS[0] + 10, 0f, 0f);
    move.setFillAfter(true);
    move.setFillEnabled(true);
    testView.startAnimation(move);
}

}

ご覧のとおり、getLocationOnScreen()は常に同じ値(私の場合は0)を返し、TranslateAnimationで使用した値を反映していないため、これは意図したとおりに機能しません...

何か案が?

4

3 に答える 3

2

あなたがAndroid<3.0を使用していると仮定すると、あなたの質問は私がここで尋ねた私のものと同じような静脈にあるかもしれません。基本的に、アニメーションはビュー自体とは別のものです。つまり、Androidはビューのコピーをアニメーション化します。そのため、getLocationOnScreen()常に0が返されます。移動(アニメーション化)されたのはビューではなく、移動(アニメーション化)されたコピーでした。私の質問に対する回答が表示された場合、この問題はAndroidの新しいバージョンで解決されています。

于 2012-06-16T15:33:43.343 に答える
2

アニメーション中/アニメーション後にビューが何ピクセルシフトしたかを確認しようとしている場合は、アニメーションでTransformationオブジェクトを開くことができます。

AnimationListenerを使用した例を次に示します。

animation.setAnimationListener(new Animation.AnimationListener() {
        @Override
        public void onAnimationStart(Animation animation) {
        }

        @Override
        public void onAnimationEnd(Animation animation) {
            Transformation trans = new Transformation();
            // startTime + duration = end of animation
            int endTime = animation.getStartTime()+animation.getDuration();
            animation.getTransformation(endTime, trans);

            Matrix transformationMatrix = trans.getMatrix();
            float[] matrixVals = new float[9];
            transformationMatrix.getValues(matrixVals);
            float xTraveled = matrixVals[2];
            float yTraveled = matrixVals[5];
            // do something with them here...
        }

        @Override
        public void onAnimationRepeat(Animation animation) {
        }
    });

これらの配列インデックスは正確に正しくない可能性があります。間違いなくMatrix.toString()を使用して、自分で値を確認してください。xTraveledとyTraveledは、指定された時間(この場合はアニメーションの最後)にTranslateAnimationが移動した距離を示します。

于 2012-08-16T20:13:45.337 に答える
0

android gingerbread以下のアニメーションは、実際にはビューを変更せず、表示方法を変更するだけです。

新しい位置を取得する唯一の方法は、それを計算することです。

于 2012-06-16T16:06:15.613 に答える