安卓动画学习(View动画)
动画的分类
An animation resource can define one of two types of animations:
Property Animation
Creates an animation by modifying an object's property values over a set period of time with an Animator.
View Animation
There are two types of animations that you can do with the view animation framework:
Tween animation: Creates an animation by performing a series of transformations on a single image with an Animation
Frame animation: or creates an animation by showing a sequence of images in order with an AnimationDrawable.
- Property Animation():通过在一段时间内修改一个对象的属性值来实现动画的效果
- View Animation(视图动画):这个分两类,一类叫做补间动画,是在一段时间内对单个图像执行一系列变换来达到动画的效果,一类是帧动画,一段时间之内按顺序连续显示一系列的图像来达到动画的效果
先来看补间动画介绍
- 在XML中定义的动画,可在一段时间内修改目标对象的属性,如背景颜色或Alpha值。
- 文件位置,res/animator/filename.xml(当然名字自己随意,这里只不过是官方建议)
- 动画属性
属性 |
效果 |
alpha |
渐变透明度动画效果 |
scale |
渐变尺寸伸缩动画效果 |
translate |
画面转换位置移动动画效果 |
rotate |
画面转移旋转动画效果 |
scale--调节尺寸
android:fromXScale
android:toXScale
android:fromYScale
android:toYScale
android:pivotX
android:pivotY
- 这六种属性很容易理解,一对xy只能,表示缩放起点,一对表示缩放开始时相对自身比例,一对表示缩放结束相对自身比例
- 可以看到,我们只能设置开始时的大小和位置以及动画完毕的大小,却不能设置动画完毕的位置,系统是默认他完成之后的位置与与动画之前是相同的
alpha —— 透明度
android:fromAlpha
android:toAlpha
rotate —— 旋转
android:fromDegrees
android:toDegrees
android:pivotX
android:pivotY
translate —— 平移
android:fromXDelta
android:fromYDelta
android:toXDelta
android:toYDelta
- 上面是scale本身的属性,因为Animation类是所有动画(scale、alpha、translate、rotate)的基类,所以Animation类所具有的属性对其子类也适用
android:duration
android:fillAfter
android:fillBefore
android:fillEnabled
android:repeatCount
android:repeatMode
android:interpolator
android:startOffset
补间动画用法
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXScale="0.0"
android:toXScale="0.8"
android:fromYScale="0.0"
android:toYScale="0.8"
android:pivotX="50"
android:pivotY="50"
android:duration="1000"
android:fillAfter="true"
>
</scale>
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="3000"
android:fillAfter="true">
<alpha />
<scale />
<rotate />
</set>
- 注意:set 本身是没有属性的,它所使用的是从基类继承的属性,当他set根节点设置属性时,这个属性会作用到set结点里面所有结点
- 代码中的使用
final Animation animator = AnimationUtils.loadAnimation(this,R.anim.animation);
final ImageView iv = findViewById(R.id.main_Iv);
iv.startAnimation(animator);
举例
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:repeatMode="restart"
android:repeatCount="5"
>
<scale
android:fromXScale="0.0"
android:toXScale="0.8"
android:fromYScale="0.0"
android:toYScale="0.8"
android:pivotX="50"
android:pivotY="50"/>
<alpha
android:fromAlpha="0"
android:toAlpha="1"/>
<rotate
android:pivotY="100"
android:pivotX="100"
android:fromDegrees="0"
android:toDegrees="360"/>
<translate
android:fromXDelta="100"
android:fromYDelta="100"
android:toXDelta="200"
android:toYDelta="200"/>
</set>
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Animation animator = AnimationUtils.loadAnimation(this,R.anim.animation);
final ImageView iv = findViewById(R.id.main_Iv);
Button bt = findViewById(R.id.main_Bt);
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
iv.startAnimation(animator);
}
});
}
- 效果图
- 这里的重复次数我是在set中写的,所以重复效果没出来,最后看到开发文档
duration,repeatMode,fillBefore,fillAfter:这些属性在AnimationSet对象上设置时,将被推送到所有子动画。
repeatCount,fillEnabled:AnimationSet会忽略这些属性。
startOffset,shareInterpolator:这些属性适用于AnimationSet本身。
这里再解释一下插值器的作用
- 他就是作用在动画效果之上,使动画局部变快或者变慢之类的,这里看一下他的一些取值和意义
AccelerateDecelerateInterpolator
AccelerateInterpolator
AnticipateInterpolator
AnticipateOvershootInterpolator
BounceInterpolator
CycleInterpolator
DecelerateInterpolator
LinearInterpolator
OvershootInterpolator
在代码生成动画
上面的动画是写在xml文件中的,接下来我说说在代码中生成动画的方法
- 很容易理解,android为刚才每个动画标签提供了一个类
xml结点 |
类名 |
scale |
ScaleAnimation |
alpha |
AlphaAnimation |
rotate |
RotateAnimation |
translate |
TranslateAnimation |
set |
AnimationSet |
这些其实都很好理解,没啥说的,我们先来看一下动画的基类Animation
- android为他的每一种xml属性都对应了一种set方法,例如
android:duration setDuration(long) 动画持续时间,以毫秒为单位
ScaleAnimation
ScaleAnimation(Context context, AttributeSet attrs)
ScaleAnimation(float fromX, float toX, float fromY, float toY)
ScaleAnimation(float fromX, float toX, float fromY, float toY, float pivotX, float pivotY)
ScaleAnimation(float fromX, float toX, float fromY, float toY, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
- 前三个参数跟xml文件中一样,float值全都表示精准值,可以直接理解,第四个的xy刚开始位置参数变成了Type,我们来看看官方文档
参数 |
含义 |
ABSOLUTE |
指定的尺寸是像素的绝对数量 |
RELATIVE_TO_PARENT |
指定一个浮点数,并且应该乘以被动画的对象的父级的高度或宽度 |
RELATIVE_TO_SELF |
指定一个浮点数,并且应该乘以被动画的对象的高度或宽度 |
- 嗯,这里我就只拿了官方文档跟这里有关的几个类型常量,意思也好理解,就不再阐述
AlphaAnimation
AlphaAnimation(Context context, AttributeSet attrs)
AlphaAnimation(float fromAlpha, float toAlpha)
RotateAnimation
RotateAnimation(Context context, AttributeSet attrs)
RotateAnimation(float fromDegrees, float toDegrees)
RotateAnimation(float fromDegrees, float toDegrees, float pivotX, float pivotY)
RotateAnimation(float fromDegrees, float toDegrees, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
- 这里的最后一个构造参数也出现了类型常量这个参数,跟第一个一样,不再说明
TranslateAnimation
TranslateAnimation(Context context, AttributeSet attrs)
TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta)
TranslateAnimation(int fromXType, float fromXValue, int toXType, float toXValue, int fromYType, float fromYValue, int toYType, float toYValue)
最后看一下他们的集合类AnimationSet
AnimationSet(Context context, AttributeSet attrs) //同样,基本不用
AnimationSet(boolean shareInterpolator) //shareInterpolator取值true或false,取true时,指在AnimationSet中定义一个插值器(interpolater),它下面的所有动画共同。如果设为false,则表示它下面的动画自己定义各自的插值器。
- 再来看一下他的一些常用方法,或者可以去看一下官方文档
方法 |
用法 |
addAnimation(Animation a) |
为此动画集添加一个子动画。 |
reset() |
重置此动画的初始化状态。 |
restrictDuration(long durationMillis) |
确保此动画运行的持续时间不超过durationMillis。 |
scaleCurrentDuration(float scale) |
多少时间通过缩放。 |
setDuration(long durationMillis) |
设置每个子动画的持续时间 |
setStartOffset(long startOffset) |
设置动画开始时的延迟 |
再来说一下插值器的类
- 他们的基类Animation也同样为他们提供了一个设置插值器的方法
setInterpolator(Interpolator i)
- 而Interpolator这个只是一个接口,不过他有一些实现类
header 1 |
header 2 |
AccelerateDecelerateInterpolato |
内插器,其变化率开始和结束缓慢,但通过中间加速。 |
AccelerateInterpolator |
内插器,其中变化率开始缓慢,然后加速。 |
AnticipateInterpolator |
内插器,其中变化开始向后并向前闪烁 |
AnticipateOvershootInterpolator |
一个内插器,其中变化开始向后,然后向前闪烁并超过目标值,最后返回到最终值。 |
BounceInterpolator |
插值器,其中的变化在最后反弹 |
DecelerateInterpolator |
一个内插器,其中变化率开始快速然后减速。 |
OvershootInterpolator |
一个内插器,其中变化向前闪烁并超过最后一个值然后返回。 |
CycleInterpolator |
将动画重复指定的循环次数。变化率遵循正弦模式。 |
LinearInterpolator |
内插器的变化率是恒定的 |
PathInterpolator |
可以遍历从to 延伸的Path的插补器。 |
- 其中,CycleInterpolator这个类的构造参数有两个
- CycleInterpolator(float cycles)
- CycleInterpolator(Context context, AttributeSet attrs)
- 关于第一个构造方法参数官方的解释是将动画重复指定的循环次数。变化率遵循正弦模式。稍微试验了一下,不是特别懂,以后写到再看吧
- 再说一下最后一个插值器实现类
PathInterpolator(Path path)
PathInterpolator(float controlX, float controlY)
PathInterpolator(float controlX1, float controlY1, float controlX2, float controlY2)
PathInterpolator(Context context, AttributeSet attrs)
- 说到底就是给他一个路径,具体的再去实验吧,这里就不细说了
总结
- 这样的设置控件动画其实是不能改变控件自身原有的属性的,他改变的只是显示的属性,比如我们用这种方法实现一个可点击的按钮平移之后,按钮的点击事件还是只能通过点击原来的地方来响应点击事件,而平移后的按钮是不能响应点击事件的