Android动画之------View动画

1、原理:
          Animation框架定义了透明度、旋转、缩放和位移几种常见的动画。
          view动画控制的是整个的view,实现原理是每次绘制视图的时候,view所在的ViewGroup中的drawChild函数获取该View的Animation的Transformation值,然后调用canvas.concat(transformToApply.getMatrix()),通过矩阵运算完成动画帧。如果动画没有完成,就继续调用invalidate()函数,启动下次绘制来驱动动画,从而完成整个动画的绘制。
          缺点:不能做与用户交互的动作
          有点:效率快

2、动画代码具体实现:
2.1透明动画
AlphaAnimation aa=new AlphaAnimation(0,1);//设置透明度;设置动画终止的透明度
aa.setDuration(1000);//设置动画效果
view.startAnimation(aa);  //指定视图开启动画

2.2旋转动画
/**
*设置以view中心点旋转:
* RotateAnimation ra=new RotateAnimation(0,360,RotateAnimation.RELATIVE_TO_SELF,0.5F,RotateAnimation.RELATIVE_TO_SELF,0.5F);
*/
RotateAnimation ra=new RotateAnimation(0,360,100,100);//设置旋转角度;;设置旋转中心点
ra.setDuration(1000);
view.startAnimation(ra);


2.3位移动画
TranslateAnimation ta=new TranslateAnimation(0,200,0,300);//X轴坐标开始时的位置;X轴坐标结束时的变化;Y.....;Y........;
 ta.setDuration(1000);
view.startAnimation(ta);

2.4缩放动画
/**
 *设置以view中心点旋转:
 * ScaleAnimation sa=new ScaleAnimation(1,2,1,2, Animation.RELATIVE_TO_SELF,0.5F,Animation.RELATIVE_TO_SELF,0.5F);
 */
ScaleAnimation sa=new ScaleAnimation(0,2,0,2);
sa .setDuration(1000);//设置动画效果
view.startAnimation(sa);

2.5集合动画
AnimationSet set=new AnimationSet(true);
AlphaAnimation aaa=new AlphaAnimation(0.5f,1);
aaa.setDuration(1000);
set.addAnimation(aaa);
TranslateAnimation taa=new TranslateAnimation(0,200,0,300);
taa.setDuration(1000);
set.addAnimation(taa);
view.startAnimation(set);

3、动画监听方法
 animation.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) { //动画开始的回调

            }

            @Override
            public void onAnimationEnd(Animation animation) { //动画结束的回调

            }

            @Override
            public void onAnimationRepeat(Animation animation) { //动画重复的回调

            }
});

4、常用API汇总
xml属性java方法解释
android:detachWallpapersetDetachWallpaper(boolean)是否在壁纸上运行
android:durationsetDuration(long)动画持续时间,毫秒为单位
android:fillAftersetFillAfter(boolean)控件动画结束时是否保持动画最后的状态
android:fillBeforesetFillBefore(boolean)控件动画结束时是否还原到开始动画前的状态
android:fillEnabledsetFillEnabled(boolean)与android:fillBefore效果相同
android:interpolatorsetInterpolator(Interpolator)设定插值器(指定的动画效果,譬如回弹等)
android:repeatCountsetRepeatCount(int)重复次数
android:repeatModesetRepeatMode(int)重复类型有两个值,reverse表示倒序回放,restart表示从头播放
android:startOffsetsetStartOffset(long)调用start函数之后等待开始运行的时间,单位为毫秒
android:zAdjustmentsetZAdjustment(int)表示被设置动画的内容运行时在Z轴上的位置(top/bottom/normal),默认为normal





5、 Alpha属性详解
xml属性java方法解释
android:fromAlphaAlphaAnimation(float fromAlpha, …)动画开始的透明度(0.0到1.0,0.0是全透明,1.0是不透明)
android:toAlphaAlphaAnimation(…, float toAlpha)动画结束的透明度,同上
6、 Rotate属性详解
xml属性java方法解释
android:fromDegreesRotateAnimation(float fromDegrees, …)旋转开始角度,正代表顺时针度数,负代表逆时针度数
android:toDegreesRotateAnimation(…, float toDegrees, …)旋转结束角度,正代表顺时针度数,负代表逆时针度数
android:pivotXRotateAnimation(…, float pivotX, …)缩放起点X坐标(数值、百分数、百分数p,譬如50表示以当前View左上角坐标加50px为初始点、50%表示以当前View的左上角加上当前View宽高的50%做为初始点、50%p表示以当前View的左上角加上父控件宽高的50%做为初始点)
android:pivotYRotateAnimation(…, float pivotY)缩放起点Y坐标,同上规律
7、 Scale属性详解
xml属性java方法解释
android:fromXScaleScaleAnimation(float fromX, …)初始X轴缩放比例,1.0表示无变化
android:toXScaleScaleAnimation(…, float toX, …)结束X轴缩放比例
android:fromYScaleScaleAnimation(…, float fromY, …)初始Y轴缩放比例
android:toYScaleScaleAnimation(…, float toY, …)结束Y轴缩放比例
android:pivotXScaleAnimation(…, float pivotX, …)缩放起点X轴坐标(数值、百分数、百分数p,譬如50表示以当前View左上角坐标加50px为初始点、50%表示以当前View的左上角加上当前View宽高的50%做为初始点、50%p表示以当前View的左上角加上父控件宽高的50%做为初始点)
android:pivotYScaleAnimation(…, float pivotY)缩放起点Y轴坐标,同上规律

