一. 测试内容 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() 推出位置,从而实现效果。