Android动画详解
来源:互联网 发布:淘宝达人的推广方式 编辑:程序博客网 时间:2024/05/23 12:27
1.Frame 帧动画 将每一张静止的图片依次的显示出来,利用人眼暂时停留的错觉,得出的动画。 在drawable文件中中创建xml文件 标签是<animation-list /> 使用步骤: 1.在drawable文件夹下创建帧动画的资源文件,<animation-list /> 2.在代码或者在布局当中设置imageview的背景或者src资源为自定义的帧动画资源文件。 3.获取AnimationDrawable的帧动画管理器,然后可以调用其start或者是stop方法开启关闭动画。 添加oneshot属性 true:表示指定的资源图片只切换一次 false:表示指定的item图片无限切换。实例:
- public class FrameActivity1 extends AppCompatActivity {
-
- private ImageView iv;
-
- private AnimationDrawable drawable;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_frame1);
- iv = (ImageView) findViewById(R.id.iv);
- iv.setBackgroundResource(R.drawable.my_frame_animation);
- drawable = (AnimationDrawable) iv.getBackground();
- }
-
- public void start(View view) {
- if (!drawable.isRunning()) {
- drawable.start();
- }
- }
-
- public void stop(View view) {
- if (drawable.isRunning()) {
- drawable.stop();
- }
- }
- }
- <?xml version="1.0" encoding="utf-8"?>
- <animation-list xmlns:android="http://schemas.android.com/apk/res/android"
- android:oneshot="false">
- <item android:drawable="@mipmap/anim1" android:duration="50"></item>
- <item android:drawable="@mipmap/anim2" android:duration="50"></item>
- </animation-list>
或者在代码中加载:- public class FrameActivity3 extends AppCompatActivity {
-
- private ImageView iv;
- private AnimationDrawable drawable;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_frame3);
- iv = (ImageView) findViewById(R.id.iv);
-
- drawable = new AnimationDrawable();
-
- drawable.addFrame(getResources().getDrawable(R.mipmap.girl_1),200);
- drawable.addFrame(getResources().getDrawable(R.mipmap.girl_2),200);
-
-
- iv.setImageDrawable(drawable);
-
- drawable.setOneShot(false);
- }
-
- public void onClick(View view) {
-
- if (drawable.isRunning()){
- drawable.stop();
- }else {
- drawable.start();
- }
- }
- }
2.Tween 补间动画 补充中间的动画 开发者只需要指定动画开始和结束的关键帧,而进行中的中间帧是由系统来计算并且补齐的。 补间动画分为四种: 1.透明度动画 : alpha 2.大小缩放动画 : scale 3.位移变化动画 : translate 4.旋转动画 : rotate 5.综合动画 :把前几种动画综合起来。 补间动画的资源存放与res/anim目录之下 四种变化方式都有对应的标签 <alpha .../> 定义的属性: android:fromAlpha="1" android:toAlpha="0.05" 以上两个属性 取值范围 0-1 之间 0:表示完全透明 1:表示不透明 <scale .../> 定义的属性: 确定开始和结束的尺寸 android:fromXScale="1" android:toXScale="0.1" android:fromYScale="1" android:toYScale="0.1" 确定放大缩小的中心点 android:pivotX="50%" android:pivotY="50%" <translate .../> 定义的属性: 确定开始和结束的位置 android:fromXDelta="0" android:toXDelta="200" android:fromYDelta="0" android:toYDelta="200" 确定运动持续的时间 android:duration="5000" 插值器 :可以改变动画执行中间的效率,控制动画的速度 android:interpolator accelerate_interpolator 加速 decelerate_interpolator 减速 accelerate_decelerate_interpolator 先加速后减速 linear_interpolator 匀速 表示重复的次数 android:repeatCount 表示重复的模式 android:repeatMode 是否保留动画结束时的状态 android:fillAfter <rotate .../> 定义的属性: 旋转的起始角度和最终角度 android:fromDegrees="0" android:toDegrees="360" 旋转的中心点 android:pivotX="" android:pivotY="" 放入三种值: 1.绝对的数值:传入绝对值,表示执行该view的某一个点作为中心点 (50,50) 2.百分比 :表示以该view的宽高的百分比作为中心点 (50% ,50%) 3.百分比p :表示执行该动画的view的外层布局的位置 (50%p 50%p) <set .../> 可以对以上四种动画任意组合。 //代码中加载资源动画: Animation anim = AnimationUtils.loadAnimation(this,R.anim.anim_xxx); //开启动画 xxx.startAnimation(anim);
对set的实例:
- public class TweenActivity1 extends AppCompatActivity {
-
- private ImageView mIv;
-
- private Animation setAnim;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_tween1);
- mIv = (ImageView) findViewById(R.id.tweeniv);
- setAnim = AnimationUtils.loadAnimation(this,R.anim.anim_set);
- }
-
- public void onClick(View view) {
- mIv.startAnimation(setAnim);
- }
- }
- }
- <?xml version="1.0" encoding="utf-8"?>
- <set xmlns:android="http://schemas.android.com/apk/res/android"
- android:interpolator="@android:anim/linear_interpolator"
- android:duration="2000">
- <alpha
- android:fromAlpha="1"
- android:toAlpha="0"></alpha>
-
- <scale
- android:fromXScale="1"
- android:toXScale="0"
- android:fromYScale="1"
- android:toYScale="0"
- android:pivotX="50%"
- android:pivotY="50%"></scale>
-
- <translate
- android:fromXDelta="0"
- android:fromYDelta="0"
- android:toXDelta="0"
- android:toYDelta="2000"
- ></translate>
-
- <rotate
- android:fromDegrees="0"
- android:toDegrees="1800"
- android:pivotX="50%"
- android:pivotY="50%"></rotate>
- </set>
3.Property 属性动画 android3.0之后引入的动画
属性动画的特点:
1.Animator框架之下的,常用的类包括AnimatorSet和ObjectAnimator
2.补间动画只能够定义控件的四个方面,而属性动画可以定义任何属性。
3.补间动画只能够让ui控件执行动画,而属性动画可以让任何对象执行动画。
属性动画可以定义以下属性:
1.动画持续时间
2.动画的插值方式
3.动画重复的次数
4.动画重复的行为
5.动画的集合
......
属性动画在xml文件当中定义的步骤。
1.在res/animator文件夹当中定义属性动画的资源文件,如果是单独的属性可以定义标签为<objectAnimator.../>
如果是多个属性就要放入到<set.../>标签当中。
在<objectAnimator.../>标签中可以定义的属性:
android:propertyName="textColor" //属性名
android:duration="5000" //动画持续时间
android:valueType="intType" //动画的输入类型
android:valueFrom="#ff0000" //动画的起始值
android:valueTo="#0000ff" //动画的最终值
在set标签当中可以判断是同时执行,还是顺序执行
android:ordering=""
sequentially :按顺序执行
together : 同时执行
2. 在activity当中把xml文件转化为属性动画,然后开启动画
//获得属性动画的对象
ObjectAnimator backgroundAnimator = (ObjectAnimator) AnimatorInflater.loadAnimator(this,R.animator.anim_bgcolor);
//给指定的ui控件设置动画
backgroundAnimator.setTarget(mTv);
//开启动画
backgroundAnimator.start();
实例
- public class PropertyActivity1 extends AppCompatActivity {
-
-
- private ImageView mIv;
- private TextView mTv;
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_property1);
- mIv = (ImageView) findViewById(R.id.iv);
- mTv = (TextView) findViewById(R.id.tv);
-
- ObjectAnimator backgroundAnimator = (ObjectAnimator) AnimatorInflater.loadAnimator(this,R.animator.anim_bgcolor);
-
- backgroundAnimator.setTarget(mTv);
-
- backgroundAnimator.start();
- }
-
- public void scale(View view) {
-
- switch (view.getId()) {
- case R.id.ScaleX:
- ObjectAnimator scaleXAnimator = (ObjectAnimator) AnimatorInflater.loadAnimator(this,R.animator.anim_scalex);
- scaleXAnimator.setTarget(mIv);
- scaleXAnimator.start();
- break;
- case R.id.ScaleXY:
- Animator scaleXYAnimator = AnimatorInflater.loadAnimator(this,R.animator.anim_scalexy);
- scaleXYAnimator.setTarget(mIv);
- scaleXYAnimator.start();
- break;
- }
- }
- }
- <?xml version="1.0" encoding="utf-8"?>
- <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
- android:propertyName="textColor"
- android:duration="5000"
- android:valueType="intType"
- android:valueFrom="#ff0000"
- android:valueTo="#0000ff">
-
- </objectAnimator>
- <?xml version="1.0" encoding="utf-8"?>
- <set xmlns:android="http://schemas.android.com/apk/res/android"
- android:ordering="sequentially">
- <set android:ordering="together">
- <objectAnimator
- android:propertyName="scaleX"
- android:valueType="floatType"
- android:interpolator="@android:anim/linear_interpolator"
- android:valueTo="2.0"
- android:duration="3000"
- android:valueFrom="1.0"></objectAnimator>
-
- <objectAnimator
- android:propertyName="scaleY"
- android:valueType="floatType"
- android:valueFrom="1.0"
- android:valueTo="2.0"
- android:duration="3000"
- android:interpolator="@android:anim/linear_interpolator"></objectAnimator>
- </set>
- <set android:ordering="together">
- <objectAnimator
- android:propertyName="translationY"
- android:valueType="floatType"
- android:valueFrom="0"
- android:valueTo="-1000"
- android:interpolator="@android:anim/accelerate_interpolator"
- android:duration="3000"></objectAnimator>
-
- <objectAnimator
- android:propertyName="alpha"
- android:valueType="floatType"
- android:valueFrom="1.0"
- android:valueTo="0.1"
- android:duration="3000"></objectAnimator>
-
- <objectAnimator
- android:propertyName="scaleX"
- android:valueType="floatType"
- android:interpolator="@android:anim/linear_interpolator"
- android:valueTo="1.0"
- android:duration="3000"
- android:valueFrom="2.0"></objectAnimator>
-
- <objectAnimator
- android:propertyName="scaleY"
- android:valueType="floatType"
- android:valueFrom="2.0"
- android:valueTo="1.0"
- android:duration="3000"
- android:interpolator="@android:anim/linear_interpolator"></objectAnimator>
-
- </set>
-
-
- </set>
实例:属性动画的响应谁事件- public class PropertyActivity3 extends AppCompatActivity {
-
- private ImageView iv;
- ObjectAnimator animator;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_property3);
- iv = (ImageView) findViewById(R.id.iv);
-
- animator = ObjectAnimator.ofFloat(iv,"translationY",200F);
- animator.setDuration(5000);
-
-
- animator.addListener(new Animator.AnimatorListener() {
- @Override
- public void onAnimationStart(Animator animation) {
- Log.i("tag","========onAnimationStart========");
- }
- @Override
- public void onAnimationEnd(Animator animation) {
- Log.i("tag","========onAnimationEnd========");
- }
- @Override
- public void onAnimationCancel(Animator animation) {
- Log.i("tag","========onAnimationCancel========");
- }
- @Override
- public void onAnimationRepeat(Animator animation) {
- Log.i("tag","========onAnimationRepeat========");
- }
- });
-
-
- animator.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator animation) {
- super.onAnimationEnd(animation);
- Log.i("tag","===AnimatorListenerAdapter=====onAnimationEnd=========");
- }
- });
- }
-
- public void onClick(View view) {
- animator.start();
- }
- }
0 0