8、 Translate属性详解
xml属性java方法解释
android:fromXDeltaTranslateAnimation(float fromXDelta, …)起始点X轴坐标(数值、百分数、百分数p,譬如50表示以当前View左上角坐标加50px为初始点、50%表示以当前View的左上角加上当前View宽高的50%做为初始点、50%p表示以当前View的左上角加上父控件宽高的50%做为初始点)
android:fromYDeltaTranslateAnimation(…, float fromYDelta, …)起始点Y轴从标,同上规律
android:toXDeltaTranslateAnimation(…, float toXDelta, …)结束点X轴坐标,同上规律
android:toYDeltaTranslateAnimation(…, float toYDelta)结束点Y轴坐标,同上规律





9、 视图动画使用方法(建议把下面的代码做成模板放到AS的快捷模板里,用的时候直接调用出来做修改)
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@style/Animation.AppCompat.DropDownUp"
    android:shareInterpolator="true">
    <!--透明度动画-->
    <!--fromAlpha:起始透明度-->
    <!--toAlpha:动画结束的透明度-->
    <alpha
        android:fromAlpha="float"
        android:toAlpha="float" />
    <!--缩放动画-->
    <!--fromXScale:初始x轴缩放比例   1.0表示无变化-->
    <!--fromYScale:初始Y轴缩放比例-->
    <!--pivotX:缩放起点X轴坐标(数值、百分数、百分数p,譬如50表示以当前View左上角坐标加50px为初始点、
    50%表示以当前View的左上角加上当前View宽高的50%做为初始点、50%p表示以当前View的左上角加上父控件宽高的50%做为初始点)-->
    <!--pivotY:缩放起点Y轴坐标,同上规律-->
    <!--toXScale:结束X轴缩放比例-->
    <!--toYScale:结束Y轴缩放比例-->
    <scale
        android:fromXScale="float"
        android:fromYScale="float"
        android:pivotX="float"
        android:pivotY="float"
        android:toXScale="float"
        android:toYScale="float" />
    <!--位移动画-->
    <!--fromXDelta:起始点X轴坐标(数值、百分数、百分数p,譬如50表示以当前View左上角坐标加50px为初始点、
    50%表示以当前View的左上角加上当前View宽高的50%做为初始点、50%p表示以当前View的左上角加上父控件宽高的50%做为初始点)-->
    <!--fromYDelta:起始点Y轴从标,同上规律-->
    <!--toXDelta:结束点X轴坐标,同上规律-->
    <!--toYDelta:结束点Y轴坐标,同上规律-->
    <translate
        android:fromXDelta="float"
        android:fromYDelta="float"
        android:toXDelta="float"
        android:toYDelta="float" />
    <!--旋转动画-->
    <!--fromDegrees:旋转开始角度,正代表顺时针度数,负代表逆时针度数-->
    <!--pivotX:缩放起点X坐标(数值、百分数、百分数p,譬如50表示以当前View左上角坐标加50px为初始点、
    50%表示以当前View的左上角加上当前View宽高的50%做为初始点、50%p表示以当前View的左上角加上父控件宽高的50%做为初始点)-->
    <!--pivotY:缩放起点Y坐标,同上规律-->
    <!--toDegrees:旋转结束角度,正代表顺时针度数,负代表逆时针度数-->
    <rotate
        android:fromDegrees="float"
        android:pivotX="float"
        android:pivotY="float"
        android:toDegrees="float" />
    <set>
        ...
    </set>
</set>



ImageView spaceshipImage = (ImageView) findViewById(R.id.spaceshipImage);
Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);
spaceshipImage.startAnimation(hyperspaceJumpAnimation);

 

上面就是一个标准的使用我们定义的补间动画的模板。至于补间动画的使用,Animation还有如下一些比较实用的方法介绍:

Animation类的方法解释
reset()重置Animation的初始化
cancel()取消Animation动画
start()开始Animation动画
setAnimationListener(AnimationListener listener)给当前Animation设置动画监听
hasStarted()判断当前Animation是否开始
hasEnded()判断当前Animation是否结束


