Android三种动画的实现
1、帧动画
主要涉及到 AnimationDrawable 类。
(1)通过 XML 文件实现
现在drawable
目录下定义好 XML 文件(假设文件名为xml_name
):
<?xml version="1.0" encoding="utf-8"?><animation-list android:oneshot="true" xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/a_0" android:duration="100" /> <item android:drawable="@drawable/a_1" android:duration="100" /> <item android:drawable="@drawable/a_2" android:duration="100" />animation-list>
(android:oneshot=”false” ,这个oneshot 的含义就是动画执行一次(true)还是循环执行多次。)
然后用Java代码开启:
ImageView imageview = (ImageView) findViewById(R.id.imageview);imageview.setImageResource(R.drawable.xml_name);AnimationDrawable animationDrawable = (AnimationDrawable) imageview.getDrawable();animationDrawable.start();//animationDrawable.stop();
(2)只通过 Java 代码实现
AnimationDrawable animationDrawable = new AnimationDrawable();int[] mipmaps = new int[]{R.drawable.a_0,R.drawable.a_1,R.drawable.a_2};for (int i = 0; i < 3; i++) { int id=mipmaps[i]; //或者使用下面方式,注意如果图片资源放在mipmap下时将drawable修改下 //int id = getResources().getIdentifier("a_" + i, "drawable",getPackageName()); Drawable drawable = getResources().getDrawable(id); animationDrawable.addFrame(drawable, 200);}animationDrawable.setOneShot(false);imageView.setBackgroundDrawable(animationDrawable);animationDrawable.start();
2、补间画
补间动画又可以分为四种形式,分别是 alpha(淡入淡出),translate(位移),scale(缩放大小),rotate(旋转)。
主要涉及到 Animation 类。
通过 XML 文件实现时需要在res/anim/ 文件夹下定义相关文件。
可以是单独的以、
等标签实现的单独的动画,也可以使用使用set
标签将多个动画组合
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@[package:]anim/interpolator_resource" android:shareInterpolator=["true" | "false"] > <alpha android:fromAlpha="float" android:toAlpha="float" /> <scale android:fromXScale="float" android:toXScale="float" android:fromYScale="float" android:toYScale="float" android:pivotX="float" android:pivotY="float" /> <translate android:fromXDelta="float" android:toXDelta="float" android:fromYDelta="float" android:toYDelta="float" /> <rotate android:fromDegrees="float" android:toDegrees="float" android:pivotX="float" android:pivotY="float" /> <set> ... set>set>
有涉及到:
Interpolator
主要作用是可以控制动画的变化速率 ,就是动画进行的快慢节奏。Android 系统已经为我们提供了一些Interpolator ,比如 accelerate_decelerate_interpolator
,accelerate_interpolator
等。更多的interpolator 及其含义可以在Android SDK 中查看。同时这个Interpolator也是可以自定义的。
pivot
决定了当前动画执行的参考位置,这个属性主要是在translate
和 scale
动画中,这两种动画都牵扯到view 的“物理位置“发生变化,所以需要一个参考点。而pivotX
和pivotY
就共同决定了这个点;它的值可以是float或者是百分比数值。
然后在 Java 代码中:
Animation animation = AnimationUtils.loadAnimation(mContext, R.anim.xml_name);img = (ImageView) findViewById(R.id.img);img.startAnimation(animation);
另外也可以直接使用 Java 代码实现。
借助RotateAnimation
、AlphaAnimation
等类。
具体请参考:
https://lrh1993.gitbooks.io/android_interview_guide/content/android/basis/animator.html
3、属性动画
主要涉及到 ObjectAnimator 和 AnimatorSet 类。
ObjectAnimator anim = ObjectAnimator.ofFloat(myView, "rotation", 0f, 360f);anim.setDuration(1000);anim.start();
ObjectAnimator anim = ObjectAnimator.ofFloat(myView, "alpha", 1.0f, 0.8f, 0.6f, 0.4f, 0.2f, 0.0f);anim.setRepeatCount(-1);anim.setRepeatMode(ObjectAnimator.REVERSE);anim.setDuration(2000);anim.start();
属性动画也是可以组合实现的:
通过 AnimatorSet
ObjectAnimator alphaAnim = ObjectAnimator.ofFloat(myView, "alpha", 1.0f, 0.5f, 0.8f, 1.0f);ObjectAnimator scaleXAnim = ObjectAnimator.ofFloat(myView, "scaleX", 0.0f, 1.0f);ObjectAnimator scaleYAnim = ObjectAnimator.ofFloat(myView, "scaleY", 0.0f, 2.0f);ObjectAnimator rotateAnim = ObjectAnimator.ofFloat(myView, "rotation", 0, 360);ObjectAnimator transXAnim = ObjectAnimator.ofFloat(myView, "translationX", 100, 400);ObjectAnimator transYAnim = ObjectAnimator.ofFloat(myView, "tranlsationY", 100, 750);AnimatorSet set = new AnimatorSet();set.playTogether(alphaAnim, scaleXAnim, scaleYAnim, rotateAnim, transXAnim, transYAnim);//set.playSequentially(alphaAnim, scaleXAnim, scaleYAnim, rotateAnim, transXAnim, transYAnim);set.setDuration(3000);set.start();
通过 PropertyValuesHolder 以及 ObjectAnimator.ofPropertyValuesHolder() 方法
PropertyValuesHolder translationX = PropertyValuesHolder.ofFloat("translationX", -200, -100, 100, 200, 300);PropertyValuesHolder scaleX = PropertyValuesHolder.ofFloat("scaleX", 1.0f, 2.0f);PropertyValuesHolder rotate = PropertyValuesHolder.ofFloat("rotation", 0f, 360f);PropertyValuesHolder rotationX = PropertyValuesHolder.ofFloat("rotationX", 0f, 180f);ObjectAnimator together = ObjectAnimator.ofPropertyValuesHolder(imageView, translationX, rotate, scaleX, rotationX);together.setDuration(3000);together.start();
具体请参考:
https://lrh1993.gitbooks.io/android_interview_guide/content/android/basis/animator.html
也可以通过 XML 文件实现:http://www.jianshu.com/p/87373134481b
更多相关文章
- 今天开始写android的照片浏览器(一)至返回所有图片文件
- Android工程内嵌资源文件的两种方法
- Android 动画之Tween动画详细讲解及java源码实现
- 删除androidAndroid递归方式删除某文件夹下的所有文件
- IntelliJ IDEA 如何导出安卓(Android)apk文件 详细教程
- Android属性动画—实现第三方登录的上拉展开,下拉隐藏
- Android xml application属性详解