说到andrid内部的动画,相信大部分的人第一时间想到的是Animation,对于android内的动画,小编先简单的介绍几种使用方法:
1.通过在res目录下新建一个anim文件夹并在其目录下新建属性动画的xml文件,通过MainActivity中通过函数调用即可:
例如我们可以在anim文件夹下面创建一个位移动画xml文件,如下
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="0"
android:toXDelta="100"
android:fromYDelta="0"
android:toYDelta="0"
android:duration="2000"
/>
</set>
里面具体的内容再次不做详细的讲述。我给他取名为alpha.xml
然后我们在MainActivity中通过Animation的loadAnimation方法调用属性动画即可。参考代码如下:
Animation loadAnimation;
ImageView image =(ImageView)findViewById(R.id.image);
loadAnimation =AnimationUtils.loadAnimation(this, R.anim.alpha);
image.startAnimation(loadAnimation);
2.直接在MainActivity中通过代码(用Animation)实现动画的创建和使用,代码参见下例子,TranslateAnimation animation = new TranslateAnimation(
0, 200,0,0);
animation.setDuration(1000);
animation.start();
ImageView image = (ImageView)findViewById(R.id.imageView1);
image.startAnimation(animation);
3.通过属性动画在主方法中创建动画
ImageView image = (ImageView)findViewById(R.id.imageView1);
ObjectAnimator.ofFloat(image, "rotation", 0, 360F).setDuration(1000).start();
通过上面的代码就可以实现简单旋转的属性动画,更多的属性动画使用技巧参见下面的代码片段
PropertyValuesHolder p1 = PropertyValuesHolder.ofFloat("rotation",0F,360F);
PropertyValuesHolder p2 = PropertyValuesHolder.ofFloat("translationX",0F,100F);
PropertyValuesHolder p3 = PropertyValuesHolder.ofFloat("translationY",0F,360F);
ObjectAnimator.ofPropertyValuesHolder(image,p1,p2,p3).setDuration(1000).start();
上述代码实现了多个属性动画的叠加,简单介绍一下上面的代码我们前面使用的
ObjectAnimator其实是继承自PropertyValuesHolder的,我们可以通过PropertyValuesHolder实现很多我们意想不到的功能,我们不多做介绍,主要讲一下PropertyValuesHolder.ofFloat("rotation",0F,360F);中的参数,其中"rotation"代表旋转动画,后面的参数代表从多少度旋转到多少度,为浮点数,所以我们在数字后面加了F,
PropertyValuesHolder.ofFloat("translationX",0F,100F);中"translationX"代表在x方向上的位移,后面的参数代表从起始x坐标移动终点x的坐标。
然后我们可以指定动画的先后顺序,参见代码,如下:
ObjectAnimator animator3 =ObjectAnimator.ofFloat(image, "translationY", 0, 200F);
ObjectAnimator animator2 =ObjectAnimator.ofFloat(image, "translationX", 0, 200F);
ObjectAnimator animator1 =ObjectAnimator.ofFloat(image, "rotation", 0, 360F);
AnimationSet set = new AnimationSet();
set.setDuration(1000);
set.paly(animation1).after(animator2);
set.paly(animation2).with(animation3);
set.palyTogether(animator1,animator2,animator3);
set.start();
···································································
最后我们总结一下,属性动画和一瓶动画的区别:主要区别就是监听事件位置的变化,
1.在属性动画中,我们给我们的动画上添加监听事件时,当我们的位置发生变化时,我们的监听事件跟随我们添加了监听时间的控件上。
2.一般动画中,当我们的控件发生位置变化时,我们的监听事件的位置还是在控件原来的位置,
最后,附上动态弹出菜单的源码:
https://github.com/Reoger/animation.git