2012-06-16 21 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),doen't反映我TranslateAnimation使用的值.. 。

有什么想法?

回答

2

假设你正在使用Android < 3.0那么你的问题可能与我的问题类似,我问here。基本动画与视图本身是分开的,即Android为视图的副本添加动画。这就是为什么getLocationOnScreen()总是返回0.它不是移动(动画)的视图,它是移动(动画)的副本。如果您看到我的问题的答案,则在更高版本的Android中已解决此问题。

+0

非常感谢。 – Quv

0

android姜饼和下面的动画并没有真正改变视图,只是改变了它的显示方式。

获得新位置的唯一方法是计算它。

+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所走过的距离。

相关问题