加入收藏 | 设为首页 | 会员中心 | 我要投稿 52刷机网 (https://www.52shuaji.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 安卓频道 > 安卓资讯 > 正文

App研发中三种动画使用和属性详解

发布时间:2021-12-07 12:44:45 所属栏目:安卓资讯 来源:互联网
导读:这次我们介绍一下android中动画的分类: View Animation(补间动画); Drawable Animation(帧动画); Property Animation(属性动画); 一、帧动画 帧动画是顺序播放一组预先定义好的图片,不同于View动画,系统提供了另外一个类AnimationDrawable来使用帧动画; 帧
这次我们介绍一下android中动画的分类:
 
View Animation(补间动画);
 
Drawable Animation(帧动画);
 
Property Animation(属性动画);
 
一、帧动画
帧动画是顺序播放一组预先定义好的图片,不同于View动画,系统提供了另外一个类AnimationDrawable来使用帧动画;
 
帧动画顾名思义就是通过顺序一帧一帧播放图片从而产生动画效果,效果类似放电影;
 
该动画缺点比较明显,就是如果图片过大过多会导致OOM。帧动画xml文件放置在drawable目录下而非anim文件夹下;
 
帧动画的使用
 
首先我们找一组帧动画的图片放入drawable-xhdpi文件夹下,其次在drawable文件夹下创建xml文件,如下所示:
 
<?xml version="1.0" encoding="utf-8"?>
<animation-list
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">
    <item android:drawable="@drawable/refresh1" android:duration="180"/>
    <item android:drawable="@drawable/refresh2" android:duration="180"/>
    ...
    <item android:drawable="@drawable/refresh25" android:duration="180"/>
</animation-list>
view = findViewById(R.id.test);
        view.setBackgroundResource(R.drawable.drawable_test_anim);
        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                AnimationDrawable animationDrawable = (AnimationDrawable) view.getBackground();
                animationDrawable.start();
            }
        });
属性介绍
 
<animation-list> 必须是根节点,包含一个或者多个<item>元素,属性有:
android:oneshot true代表只执行一次,false循环执行;
<item> 类似一帧的动画资源;
<item> animation-list的子项,包含属性如下:
android:drawable 一个frame的Drawable资源;
android:duration 一个frame显示多长时间;
二、补间动画
补间动画是通过对view进行旋转、缩放、渐变、透明度变化,而达到的一种动画效果;
 
是一种渐进式动画。并且可以通过组合以上四种操作,完成复杂的自定义动画效果;
 
缺点就是只是改变的view的展示状态,但是不会改变view的位置;
 
 
 
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="4000"
    android:fillAfter="true"
    android:fillBefore="true"
    android:interpolator="@[package:]anim/interpolator_resource"
    android:repeatMode="restart | reverse"
    android:repeatCount = “0”
    android:shareInterpolator="true"
    android:startOffset="float">
    <alpha
        android:fromAlpha="float"
        android:toAlpha="float" />
    <scale
        android:fromXScale="float"
        android:fromYScale="float"
        android:pivotX="float"
        android:pivotY="float"
        android:toXScale="float"
        android:toYScale="float" />
    <rotate
        android:fromDegrees="float"
        android:pivotX="float"
        android:pivotY="float"
        android:toDegrees="float" />
    <translate
        android:fromXDelta="float"
        android:fromYDelta="float"
        android:toXDelta="float"
        android:toYDelta="float" />
</set>
通用属性说明:
 
android:duration=""动画时长,单位毫秒
android:fillAfter="true"动画完成后是否停留在结束位置,默认false
android:fillBefore="true"动画完成后是否停留在起点位置。默认true,优先级低于fillAfter
android:interpolator为动画的变化速度【可以单独设置,可以直接放在set里面】
android:repeatMode="restart | reverse"动画重复策略 restart从起点位置(正序)重复,reverse从结束位置(倒序)重复
android:repeatCount = “0”重复次数 “infinite”为无线重复
android:shareInterpolator="true"动画集合中的动画是否公用一个差值器
android:startOffset="float"动画延迟时间
透明度动画
 