既然补间动画只能给View使用,那就来看看View中和动画相关的几个常用方法吧,如下:

View类的常用动画操作方法解释
startAnimation(Animation animation)对当前View开始设置的Animation动画
clearAnimation()取消当View在执行的Animation动画


10、 视图动画注意事项

特别特别注意:补间动画执行之后并未改变View的真实布局属性值。切记这一点,譬如我们在Activity中有一个Button在屏幕上方,我们设置了平移动画移动到屏幕下方然后保持动画最后执行状态呆在屏幕下方,这时如果点击屏幕下方动画执行之后的Button是没有任何反应的,而点击原来屏幕上方没有Button的地方却响应的是点击Button的事件。

11 视图动画Interpolator插值器详解


11.1 插值器简介

介绍补间动画插值器之前我们先来看一幅图,如下:

这里写图片描述

可以看见其实各种插值器都是实现了Interpolator接口而已,同时可以看见系统提供了许多已经实现OK的插值器,具体如下:

java类xml id值描述
AccelerateDecelerateInterpolator@android:anim/accelerate_decelerate_interpolator动画始末速率较慢,中间加速
AccelerateInterpolator@android:anim/accelerate_interpolator动画开始速率较慢,之后慢慢加速
AnticipateInterpolator@android:anim/anticipate_interpolator开始的时候从后向前甩
AnticipateOvershootInterpolator@android:anim/anticipate_overshoot_interpolator类似上面AnticipateInterpolator
BounceInterpolator@android:anim/bounce_interpolator动画结束时弹起
CycleInterpolator@android:anim/cycle_interpolator循环播放速率改变为正弦曲线
DecelerateInterpolator@android:anim/decelerate_interpolator动画开始快然后慢
LinearInterpolator@android:anim/linear_interpolator动画匀速改变
OvershootInterpolator@android:anim/overshoot_interpolator向前弹出一定值之后回到原来位置
PathInterpolator 新增,定义路径坐标后按照路径坐标来跑。

如上就是系统提供的一些插值器,下面我们来看看怎么使用他们。


11.2 插值器使用方法
<set android:interpolator="@android:anim/accelerate_interpolator">
    ...
</set>
11.3 插值器的自定义

有时候你会发现系统提供的插值器不够用,可能就像View一样需要自定义。所以接下来我们来看看插值器的自定义,关于插值器的自定义分为两种实现方式,xml自定义实现(其实就是对现有的插值器的一些属性修改)或者java代码实现方式。如下我们来说说。

11.3.1
先看看XML自定义插值器的步骤:
     1)在res/anim/目录下创建filename.xml文件。
     2)修改你准备自定义的插值器如下:
<?xml version="1.0" encoding="utf-8"?>
<InterpolatorName xmlns:android="http://schemas.android.com/apk/res/android"
    android:attribute_name="value"/>
      3)在你的补间动画文件中引用该文件即可。

可以看见上面第二步修改的是现有插值器的一些属性,但是有些插值器却不具备修改属性,具体如下:
<accelerateDecelerateInterpolator>                        无可自定义的attribute。
<accelerateInterpolator>                      android:factor 浮点值,加速速率(默认值为1)。
<anticipateInterploator>                      android:tension 浮点值,起始点后拉的张力数(默认值为2)。
<anticipateOvershootInterpolator>             android:tension 浮点值,起始点后拉的张力数(默认值为2)。 android:extraTension 浮点值,拉力的倍数(默认值为1.5)  
<bounceInterpolator>                                                    无可自定义的attribute。
<cycleInterplolator>                                                    android:cycles 整形,循环的个数(默认为1)。
<decelerateInterpolator>                                            android:factor 浮点值,减速的速率(默认为1)。
<linearInterpolator>                                                    无可自定义的attribute。
<overshootInterpolator>                       android:tension 浮点值,超出终点后的张力(默认为2)。
11.3.2

再来看看Java自定义插值器的(Java自定义插值器其实是xml自定义的升级,也就是说如果我们修改xml的属性还不能满足需求,那就可以选择通过Java来实现)方式。

可以看见上面所有的Interpolator都实现了Interpolator接口,而Interpolator接口又继承自TimeInterpolator,TimeInterpolator接口定义了一个float getInterpolation(float input);方法,这个方法是由系统调用的,其中的参数input代表动画的时间,在0和1之间,也就是开始和结束之间。

如下就是一个动画始末速率较慢、中间加速的AccelerateDecelerateInterpolator插值器:

public class AccelerateDecelerateInterpolator extends BaseInterpolator
        implements NativeInterpolatorFactory {
    ......
    public float getInterpolation(float input) {
        return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;
    }
    ......
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值