Android中动画的分类
View Animation 视图动画 只是实现动画效果 对view本身的属性并未有影响
Frame 帧动画 iv.setBackgroundResource
Tween 补间动画:淡入淡出 缩放 平移 旋转
淡入淡出 透明度的改变
缩放 宽高尺寸
平移 位置
旋转
alpha通过控制透明度实现动画的效果
透明度的变化情况 0.0-1.0 0.0完全透明 1.0表示完全不透明
android:fromAlpha=”浮点” 设置动画的起始的透明度
android:toAlpha=”浮点” 设置动画的结束的透明度
以下属性的设置补间动画都可可以设置
android:duration=”时间的毫秒值” 设置动画的持续时间
android:fillAfter=”true” 指定为true表示动画结束时维持在最终的状态 默认恢复到原始状态
android:repeatCount=”infinite” 动画默认执行一次 infinite表示动画一直执行
android:repeatMode=”” 设置动画的重复启动模式 restart表示动画一直从from变化到to
reverse 表示动画从from-to-from-to
Property Animation 属性动画 通过动画的变换效果执行改变当前view的属性 sdk3.0之后出现
Frame 帧动画 app中应用场景(页面未加载出来之前的动画效果)
帧动画 界面加载数据时多帧图片实现轮播类似gif的效果
1.res/drawable 定义一个xml文件
<animation-list android:onShot="false">
<item android:drawable="@mipmap/xxx" android:duration="">
</animation-list>
2.在布局文件的xml android:background=”@drawable/帧动画的xml文件”
3.载布局文件的activity中
AnimationDrawable drawable=(AnimationDrawable)iv.getBackground();
4.drawable.start(); drawable.stop();
补间动画
xml文件定义动画的效果
1.res下创建anim文件夹 补间动画的xml文件放到该文件下
淡入淡出 <Alpha android:fromAlpha="起始透明度" android:toAlpha="结束透明度"/>
平移
translate android:fromXDelta=”起始x” android:toXDelta=”结束x”
android:fromYDelta=”起始y” android:toYDelta=”结束y”
旋转
rotate android:fromDegrees=”起始角度” android:toDegrees=”结束角度”
android:pivotX=”圆心x” android:pivotY=”圆心y”
缩放 scale android:fromXScale=”起始x” android:toXScale=”结束x”
android:fromYScale=”起始y” android:toYScale=”结束y”
android:pivotX=”缩放中心x” android:pivotY=”缩放中心y”
组合
Animation animation=AnimationUtils.LoadAnimation(上下文,R.anim.xxx);
iv.startAnimation(animation);
代码中实现 AlphaAnimation ScaleAnimation RotateAnimation
TranslateAnimation
xml文件总设置的没中补间动画的属性 通过代码中对象的构造函数指定
属性动画
xml文件定义动画效果
1.项目的res文件夹下创建animator文件夹 存放属性动画的xml文件
2.设置一个属性
<objectAnimator android:propertyName="属性动画操作的属性" android:valueType="操作属性值的类型"
android:valueFrom="操作动画的起始值" android:valueTo="操作动画的结束值">
设置多个属性
<Set android:ordering=“”>
<objectAnimator/>
...
</set>
3.java代码中使用 Animator animator=AnimatorInflater.loadAnimtor(上下文,R.animator.xx);
animator.setTarget(需要使用动画的view对象);
animator.start();
java代码实现属性动画
单一属性设置 ObjectAnimator animator=ObjectAnimator.of**Float**(使用该动画的view对象,需要设置的动画属性,
需要动画的属性的取值);
animator.setTarget(需要使用动画的view对象);
animator.start();
多个属性的设置
ObjectAnimator animator1=ObjectAnimator.ofFloat(使用该动画的view对象,需要设置的动画属性,
需要动画的属性的取值);
ObjectAnimator animator2=ObjectAnimator.ofFloat(使用该动画的view对象,需要设置的动画属性,
需要动画的属性的取值);
AnimatorSet set=new AnimatorSet();
set.play(animator1).after(animator2);//android:ordering=“sequentially”
set.play(animator1).with(animator2);//android:ordering=“together”
set.start();
<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:propertyName="scaleX"
android:valueType="floatType"
android:valueFrom="1.0"
android:valueTo="2.0"
android:duration="5000"
android:repeatCount="infinite"
android:repeatMode="restart"
>
<!--
android:propertyName="属性的名称" 表示当前属性动画操作的属性的是什么
android:valueType="floatType" 表示当前属性动画操作的属性取值的类型
android:valueFrom="" 表示当前操作的属性值的起始值
android:valueTo="" 表示当前操作的属性值的结束值
-->
</objectAnimator>
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="sequentially">
<!--
set 属性 android:ordering 表示set标签中多个动画效果的执行次序
sequentially 依次执行 together表示set中设置的动画效果一起执行
-->
<objectAnimator
android:propertyName="scaleX"
android:valueType="floatType"
android:valueFrom="1.0"
android:valueTo="3.0"
android:duration="5000"
/>
<objectAnimator
android:propertyName="scaleY"
android:valueType="floatType"
android:valueFrom="1.0"
android:valueTo="4.0"
android:duration="5000"
/>
</set>
帧动画示例:
public class MainActivity extends AppCompatActivity {
private ImageView iv;
private AnimationDrawable drawable;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv= (ImageView) findViewById(R.id.iv);
//设置当前的图片的资源为帧动画的xml文件
iv.setBackgroundResource(R.drawable.frame_animation);
drawable= (AnimationDrawable) iv.getBackground();
}
public void click(View view){
switch (view.getId()){
case R.id.btn_open:
if(!drawable.isRunning()){
drawable.start();//启动动画
}
break;
case R.id.btn_close:
if(drawable.isRunning()){
drawable.stop();//停止动画
}
break;
}
}
}
补间动画:
public class MainActivity extends AppCompatActivity {
private ImageView iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv= (ImageView) findViewById(R.id.iv);
iv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this,"我被点击了!",Toast.LENGTH_SHORT).show();
}
});
}
public void click(View view){
Animation animation=null;
switch (view.getId()){
case R.id.btn_alpha://透明度
// loadAnimation(上下文,表示当前加载动画xml文件的资源id)加载动画的函数
animation= AnimationUtils.loadAnimation(MainActivity.this,R.anim.alpha_anim);
break;
case R.id.btn_scale://缩放
animation=AnimationUtils.loadAnimation(MainActivity.this,R.anim.scale_anim);
break;
case R.id.btn_route:// 旋转
animation=AnimationUtils.loadAnimation(MainActivity.this,R.anim.route_anim);
break;
case R.id.btn_transltion://平移
animation=AnimationUtils.loadAnimation(MainActivity.this,R.anim.translte_anim);
break;
case R.id.btn_all://组合
animation=AnimationUtils.loadAnimation(MainActivity.this,R.anim.set_anim);
break;
}
//startAnimation()启动动画
iv.startAnimation(animation);
}
}
<?xml version="1.0" encoding="utf-8"?>
<alpha
xmlns:android="http://schemas.android.com/apk/res/android"
android:fromAlpha="0.0"
android:toAlpha="0.5"
android:duration="2000"
android:fillAfter="true"
android:repeatCount="infinite"
android:repeatMode="reverse"
>
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromDegrees="-90"
android:toDegrees="180"
android:pivotX="50%"
android:pivotY="50%"
android:duration="3000"
android:fillAfter="true"
android:repeatCount="infinite"
android:repeatMode="restart"
>
<!--
rotate 旋转
android:fromDegrees="旋转的起始角度"
android:toDegrees="旋转的结束角度"
toDegrees-fromDegrees 正数 顺时针 负数 逆时针
android:pivotX=""
android:pivotY="
以x轴和y轴确定旋转中心的坐标
取值三种情况 直接指定数值 0%-100%表示旋转中心以view自身的xy作为参考
0%p-100%p 表示以view的父布局或者父容器的xy作为参
-->
</rotate>
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXScale="1.0"
android:toXScale="0.5"
android:fromYScale="1.0"
android:toYScale="0.5"
android:pivotX="1.0"
android:pivotY="1.0"
android:duration="2000"
android:fillAfter="true"
>
<!--
scale 缩放 通过尺寸的改变实现动画效果
android:fromXScale="" 表示动画起始x轴的尺寸
android:fromYScale="" 表示动画起始y轴的尺寸
android:toXScale="" 表示动画结束x轴的尺寸
android:toYScale="" 表示动画结束Y轴的尺寸
android:pivotX="" 表示缩放x轴的中心点
android:pivotY="" 表示缩放y轴的中心点
-->
</scale>
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0"
android:toXDelta="100"
android:fromYDelta="0"
android:toYDelta="300"
android:duration="5000"
android:fillAfter="true"
>
<!--
平移 位置改变的动画效果
android:fromXDelta="" 表示起始和结束x轴的变化
android:toXDelta=""
android:fromYDelta="" 表示起始和结束y轴的变化
android:toYDelta=""
-->
</translate>
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:repeatMode="restart"
android:repeatCount="5"
>
<alpha
android:duration="3000"
android:fromAlpha="0.0"
android:toAlpha="0.3"
/>
<rotate
android:duration="4000"
android:fromDegrees="-90"
android:toDegrees="90"
android:pivotX="50%p"
android:pivotY="50%p"
/>
</set>