一. 测试内容

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 {

//TAG
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() 推出位置,从而实现效果。