我知道获取视图位置值的多种方法。
getLocationOnScreen()
getLocationInWindow()
getLeft()
但是,它们都没有实际返回由startAnimation()方法移动的View的当前位置,而只返回原始位置。
所以,现在让我们在每个Click上创建一个向右移动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中使用的值...
有什么想法吗?
答案 0 :(得分:2)
假设您正在使用Android< 3.0然后你的问题与我的问题类似,我问here。基本上动画与视图本身是分开的,即Android动画制作视图的副本。这就是getLocationOnScreen()
总是返回0的原因。不是移动(动画)的视图是移动(动画)的副本。如果您看到我的问题的答案,则此问题已在Android的更高版本中得到解决。
答案 1 :(得分:2)
好吧,如果您想要查看视图在动画期间/之后移动了多少像素,那么您可以在动画上打开转换对象。
以下是使用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在指定时间(在这种情况下,在动画结束时)行进的距离。
答案 2 :(得分:0)
获得新职位的唯一方法是计算它。