一. 测试内容 1. 补间动画的测试结果 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 public  class  MainActivity  extends  AppCompatActivity           public  static  final  String TAG = MainActivity.class.getSimpleName();     @Override      protected  void  onCreate (Bundle savedInstanceState)           super .onCreate(savedInstanceState);         setContentView(R.layout.activity_main);                  final  View view = findViewById(R.id.btn);                  final  TranslateAnimation translateAnimation = new  TranslateAnimation(0 ,300 ,0 ,0 );         translateAnimation.setDuration(1000 );         translateAnimation.setFillAfter(true );         view.setOnClickListener(new  View.OnClickListener() {             @Override              public  void  onClick (View v)                   Log.d(TAG,"-------------------------" );                 Log.d(TAG,"Left:" +view.getLeft());                 Log.d(TAG,"TranslateX:" +view.getTranslationX());                 Log.d(TAG,"X:" +view.getX());                 view.startAnimation(translateAnimation);             }         });     } } ------------------------- Left:0  TranslateX:0.0  X:0.0  ------------------------- Left:0  TranslateX:0.0  X:0.0  
2. 属性动画的测试结果 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 public  class  MainActivity  extends  AppCompatActivity      public  static  final  String TAG = MainActivity.class.getSimpleName();     @Override      protected  void  onCreate (Bundle savedInstanceState)           super .onCreate(savedInstanceState);         setContentView(R.layout.activity_main);                  final  View view = findViewById(R.id.btn);                  final  ObjectAnimator translationX = ObjectAnimator.ofFloat(view, "TranslationX" , 0 ,100 );         translationX.setDuration(1000 );         view.setOnClickListener(new  View.OnClickListener() {             @Override              public  void  onClick (View v)                   Log.d(TAG,"-------------------------" );                 Log.d(TAG,"Left:" +view.getLeft());                 Log.d(TAG,"TranslateX:" +view.getTranslationX());                 Log.d(TAG,"X:" +view.getX());                 translationX.start();             }         });     } } ------------------------- Left:0  TranslateX:0.0  X:0.0  ------------------------- Left:0  TranslateX:100.0  X:100.0  
二. 个人思考 1. 测试内容的疑惑 首先我将动画的开启直接放在 onCreate() 方法中,在开启前后打印相关的信息。
很明显,补间动画成功通过了测试,view.getTranslationX() 的值 前后 都是0。
但是,当我开始测试属性动画后,我惊讶的发现 view.getTranslationX() 的值 前后也都还是0。但是很明显我前后两次点击的按钮位置是变化了的。
在Google网上的测试代码后,我成功的实现了上面 测试内容 的打印。
接着,我便想着,在onclick方法的前后打印信息,发现 view.getTranslationX() 的值 前后还是0。这令我相当的困惑。
2. 解惑 个人当前没有证实的推测:view.getTranslationX() 值 的变化需要相当的一段时间才可以。
根据 View坐标系  中的关系,getX() - getLeft() = getTranslationX(),上面的 测试内容 很明显符合这一结论。
3. 关于触摸点的一些思考 首先,补间动画不会改变视图的位置,所以视图的点击响应位置一直在原来的位置。
其次,事件的点击事件是通过视图的 getLeft(), getTop(), getRight(), getBottom()来决定的。
那么,为什么属性动画没有改变 getLeft(), getTop(), getRight(), getBottom() ,点击响应的位置却会随着动画的改变而改变呢。
大概的理解是,触摸事件会判断是否是属性动画 然后利用 getTranslationX() 推出位置,从而实现效果。