属性动画
知识点
- 什么是Android属性动画
- 动画比较
- 属性动画组成部分、相关类介绍
- 基本属性实现
详解
- 什么是Android属性动画
属性动画(Property Animation)系统是一个健壮的动画框架系统,它可以满足你大部分动画需求。不管动画对象是否已经绘制到屏幕上,你都可以在动画执行过程中改变它任意的属性值。一个属性动画会在一段特定长度的时间内改变一个属性(一个对象中的字段)的值。你可以通过以下几步定义一个动画:指定你要执行动画的属性,比如动画对象(View)在屏幕上的位置,指定执行时长,指定你希望的属性的变化值。
- 动画比较
- 补间动画(Tween Animation)
a. 渐变动画支持四种类型:平移(Translate)、旋转(Rotate)、缩放(Scale)、不透明度(Alpha)。
b. 只是显示的位置变动,View的实际位置未改变,表现为View移动到其他地方,点击事件仍在原处才能响应(弊端)。
c. 组合使用步骤较复杂。
d. View Animation 也是指此动画。
- 帧动画(Frame Animation)
a. 用于生成连续的Gif效果图。
b. DrawableAnimation也是指此动画。
- 属性动画(Property Animation)
a. 支持对所有View能更新的属性的动画(需要属性的setXxx()和getXxx())。
b. 更改的是View实际的属性,所以不会影响其在动画执行后所在位置的正常使用。
c. Android3.0 (API11)及以后出现的功能,3.0之前的版本可使用github第三方开源库nineoldandroids.jar进行支持。
- 属性动画组成部分、相关类介绍
1.ObjectAnimator :对象动画执行类。
2.ValueAnimator :值动画执行类,常配合AnimatorUpdateListener使用。
3.PropertyValuesHolder : 属性存储器,为两个执行类提供更新多个属性的功能。
4.Keyframe :为 PropertyValuesHolder提供多个关键帧的操作值。
5.AnimatorSet :一组动画的执行集合类:设置执行的先后顺序,时间等。
6.AnimatorUpdateListener :动画更新监听。
7.AnimatorListener :动画执行监听,在动画开始、重复、结束、取消时进行回调。
8.AnimatorInflater :加载属性动画的xml文件。
9.TypeEvaluator :类型估值,用于设置复杂的动画操作属性的值。
10.TimeInterpolator :时间插值,用于控制动画执行过程。
- 基本属性实现
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<View
android:id="@+id/v"
android:layout_width="200dp"
android:layout_height="200dp"
android:background="@color/colorAccent"
android:layout_centerInParent="true"/>
</RelativeLayout>
public class MainActivity extends AppCompatActivity {
View v;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
v =findViewById(R.id.v);
}
//透明度
public void test1(){
/**
* 1.target 需要动画的控件
* 2.propertyName 控件的那个属性
* 3. ...values 变化的值 start-end
*/
ObjectAnimator alphaAnim = ObjectAnimator.
ofFloat(v,"alpha",1,0,1);
alphaAnim.setDuration(3000);
alphaAnim.start();
}
//旋转
public void test2(){
ObjectAnimator rotateAnim=ObjectAnimator.
ofFloat(v,"rotation",0,360);
rotateAnim.setDuration(1000);
rotateAnim.start();
}
//缩放
public void test3(){
ObjectAnimator scaleAnim=ObjectAnimator.
ofFloat(v,"scaleX",1,1.1f,1,1.1f,1,1.1f,1);
scaleAnim.setDuration(1000);
//scaleAnim.setRepeatCount(-1);
//scaleAnim.setRepeatMode(ValueAnimator.REVERSE);
ObjectAnimator scaleAnim2=ObjectAnimator.
ofFloat(v,"scaleY",1,1.1f,1,1.1f,1,1.1f,1);
scaleAnim2.setDuration(1000);
//scaleAnim2.setRepeatCount(-1);
//scaleAnim2.setRepeatMode(ValueAnimator.REVERSE);
//playTogether 同时播放
//playSequentially 顺序执行
//play after before先后 with一起
AnimatorSet aset =new AnimatorSet();
// aset.playTogether(scaleAnim,scaleAnim2);
// aset.playSequentially();
aset.play(scaleAnim).after(scaleAnim2);
aset.start();
}
//移动
public void test4(){
ObjectAnimator transAnim=ObjectAnimator.
ofFloat(v,"translationX",v.getTranslationX()+100);
transAnim.setDuration(100);
transAnim.start();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
if (event.getAction()==MotionEvent.ACTION_DOWN){
test4();
}
return true;
}
}