透明度动画,通过改变view的透明度展示动画。对应AlphaAnimation和xml标签
android:fromAlpha="float" 起始透明度,取值范围(-1.0~1.0)
android:toAlpha="float"结束时透明度,取值范围(-1.0~1.0)
缩放动画
 
缩放动画,通过修改view的大小展示动画。对应ScaleAnimation类和xml表情
android:fromXScale="float"动画在水平方向X的起始缩放倍数
android:fromYScale="float"动画在水平方向Y的结束缩放倍数
android:toXScale="float"动画在竖直方向X的结束缩放倍数
android:toYScale="float"动画在竖直方向Y的结束缩放倍数
android:pivotX="float"缩放中心点的x坐标
android:pivotY="float"缩放中心点的y坐标
旋转动画
 
通过旋转view展示动画。对应RotateAnimation类和xml标签
android:fromDegrees="float"动画开始时 视图的旋转角度(正数 = 顺时针,负数 = 逆时针)
android:toDegrees="float"动画结束时 视图的旋转角度(正数 = 顺时针,负数 = 逆时针)
android:pivotX="float"旋转中心点的x坐标 具体如上缩放中心点参数解释
android:pivotY="float"旋转中心点的y坐标 具体如上缩放中心点参数解释
平移动画
 
平移动画,更改view的展示位置展示动画。对应TranslateAnimation类和 xml表情
android:fromXDelta="float"view在水平x方向的起始值
android:fromYDelta="float"view在水平y方向的起始值
android:toXDelta="float"view在水平x方向的结束值
android:toYDelta="float" view在水平y方向的结束值
具体动画的使用
应用动画xml配置
 
TextView textDemo = findViewById(R.id.text_demo);
Animation animation = AnimationUtils.loadAnimation(getApplicationContext(),R.anim.rotate_animation_test);
textDemo.startAnimation(animation);
使用java类配置动画,具体参数类同xml参数,建议使用xml配置动画
 
AlphaAnimation alphaAnimation = new AlphaAnimation(1.0f, 2.0f);
textDemo.startAnimation(alphaAnimation);
监听动画
 
alphaAnimation.setAnimationListener(new Animation.AnimationListener() {
    @Override
    public void onAnimationStart(Animation animation) {
        //动画开始回调
    }
    @Override
    public void onAnimationEnd(Animation animation) {
        //动画结束回调
    }
    @Override
    public void onAnimationRepeat(Animation animation) {
        //动画重复时回调
    }
});
三、属性动画
属性动画本质是通过改变对象的属性(例如:x,y等属性),来实现动画的,所以基本上是无所不能的,只要对象有这个属性,就能实现动画效果;
 
属性动画是在api 11的新特性,通过动态的改变view的属性从而达到动画效果。虽然可以使用nineoldandroid库向下兼容,但是兼容本质是使用补间动画完成,也就是说不会更改view的属性,也不会更改view的位置;
 
属性动画比较常用的类:ValueAnimator、ObjectAnimator、AnimationSet,其中ObjectAnimator是ValueAnimator的子类,而AnminationSet是动画集合;
 
1.单个动画
 
ObjectAnimator animator = ObjectAnimator
        .ofInt(textDemo, "backgroundColor", 0XffFF0000, 0Xff0000FF)
        .setDuration(2000);
animator.setRepeatMode(ValueAnimator.RESTART);
animator.setRepeatCount(10);
animator.start();
2.动画集合
 
AnimatorSet animatorSet = new AnimatorSet();
ValueAnimator translationX = ObjectAnimator.ofFloat(textDemo, "translationX", 200f);
ValueAnimator animator = ObjectAnimator
        .ofInt(textDemo, "backgroundColor", 0XffFF0000, 0Xff0000FF);
animatorSet.playTogether(translationX,animator);
animatorSet.setDuration(1000).start();
动画配置同样可以使用xml配置;
 
3.差值器和估值器
差值器(Interpolator)
 
