2012-06-16 5 views
5

ビューの位置の値を取得する方法は複数あります。Android:TranslateAnimation後にViewの最新の位置を取得する方法はありますか?

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で使用される値を反映doen't .. 。

アイデア?

答えて

2

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

+0

ありがとうございました。 – Quv

0

アンドロジージンジャーブレッド以下のアニメーションは実際には表示方法を変更するものではなく、表示方法を変更するだけです。

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

+0

ありがとうございます。私は配列を使用し、自分でそれを計算する... – Quv

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が移動した距離を示します。

関連する問題