Android动画详解

  • 帧动画
  • 补间动画
  • 属性动画

帧动画

  所谓帧动画其实很好理解,就是通过在一定的时间间隔内,将一组图片顺序播放出来,从而打到动画的效果,我们通过简单的帧动画例子来说明一下。
  下面是帧动画的xml资源代码,animation-list就是帧动画的标签,它包含的item就是每一帧的图像。

<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"android:oneshot="false"><itemandroid:drawable="@mipmap/one"android:duration="500"/><itemandroid:drawable="@mipmap/two"android:duration="500"/><itemandroid:drawable="@mipmap/three"android:duration="500"/><itemandroid:drawable="@mipmap/four"android:duration="500"/><itemandroid:drawable="@mipmap/five"android:duration="50"/><itemandroid:drawable="@mipmap/six"android:duration="50"/>
</animation-list>

  接下来我们创建帧动画例子activity的布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><Buttonandroid:layout_height="wrap_content"android:layout_width="match_parent"android:text="开始"android:id="@+id/start"android:layout_marginTop="20dp"android:onClick="onStart"/><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:id="@+id/stop"android:text="停止"android:onClick="onStop"/><ImageViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop ="20dp"android:id="@+id/imageView"/></LinearLayout>

  然后是activity里面的代码

public class FrameAnimationActivity extends AppCompatActivity {private AnimationDrawable animationDrawable; //此处写错了 写成了Animationprivate ImageView imageView;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.frame_activity);init();}private void init(){imageView = (ImageView)findViewById(R.id.imageView);imageView.setBackgroundResource(R.drawable.frame_anim);animationDrawable = (AnimationDrawable) imageView.getBackground();}public void onStart(View view){if(animationDrawable != null && !animationDrawable.isRunning()){animationDrawable.start();}}public void onStop(View view){if(animationDrawable != null && animationDrawable.isRunning()){animationDrawable.stop();}}
}

  通过上面的代码可以知道,帧动画主要需要记住3点,1是动画资源文件-drawable里面的文件,animation-list以及它的子标签item。2是AnimationDrawable这个类以及这个类的实例对象通过imageView控件的getBackground方法得到的。3是AnimationDrawable的用法(start()、stop()这个几个方法)。

补间动画

  补间动画主要有四种操作:透明变化、缩放控制、旋转控制、移动控制。这四种动画变化都是通过资源文件来实现的,我们在res文件夹里面创建anim文件夹。然后根据需要创建相应的xml文件,这里通过一个例子说明用法。
  下面是alpha、scale、rotate、translate、set对应的xml文件,set文件是将上面所有动画种类选择性地集合在一起,同时执行。

