• Android动画


    Android当中的四种Animation动画:

    1.Tween Animation 变换动画

    2.Frame Animation 帧动画

    3.Layout Animation 布局动画

    4.Property Animation 属性动画

    实现原理:每次绘制视图时view所在的viewGroup函数获取该view的Animation的Transformation值,然后调用canvas.concat(transformToApply.getMatrix()),通过矩阵运算完成动画帧。如果动画没有完成,就继续调用invalidate()函数,启动下次绘制来驱动动画,从而完成整个动画的绘制。

    Tween Animation

    Alpha:渐变透明度动画

    Scale:渐变尺寸缩放动画

    Translate:位置移动动画

    Rotate:旋转动画

    共同属性:

    (1)Duration:动画持续时间(单位:毫秒)

    (2)fillAfter:设置为true,动画转换在动画结束之后被应用

    (3)fillBefore:设置为true,动画转换在动画开始之前被应用

    (4)interpolator:动画插入器(加速/减速插入器)

    (5)repeateCount:动画重复次数

    (6)repeateMode:顺序重复/倒序重复

    (7)startOffeset:动画之间的时间间隔

    Animation实现方式:

    (1)配置文件(/res/anim)—— alpha、scale、translate、rotate

    (2)java代码实现 —— AlphaAnimation、ScaleAnimation、TranslateAnimation、RotateAnimation

    示例:

    java代码方式:

    //创建Alpha动画,透明度从10%到100%
    Animation alpha = new AlphaAnimation(0.1f, 1.0f);
    //设置时间间隔为5秒
    alpha.setDuration(5000);
    //开始播放
    img.startAnimation(alpha);

    加载布局文件方式:

    <?xml version="1.0" encoding="utf-8"?>
    <ScaleAnimation xmlns:android="http://schemas.android.com/apk/res/android"
        android:duration="1000"
        android:valueFrom="1.0"
        android:valueTO="2.0"
    </ScaleAnimation>
    //创建动画
    Animation scale = AnimationUtils.loadAnimation(TweenActivity.this, R.res.anim.scale_anim);
    //开始播放
    img.startAnimation(scale);

    AlphaAnimation 透明度动画

    (1)fromAlpha:动画起始时的透明度

    (2)toAlpha:动画终止时的透明度

    0.0表示完全透明,1.0表示完全不透明

    ScaleAnimation 伸缩动画

    (1)fromXScale、toXScale:分别是动画起始和结束时x坐标的伸缩尺寸

    (2)fromYScale、toYScale:分别是动画起始和结束时y坐标的伸缩尺寸

    (3)pivotX、pivotY:分别是伸缩动画相对于x、y坐标开始的位置(50%、50%代表当前图片的中心位置)

    TranslateAnimation 位移动画

    (1)fromXDelta、fromYDelta:分别是位移之前的x、y坐标

    (2)toXDelta、toYDelta:分别是位移之后的x、y坐标

    RotateAnimation 旋转动画

    (1)fromDegrees、toDegrees:分别是动画旋转前和旋转后的角度

    (2)pivotX、pivotY:分别是旋转动画相对于x、y的坐标开始位置

    实现动画续播:

    (1)实现onAnimationListener接口

    (2)设置延迟时间startOffset

    (3)利用Animation的setRepeatCount和setRepeatMode来实现动画的循环播放

    Activity切换动画:

    使用overidePendingTransition方法

    参数:第二个Activity进入时的动画,第一个Activity退出时的动画

    LayoutAnimation布局动画

    为view Groups添加动画

    使用LayoutAnimationController

    FramLayout逐帧动画

    使用animation-list标签来分组一个item标签集合

    定义要显示的图片

    指定显示的时间(以毫秒为单位)

    属性动画Animator与传统动画Animation

    Animation是不断调用ondraw方法重绘界面来实现动画效果,Animator是调用操纵属性的get、set方法真实的改变一个属性。

    Animation只是重绘了动画,响应位置没有发生相应的改变,不断的重绘界面,耗费资源

    ObjectAnimator

    //使用单个动画
    ObjectAnimator.ofFloat(imageView, "TranslationX", 0F, 200F).setDuration(1000).start(); //使用多个动画连播
    PropertyValuesHolder pvh1 = PropertyValuesHolder.ofFloat(translationX, 300f);
    PropertyValuesHolder pvh2 = PropertyValuesHolder.ofFloat("scaleX", 1f, 0.1f); ObjectAnimator.ofPropertyValusHolder(view, pvh1, pvh2).setDuration(1000).start();

    //使用AnimatorSet实现动画连播 AnimatorSet set
    = new AnimatorSet(); set.playTogether(animator1, animator2, animator3); set.setDuration(1000); set.start();

     使用PropertyValuesHolder和AnimatorSet都可以实现动画连播,AnimatorSet能实现更为精细的顺序控制。通过playTogether()、playSequentially()、animSet.play().with()、before()、after()这些方法来控制多个动画的协同工作方式,从而做到对多个动画播放顺序的精细控制。

    动画的监听事件

    一个完整的动画具有Start、Repeat、End、Cancel四个过程,通过Android提供的借口,可以很方便的监听到这四个事件。

    animator.addListener(new AnimatorListener() {
    
      @Override
    
      public void onAnimationStart(Animator animation) {}
    
      @Override
    
      public void onAnimationRepeat(Animator animation) {}
    
      @Override
    
      public void onAnimationEnd(Animator animation) {}
    
      @Override
    
      public void onAnimationCancel(Animator animation) {}
    
    });

    可以使用AnimatorListenerApdater来选择实现我们关心的事件。

    ValueAnimator

    ValueAnimator本身不提供任何动画,它更像一个数值发生器,用来产生具有一定规律的数字,从而让调用者来控制动画的实现过程。

    ValueAnimator animator = ValueAnimator.ofFloat(1, 100);
    animator.setTarget(view);
    animator.setDuration(1000).start();
    animator.addUpdateListener(new AnimatorUpdateListener() {
        @Override
        private void onAnimationUpdate(ValueAnimator animation) {
            float value = animation.getAnimatedValue();
        }    
    });

    view的animate方法

    Android3.0后,Google给View增加了animate方法来直接驱动属性动画。

    view.animate()
            .alpha(0)
            .y(300)
            .setDuration(300)
            .withStartAction(new Runnable() {
                @Override
                 public void run() {
                }         
            }) 
            .withEndAction( {
                @Override
                 public void run() {
                     runOnUiThread(new Runnable() {
                         @Override
                          public void run() {
                          }
                     }); 
                 }    
            }).start();

    Interpolators 插值器

    通过插值器,可以定义动画变换速率

    animator.setInterpolator();

    自定义动画

    applyTransfomation(float interpolatedTime, Transformation t);

    public Animation myAnim() {
            Animation animation = new Animation() {
                float mCenterWidth;
                float mCenterHeight;
                int mRotateY = -50;
                Camera mCamera = new Camera();
                @Override
                public void initialize(int width, int height, int parentWidth, int parentHeight) {
                    super.initialize(width, height, parentWidth, parentHeight);
                    //设置默认时长
                    setDuration(2000);
                    //动画结束后保留状态
                    setFillAfter(true);
                    //设置默认插值器
                    setInterpolator(new BounceInterpolator());
                    mCenterHeight = height/2;
                    mCenterWidth = width/2;
                }
    
                @Override
                protected void applyTransformation(float interpolatedTime, Transformation t) {
                    super.applyTransformation(interpolatedTime, t);
                    final android.graphics.Matrix matrix = t.getMatrix();
                    mCamera.save();
                    //使用Camera设置旋转的角度
                    mCamera.rotateY(mRotateY * interpolatedTime);
                    //将旋转变换作用到matrix上
                    mCamera.getMatrix(matrix);
                    mCamera.restore();
                    //通过pre方法设置矩阵作用前的偏移量来改变旋转中心
                    matrix.preTranslate(mCenterWidth, mCenterHeight);
                    matrix.postTranslate(-mCenterWidth, -mCenterHeight);
                }
            };
            return animation;
        }
  • 相关阅读:
    【解题报告】洛谷P3959 宝藏
    【游记】CSP-S2021 退役记
    【全程NOIP计划】初赛
    【解题报告】luoguP2158 仪仗队
    mysql的索引
    Set集合的所有方法
    字符串数组String[]转换成Long类型数组Long[]
    查询记录时排序问题updateTime和createTime
    VUE中== 与 ===的区别以及!=与!==的区别
    Django 模型(ORM)
  • 原文地址:https://www.cnblogs.com/cisol/p/5940819.html
Copyright © 2020-2023  润新知