根据时间流逝百分比计算当前属性改变百分比。同xml配置动画中的 android:interpolator属性配置,常见有LinearInterpolator(线性差值器)、AccelerateDecelerateInterpolator(加速减速差值器)等。自定义需要实现Interpolator或者TimeInterpolator。Interpolator接口继承TimeInterpolator;
 
// Interpolator接口
public interface Interpolator extends TimeInterpolator{  
    // 内部只有一个方法
     float getInterpolation(float input) {   
         // 参数说明
         // input值值变化范围是0-1,且随着动画进度(0% - 100% )均匀变化
        // 即动画开始时,input值 = 0;动画结束时input = 1
        // 而中间的值则是随着动画的进度(0% - 100%)在0到1之间均匀增加
      ...// 插值器的计算逻辑
      return xxx;
      // 返回的值就是用于估值器继续计算的fraction值,下面会详细说明
    }   
// TimeInterpolator接口
// 同上
public interface TimeInterpolator {   
    float getInterpolation(float input);   
}
估值器(TypeEvaluator)
 
根据当前属性改变百分比计算改变后的属性值。属性动画特有的属性;自定义估值器需要实现TypeEvaluator接口;
 
public interface TypeEvaluator {   
    public Object evaluate(float fraction, Object startValue, Object endValue) {   
// 参数说明
// fraction:插值器getInterpolation()的返回值
// startValue:动画的初始值
// endValue:动画的结束值
        ....// 估值器的计算逻辑
        return xxx;
        // 赋给动画属性的具体数值
        // 使用反射机制改变属性变化
可以对任意属性做属性动画,属性动画要求动画作用的对象提供该属性的get()和set()方法。因为属性动画本质就是根据外界传递的对象属性的初始值和终点值,然后根据估值器和差值器计算属性值,不断调用属性的set方法,通过时间的推移所传递的值,越来越近终点值;
 
注意:
 
对象属性必须提供对应的set方法,而且如果没有初始值传入的情况下必须要设置get方法,因为 系统要获取初始值,如果没有满足条件则程序cash;
 
对象属性的set方法对属性做出改变,需要能够通过某种方法表示出来。带来ui展示效果的改变。否则动画不会生效;
 
ValueAnimator
 
使用ValueAnimator通过监听动画过程,自己改变对象属性完成动画
 
ValueAnimator valueAnimator = ValueAnimator.ofInt(1, 100);
        valueAnimator.setDuration(2000);//动画持续时间
        valueAnimator.setRepeatCount(0);//重复次数
        valueAnimator.setRepeatMode(ValueAnimator.REVERSE);//重复方式,
        valueAnimator.setStartDelay(20);//开始前延迟时间
        valueAnimator.setEvaluator(new IntEvaluator());//估值器
        valueAnimator.setInterpolator(new LinearInterpolator());//差值器
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                //获取当前动画属性值,即1~100
                Integer animatedValue = (Integer) animation.getAnimatedValue();
                //获取动画的百分比
                float animatedFraction = animation.getAnimatedFraction();
                ViewGroup.LayoutParams layoutParams = textView.getLayoutParams();
                int width = layoutParams.width;
                int height = layoutParams.height;
                layoutParams.height = height + 1;
                layoutParams.width=width+1;
                Log.e(TAG,"animatedValue: "+animatedValue+" animatedFraction : "+animatedFraction
                +" width : "+layoutParams.width+" height : "+layoutParams.height);
                textView.requestLayout();
            }
        });
        valueAnimator.start();
    }
四、注意事项
OOM注意,在帧动画中如果图片过大、数量过多容易出现;
 
内存泄漏, 切记在activity销毁时,停止动画。否则一些无限循环动画将导致activity不能释放而内存泄漏。出现在属性动画中,view动画不存在此类问题;
 
View动画即补间动画,是改变view的视觉位置,改变view的影像展示位置,而不改变真实位置;注意交互体验。可能会出现view动画结束后,view无法隐藏的问题及setVisibility(View.GONE)失效。此时调用view.clearAnimation()清除动画。可修复此类问题;

(编辑:52刷机网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读