<?xml version="1.0" encoding="utf-8" ?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"android:interpolator="@android:anim/accelerate_decelerate_interpolator"android:fromAlpha="0"android:toAlpha="1"android:duration="4000"/><!-- interpolator:表示采用这个算法,设置动画播放的平缓的程度 -->
<!-- fromAlpha:初始透明度-->
<!-- toAlpha:最终透明度-->
<?xml version="1.0" encoding="utf-8" ?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"android:interpolator="@android:anim/accelerate_decelerate_interpolator"android:fromYScale="0"android:fromXScale="0"android:toXScale="1"android:toYScale="1"android:pivotY="0"android:pivotX="100%"android:duration="3000"/><!-- 缩放的的基点 pivotX和pivotY  如果在百分号数值后面加一个p,就是控件左上角加上父控件百分之多少的值-->
<!-- fromYScale:初始Y轴的缩放比例-->
<!-- fromXScale:初始X轴的缩放比例-->
<!-- toYScale:最终Y轴的缩放比例-->
<!-- toXScale:最终X轴的缩放比例-->
<?xml version="1.0" encoding="utf-8" ?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"android:interpolator="@android:anim/accelerate_decelerate_interpolator"android:pivotX="50%"android:pivotY="30%"android:fromDegrees="0"android:toDegrees="360"android:duration="3000"/><!-- 旋转的的基点 pivotX和pivotY  如果在百分号数值后面加一个p,就是控件左上角加上父控件百分之多少的值-->
<?xml version="1.0" encoding="utf-8" ?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"android:interpolator="@android:anim/accelerate_decelerate_interpolator"android:fromXDelta="0"android:fromYDelta="0"android:toYDelta="500"android:toXDelta="500"android:duration="3000"/>
<?xml version="1.0" encoding="utf-8" ?>
<set xmlns:android="http://schemas.android.com/apk/res/android"android:interpolator="@android:anim/accelerate_decelerate_interpolator"android:shareInterpolator="true"><scaleandroid:pivotY="50%"android:pivotX="50%"android:fromXScale="0"android:fromYScale="0"android:toYScale="1"android:toXScale="1"android:duration="1000"/><!-- 会覆盖前面的scale动画--><scaleandroid:pivotY="50%"android:pivotX="50%"android:fromXScale="1"android:fromYScale="1"android:toYScale="0"android:toXScale="0"android:duration="1000"/><alphaandroid:fromAlpha="0"android:toAlpha="1"android:duration="1000"/>
</set>

  补间动画的布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><Buttonandroid:layout_height="wrap_content"android:layout_width="match_parent"android:text="透明动画"android:onClick="onAlpha"android:layout_marginTop="20dp"/><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:onClick="onScale"android:text="缩放动画"/><Buttonandroid:layout_height="wrap_content"android:layout_width="match_parent"android:layout_marginTop="20dp"android:onClick="onRotate"android:text="旋转动画"/><Buttonandroid:layout_height="wrap_content"android:layout_width="match_parent"android:layout_marginTop="20dp"android:onClick="onTranslate"android:text="位移动画"/><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:onClick="onSet"android:text="动画组合"/><ImageViewandroid:layout_height="wrap_content"android:layout_width="wrap_content"android:layout_marginTop="20dp"android:layout_gravity="center_horizontal"android:id="@+id/imageView"android:background="@mipmap/five"/></LinearLayout>

  activity代码

public class TweenAnimationActivity extends AppCompatActivity {private Animation animation;private ImageView imageView;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.tween_activity);init();}private void init(){imageView = (ImageView)findViewById(R.id.imageView);}public void onAlpha(View view){animation = AnimationUtils.loadAnimation(this, R.anim.alpha);imageView.startAnimation(animation);}public void onScale(View view){animation = AnimationUtils.loadAnimation(this, R.anim.scale);imageView.startAnimation(animation);}public void onRotate(View view){animation = AnimationUtils.loadAnimation(this, R.anim.rotate);imageView.startAnimation(animation);}public void onTranslate(View view){animation = AnimationUtils.loadAnimation(this, R.anim.translate);imageView.startAnimation(animation);}/**** @param view** 对于set的理解就是,set.xml文件里面定义这四种动画,然后同时执行,也可以定义一样的动画类型,但是会覆盖前面的同类型动。*/public void onSet(View view){animation = AnimationUtils.loadAnimation(this, R.anim.set);imageView.startAnimation(animation);}
}

  通过上面示例代码可以看出。补间动画主要记住3点,1是补间动画资源文件的写法,2是Animation类和AnimationUtils类loadAnimation()方法的用法, 3是插值器,参考这篇文章。

属性动画

  属性动画需要和补间动画区分开来,因为前者的变化是真实的,后者的变化是不真实的,补间动画只是给人一种障眼法,比如当补间动画移动之后,你点击它的显示区域,发现不会响应点击事件,只有点击它的原始区域才会响应点击事件。而属性动画就不一样了,只要移动在屏幕可显示区域就可以响应点击事件。同样地给出一个例子来说明。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><Buttonandroid:layout_height="wrap_content"android:layout_width="match_parent"android:onClick="onAlpha"android:text="透明"/><Buttonandroid:layout_height="wrap_content"android:layout_width="match_parent"android:onClick="onScale"android:text="缩放"/><Buttonandroid:layout_height="wrap_content"android:layout_width="match_parent"android:onClick="onRotate"android:text="旋转"/><Buttonandroid:layout_height="wrap_content"android:layout_width="match_parent"android:onClick="onTranslate"android:text="移动"/><Buttonandroid:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="onSet"android:text="集合"/><Buttonandroid:layout_height="wrap_content"android:layout_width="wrap_content"android:layout_marginTop="30dp"android:layout_gravity="center_horizontal"android:text="我是移动的控件"android:id="@+id/move_button"/></LinearLayout>
