• 安卓属性动画



    一.三种安卓动画

    1. Tween Animation(补间动画、视图动画):通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生的动画效果,即是一种渐变动画。

    2. Frame Animation(帧动画):顺序播放事先做好的图像,是一种画面转换动画。

    3. Property Animation:属性动画,通过动态地改变对象的属性从而达到动画效果,属性动画为API 11新特性。

    二.属性动画的优点

    1.属性动画是通过阈值器来调整的,可以高效完成简单的动画效果,从而节约内存空间。

    2.对比帧动画,是通过图片的切换来实现动画效果的,可以实现复杂的动画效果但是非常耗内存。

    3.属性动画多用于控件的状态变化,而帧动画用于展现复杂且连续的图片,比如短视频等。

    三.属性动画实例

    1.效果展示

    在这里插入图片描述

    2.关键代码

    .xml布局文件,采用线性布局,四个button和一个image


    MainActive代码

    (1)moveView方法,修改view的位置,后续可调用该方法设置起始坐标及宽高

    private void moveView(View view, int rawX, int rawY) {
    int left = rawX - view.getWidth() / 2;
    int top = rawY - view.getHeight();
    int weight = left + view.getWidth();
    int height = top + view.getHeight();
    view.layout(left, top, weight, height);
    }
    (2)动画的实现

    按钮1,直线移动代码实现

    @Override
    public void onClick(View view) {
    //获取总布局的宽和高
    int width = ly_root.getWidth();
    int height = ly_root.getHeight();
    ValueAnimator va = ValueAnimator.ofInt(height, 0, height / 4, height / 2, height / 4 * 3, height);
    va.setDuration(3000l);
    va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator valueAnimator) {
    int x = width / 2;
    int y = (int) va.getAnimatedValue();
    moveView(img_babi, x, y);
    }
    });
    va.setInterpolator(new LinearInterpolator());
    va.start();
    }
    按钮二,缩放

    @Override
    public void onClick(View view) {
    final float scale = 0.5f;
    AnimatorSet scaleSet = new AnimatorSet();
    ValueAnimator vaSmall = ValueAnimator.ofFloat(1.0f, scale);
    vaSmall.setDuration(500);

    ValueAnimator vaLarge = ValueAnimator.ofFloat(scale, 1.0f);
    vaLarge.setDuration(500);
    vaSmall.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator valueAnimator) {
            float scale = (float) valueAnimator.getAnimatedValue();
            img_babi.setScaleX(scale);
            img_babi.setScaleY(scale);
        }
    });
    vaLarge.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
        @Override
        public void onAnimationUpdate(ValueAnimator valueAnimator) {
            float scale = (float) valueAnimator.getAnimatedValue();
            img_babi.setScaleX(scale);
            img_babi.setScaleY(scale);
        }
    });
    scaleSet.play(vaLarge).after(vaSmall);
    scaleSet.start();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    }
    按钮三,旋转

    @Override
    public void onClick(View view) {
    int width = ly_root.getWidth();
    int height = ly_root.getHeight();
    final int R = width / 4;
    ValueAnimator va = ValueAnimator.ofFloat(0, (float) (2.0f * Math.PI));
    va.setDuration(1000);
    va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator valueAnimator) {
    float t = (float) valueAnimator.getAnimatedValue();
    int x = (int) (R * Math.sin(t) + width / 2);
    int y = (int) (R * Math.cos(t) + height / 2);
    moveView(img_babi, x, y);
    }
    });
    va.setInterpolator(new DecelerateInterpolator());
    va.start();
    }
    按钮四,圆形旋转

    @Override
    public void onClick(View view) {
    ValueAnimator va = ValueAnimator.ofInt(0, 360);
    va.setDuration(1000l);
    va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator valueAnimator) {
    int rotate = (Integer) valueAnimator.getAnimatedValue();
    img_babi.setRotation(rotate);
    float fractionValue = valueAnimator.getAnimatedFraction();
    img_babi.setAlpha(fractionValue);
    }
    });
    va.setInterpolator(new DecelerateInterpolator());
    va.start();

    }
    3.代码功能总结

    ofFloat,ofInt方法用来创建ValueAnimator实例

    set…方法可以用来设置动画持续时间等

    start()方法可以开启动画

    原文链接:

    guoguoguoyaonuli

    http://t.csdn.cn/vzwEj

  • 相关阅读:
    LeetCode每日两题01:有序数组的平方 (均1200道)方法:双指针
    PB系统函数介绍:共享对象函数
    论文基本功——LaTeX:公式及其编号
    k8s学习-持久化存储(Volumes、hostPath、emptyDir、PV、PVC)详解与实战
    LLM大模型 (chatgpt) 在搜索和推荐上的应用
    ctfshow 文件上传 151-161
    2.经典项目-海量用户即使通讯系统
    零信任安全:构建无懈可击的网络防护体系
    机器人技术概述_1.机器人的概念及定义和发展历程
    如何定制化跑腿小程序源码
  • 原文地址:https://blog.csdn.net/fjnu_se/article/details/128179691