View动画:平移translate,旋转rotate,缩放scale,透明度alpha!
帧动画:通过切换一组图片,来达到动画的效果!
属性动画:通过动态的改变对象的属性,来实现动画效果!
1、view动画,首先view动画的使用是通过xml文件定义一些上面提到的四种属性,来进行操作的!
view动画可以是一个动画,也可以是一组动画的集合,集合使用set标签;
set有两个属性,分别是顺序执行,和一起执行
Android:ordering=”sequentially”
android:ordering=”together”
<set xmlns:android="http://schemas.android.com/apk/res/android" > <!-- 在水平和垂直方向完成动画效果,属性分别为,起始坐标,和结束坐标--> <!-- fillAfter 属性为动画播放完毕之后是否停留在结束位置,TRUE表示留在此位置--> <!-- repeatMode 属性为动画播放完毕之后播放模式,reverse 表示反方向播放、restart表示重新正方向执行--> <!-- 属性:interpolator 指定一个动画的插入器 常见动画插入器: accelerate_decelerate_interpolator 加速-减速 动画插入器 accelerate_interpolator 加速-动画插入器 decelerate_interpolator 减速- 动画插入器 anticipate_interpolator 先回退一小步然后加速前进 anticipate_overshoot_interpolator 在上一个基础上超出终点一小步再回到终点 bounce_interpolator 最后阶段弹球效果 cycle_interpolator 周期运动 linear_interpolator 匀速 overshoot_interpolator 快速到达终点并超出一小步最后回到终点--> <translate android:fillAfter="false" android:fromXDelta="0" android:fromYDelta="0" android:toXDelta="100" android:interpolator="@android:anim/decelerate_interpolator" android:repeatMode="reverse" android:toYDelta="100"/> <!-- 起始角度和结束角度,轴心坐标 其中轴心坐标可以是50%(表示view的X或者Y的中间)--> <!-- repeatCount表示重复播放次数,-1表示持续播放--> <rotate android:fromDegrees="0" android:pivotX="100" android:repeatCount="-1" android:pivotY="100" android:toDegrees="360" /> <!-- 分别是水平和垂直的起始缩放值与结束值,轴心坐标--> <scale android:fromXScale="0.5" android:fromYScale="0.5" android:pivotX="100" android:pivotY="100" android:toXScale="1.2" android:toYScale="1.2"/> <!-- 透明度的起始值和缩放值--> <alpha android:fromAlpha="0.1" android:toAlpha="1"/></set>
像我这样使用它:
textView = (TextView) findViewById(R.id.textview); Animation animation = AnimationUtils.loadAnimation(this, R.anim.test_anima); animation.setDuration(2000);//这句话的意思是,这个动画持续两秒钟,不然默认值太短了不方便观察效果 ^_^ textView.startAnimation(animation);12341234
自定义动画:
子类只要继承Animation抽象类即可!
在initialize中初始化一些东西,在applyTransformation中变换矩阵
用法与上面的一致只是得到对象的时候,不是利用animationutils而是直接new出来,并在构造方法中初始化:
MyAnimator animator = new MyAnimator(0,360,120,100,-1220,true,new Camera()); animator.setDuration(2000); textView.startAnimation(animator);
自定义Animation:
public class MyAnimator extends Animation { private final float mFromDegrees; private final float mToDegrees; private final float mCenterX; private final float mCenterY; private final float mDepthZ; private final boolean mReverse; private Camera mCamera; public MyAnimator(float mFromDegrees, float mToDegrees, float mCenterX, float mCenterY, float mDepthZ, boolean mReverse, Camera camera) { this.mFromDegrees = mFromDegrees; this.mToDegrees = mToDegrees; this.mCenterX = mCenterX; this.mCenterY = mCenterY; this.mDepthZ = mDepthZ; this.mReverse = mReverse; } @Override public void initialize(int width, int height, int parentWidth, int parentHeight) { super.initialize(width, height, parentWidth, parentHeight); mCamera = new Camera(); } @Override protected void applyTransformation(float interpolatedTime, Transformation t){//apply:申请,Transformation:转化 final float formDegrees = mFromDegrees; final float degrees = formDegrees + ((mToDegrees - mFromDegrees) * interpolatedTime); final float cx = mCenterX; final float cy = mCenterY; final Camera c = mCamera; final Matrix matrix = t.getMatrix(); c.save(); if (mReverse) { c.translate(0, 0, mDepthZ * interpolatedTime); } else { c.translate(0, 0, mDepthZ * (1.0f - interpolatedTime)); } c.rotateY(degrees); c.getMatrix(matrix); c.restore(); matrix.preTranslate(-cx,-cy); matrix.postTranslate(cx,cy); } }
帧动画:
帧动画就是一系列图片的顺序播放;
其中在xml文件中应该 这样写:
这么定义的! private AnimationDrawable t1_icon1_animationDrawable; private ImageView t1_icon1; //这是一个帧动画 animation-list 这样使用 t1_icon1.setImageResource(R.drawable.t1_frame_animation); t1_icon1_animationDrawable = (AnimationDrawable) t1_icon1.getDrawable(); t1_icon1_animationDrawable.start();
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false" ><!-- 根标签为animation-list,其中oneshot代表着是否只展示一遍,设置为false会不停的循环播放动画 根标签下,通过item标签对动画中的每一个图片进行声明 android:duration 表示展示所用的该图片的时间长度 --> <item android:drawable="@mipmap/tutorial1_icon1" android:duration="200"/> <item android:drawable="@mipmap/tutorial1_icon2" android:duration="200"/></animation-list>123456789101112131415123456789101112131415
属性动画:
动画默认时间间隔300ms,默认帧率10ms/帧等等,介绍不明白我。。。。
最常用的几个属性动画类:ValueAnimator、ObjectAnimator、AnimatorSet;
其中ObjectAnimator继承自ValueAnimator;
通过属性动画改编一个对象的背景颜色:
ValueAnimator animator = ObjectAnimator.ofInt(textView,"backgroundColor",/*Red*/0xFFFF8080,/*Blue*/0xFF8080FF); animator.setDuration(3000);//持续时间 animator.setEvaluator(new ArgbEvaluator()); animator.setRepeatCount(ValueAnimator.INFINITE);//无限播放,普及一个单词indefinitely无限的意思 animator.setRepeatMode(ValueAnimator.REVERSE);//逆过来播放 animator.start();
动画集合:注释写的明明白白^_* 可以逐条注释掉,然后试试就明白了
AnimatorSet animatorSet = new AnimatorSet(); animatorSet.playTogether( ObjectAnimator.ofFloat(textView,"rotationX", 0, 90 * 4),//x轴旋转一周 ObjectAnimator.ofFloat(textView, "rotationY", 0, 90 * 4),//y轴旋转一周,此时他两个混合在一起很不好思考究竟为什么会是这个造型!嘤嘤 ObjectAnimator.ofFloat(textView, "rotation", 0, 90*4),//z轴旋转一周(xyz的坐标轴就是普通的三维坐标轴,上面是y,右面是x,前面是z!^_^),此时他们三个一起旋转已经是很玄学了 ObjectAnimator.ofFloat(textView, "translationX", 0, 90),//x轴平移 ObjectAnimator.ofFloat(textView, "translationY", 0, 90),//y轴平移,平移没有z轴了!呦桑 ObjectAnimator.ofFloat(textView, "scaleX", 1, 2,1),//x缩放 ObjectAnimator.ofFloat(textView, "scaleY", 1, 0.1f,1),//y缩放 ObjectAnimator.ofFloat(textView, "alpha", 1, 0.25f, 1));//透明度1~0.25~1); animatorSet.setDuration(5 * 1000); animatorSet.start();
属性动画集合如果想要设置repeat等属性,定义出对象来,之后添加到set集合中去,因为repeat返回的是void,所以像上面写的匿名类写法不能实现。
属性动画当然也可以写到xml文件中去:写法与上面的view动画set相似,只不过是把子节点的名字改为属性动画的节点名字而已!
<objectAnimator android:propertyName="" android:duration="" android:repeatCount="" android:repeatMode="" android:valueFrom="" android:valueTo=""等!1212
以后或许会用到这个:
实现一个翻转到背面!再翻转回来的效果:关于属性动画,就是按照下面的方法,还是蛮简单的!就不介绍了(其实我真的介绍不明白)
大体思路就是两个view重叠,正面的显示,背面的不显示,然后利用动画正面从0°翻转到90°之后不显示,反面显示,反面从-90°到0°。以我的脑回路复杂程度来讲,理解这些需要。。。。不说了。
后来想了想,发现已经到90°了就已经看不见了,就不写alpha了哈!
下面是代码:
public class AnimationActivity extends AppCompatActivity implements View.OnClickListener { private TextView tv1, tv2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_animation2); tv1 = (TextView) findViewById(R.id.tv1); tv2 = (TextView) findViewById(R.id.tv2); tv1.setOnClickListener(this); tv2.setOnClickListener(this); } private boolean isFront = true; @Override public void onClick(View v) { flip(); } private void flip() { if (isFront) { flipAnination(tv1,tv2); }else{ flipAnination(tv2,tv1); } } private void flipAnination(View view1,final View view2) { ObjectAnimator animator1 = ObjectAnimator.ofFloat(view1, "rotationY", 0, 90).setDuration(2000); animator1.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { tv2.setClickable(false); tv1.setClickable(false); } @Override public void onAnimationEnd(Animator animation) { tv2.setClickable(true); tv1.setClickable(true); } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } }); animator1.start();//监听事件一定要写在start前面,否则,,,哼!。。。 ObjectAnimator animator2 = ObjectAnimator.ofFloat(view2, "rotationY", -90, 0).setDuration(2000); animator2.setStartDelay(2000); animator2.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { tv2.setClickable(false); tv1.setClickable(false); } @Override public void onAnimationEnd(Animator animation) { tv2.setClickable(true); tv1.setClickable(true); } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } }); animator2.start(); isFront = !isFront; } }123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
这里是xml代码:加了一个旋转90°,就看不见了呢! < ^_^ > !
<TextView android:id="@+id/tv1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" /> <TextView android:id="@+id/tv2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:rotationY="90" android:text="你好 世界!" />