public class AttributeAnimationActivity extends AppCompatActivity {private ObjectAnimator objectAnimator;private Button show_button;private final static String TAG = "提示";private AnimatorSet animatorSet = new AnimatorSet();ObjectAnimator rotateObjectAnimator1 = new ObjectAnimator();ObjectAnimator translateObjectAnimator1 = new ObjectAnimator();@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.attribute_activity);init();animatorSet.addListener(new AnimatorListenerAdapter() {private AnimatorSet animatorSet2 = new AnimatorSet();@Overridepublic void onAnimationEnd(Animator animation) {super.onAnimationEnd(animation);
//                animation.cancel();Log.d(TAG, "onAnimationEnd: 动画完成,开始回来动画");ObjectAnimator rotateObjectAnimator2 = new ObjectAnimator();ObjectAnimator translateObjectAnimator2 = new ObjectAnimator();rotateObjectAnimator2 = rotateObjectAnimator2.ofFloat(show_button, "rotation", 0f, 360f);translateObjectAnimator2 = translateObjectAnimator2.ofFloat(show_button, "translationY", 200f, 150f, 100f, 50f, 0f);animatorSet2.setDuration(2000);animatorSet2.play(rotateObjectAnimator2).with(translateObjectAnimator2);animatorSet2.start();}});}private void init(){show_button = (Button)findViewById(R.id.move_button);}public void onAlpha(View view){Log.d(TAG, "onAlpha: ");//value是不定长形参数组。里面的值代表动画的变化过程值。objectAnimator = objectAnimator.ofFloat(show_button, "alpha", 1f, 0.5f, 0f, 0.5f, 1f);objectAnimator.setDuration(2000);objectAnimator.start();}public void onScale(View view){Log.d(TAG, "onScale: ");objectAnimator = objectAnimator.ofFloat(show_button, "scaleY", 0f, 1f, 2f, 1f);objectAnimator.setDuration(2000);objectAnimator.start();}public void onRotate(View view){Log.d(TAG, "onRotate: ");objectAnimator = objectAnimator.ofFloat(show_button, "rotation", 0f, 90f, 360f);objectAnimator.setDuration(2000);objectAnimator.setRepeatCount(3);objectAnimator.setRepeatMode(ValueAnimator.RESTART);objectAnimator.start();}public void onTranslate(View view){Log.d(TAG, "onTranslate: ");objectAnimator = objectAnimator.ofFloat(show_button, "translationY", 0f, 50f, 100f, 150f, 200f);objectAnimator.setDuration(2000);objectAnimator.start();}public void onSet(View view){Log.d(TAG, "onSet: ");rotateObjectAnimator1 = rotateObjectAnimator1.ofFloat(show_button, "rotation", 0f, 90f,  360f);translateObjectAnimator1 = translateObjectAnimator1.ofFloat(show_button, "translationY", 0f, 50f, 100f, 150f, 200f);animatorSet.setDuration(2000);animatorSet.play(rotateObjectAnimator1).with(translateObjectAnimator1);animatorSet.start();}
}

  属性动画需要记住3点,1是属性动画不依赖xml文件。2是ObjectAnimator类以及它的ofFloat()方法的用法。3是AnimatorSet类的用法。

总结

  Android动画类型从简单到复杂是,帧动画-补间动画-属性动画。同时灵活程度也是如此,帧动画可以实现一些简单的显示效果,如果想要移动、旋转等操作就需要用到补间动画了,而如果要实现是跟为复杂或者可响应点击事件的功能,那就只能选择属性动画了。

Android的三种动画相关推荐

  1. Android开发—三种动画实现原理及使用

    Android动画目前分为三种: Frame Animation 帧动画,通过顺序播放一系列图像从而产生动画效果,.图片过多时容易造成OOM(Out Of Memory内存用完)异常. Tween A ...

  2. Android的三种动画详解(帧动画、View动画、属性动画)

    Android的动画分为了三种, 分别是 帧动画.View动画.属性动画. 1.帧动画 帧动画就是顺序播放一组预先定义好的图片,就类似于我们观看视频,就是一张一张的图片连续播放. 帧动画的使用很简单, ...

  3. Android 三种动画 (帧动画 、补间动画、属性动画)

    1.帧动画 帧动画是依次展示n张静态图片,造成动画的错觉,类似看视频一样. 使用方式 在drawable目录下定义XML文件,根节点为animation-list,然后放入定义更好的图片 onesho ...

  4. Android开发之三种动画

    转载:http://www.cnblogs.com/angeldevil/archive/2011/12/02/2271096.html http://www.lightskystreet.com/2 ...

  5. android 那几种动画,Android 动画实现几种方案

    Android 动画实现几种方案 在 Android 的 FrameWork 中,为我们提供三种动画的实现方式:逐帧(Frame)动画.视图/补间动画(View Animation)和属性动画(Pro ...

  6. Android之Android Studio三种方式导入外部资源 以及 报错处理

    Android Studio三种方式导入外部资源 以及 报错处理 android studio提供了三种方式导入外部资源: 1. Library dependency – 在线添加.需联网下载 . 2 ...

  7. Android的三种网络联接方式(URL / HttpURLConnection | HttpClient | InetAddress )

    Android SDK 中一些与网络有关的package,如下: 包描述 java.net 提供与联网有关的类,包括流和数据包(datagram)sockets.Internet 协议和常见 HTTP ...

  8. 19.React Native动画Animated效果三种动画类型二;

    目录 1.介绍 2.Animated.decay() 2.1方法 2.1.1value参数值 2.1.2config参数有以下这些属性: 2.2示例-执行缩放 2.2.1初始化缩放值 2.2.2绑定缩 ...

  9. Android -- 三种动画(帧动画、View动画、属性动画)

    Android的动画分为了三种, 分别是 帧动画.View动画.属性动画 一:帧动画 帧动画就是顺序播放一组预先定义好的图片,就类似于我们观看视频,就是一张一张的图片连续播放. 帧动画的使用很简单,总 ...

最新文章

  1. 自学python需要下载什么软件-学python下载什么软件开发
  2. 量子力学 一 基础6 厄尔米特算符的相容性
  3. 13道Python3实例
  4. Python 内嵌函数运用(探究模块)
  5. Sequelize 中文文档 v4 - Querying - 查询
  6. mybatis和spring整合时这个报错,应该这样解决!
  7. vue js 和原生app调用回调方法问题
  8. 069 Sqrt(x) 求平方根
  9. 环境变量的配置windows10系统
  10. [转载] python hasattr函数_Python的hasattr() getattr() setattr() 函数使用方法详解
  11. 安全防范报警系统产品质量监督检测测试中心(上海)
  12. 高级程序员的自我修养:如何才能成长为牛逼的高级程序员?
  13. windows中的文件共享(SMB服务)
  14. DNA甲基化数据分析专题
  15. RocketMq 消费者
  16. 编程创业赚钱-教你怎样开发热门配音程序
  17. 从viewport发现小米手机参数不一致
  18. 回车与换行符的区别及python中使用
  19. PCIe 均衡技术介绍(电气物理篇)
  20. 如何将微信公众号文章的长网址转换为短网址?

热门文章

  1. Android 11:bluetooth@1.0蓝牙架构分析
  2. 这个假期我通过【得到】得到了什么
  3. 设备驱动中的中断问题及实例解析
  4. js如何将first.aiff变为first.wav
  5. 强制双休!腾讯调整加班机制,21点前必须离开工位
  6. 【HAL】stm32F103+TJA1050+USBCAN CAN数据收发
  7. 编写一个函数,用来删除字符串中的空格字符:
  8. tomcat集群配置
  9. steam游戏搬砖赚钱副业,年底稳赚一波
  10. 跟波利亚学解题---1