补间动画缓动_ppt补间动画在哪里

补间动画缓动_ppt补间动画在哪里ScaleAnimation是尺寸变化动画的类,控制View的尺寸变化。ScaleAnimation类官方文档:https://developer.android.com/reference/android/view/animation/ScaleAnimation.html关于父类Animation的详解可参考文章:http://blog.csdn.net/ruancod

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用
ScaleAnimation是尺寸变化动画的类,控制View的尺寸变化。

ScaleAnimation类官方文档:


https://developer.android.com/reference/android/view/animation/ScaleAnimation.html

关于父类Animation的详解可参考文章:


http://blog.csdn.net/ruancoder/article/details/52347243

一、ScaleAnimation的使用

(1).使用xml文件创建ScaleAnimation

属性说明:


android:fromXScale:动画开始前在X坐标的大小。


android:fromYScale:动画开始前在Y坐标的大小。


android:toXScale:动画结束后在X坐标的大小。


android:toYScale:动画结束后在Y坐标的大小。


android:pivotX:缩放中心点的X坐标。


android:pivotY:缩放中心点的Y坐标。

示例代码:

以view中心为缩放点,X和Y方法各扩大一倍。

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
     android:duration="3000">
    <scale
        android:fromXScale="100%"
        android:fromYScale="100%"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="200%"
        android:toYScale="200%"/>
</set>

(2).使用java代码创建ScaleAnimation

示例代码:

// 以view中心为缩放点,由初始状态放大两倍
ScaleAnimation animation = new ScaleAnimation(
        1.0f, 2.0f, 1.0f, 2.0f,
        Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f
);
animation.setDuration(3000);
view.startAnimation(animation);

// 以view左上角,X轴增加100px,Y轴增加200px,为缩放点,由初始状态放大两倍
ScaleAnimation animation = new ScaleAnimation(1.0f, 2.0f, 1.0f, 2.0f, 100.0f, 200.0f);
animation.setDuration(3000);
view.startAnimation(animation);

// 以view左上角为缩放点,由初始状态放大两倍
ScaleAnimation animation = new ScaleAnimation(1.0f, 2.0f, 1.0f, 2.0f);
animation.setDuration(3000);
view.startAnimation(animation);

二、ScaleAnimation的分析

ScaleAnimation继承自Animation,除了拥有父类的属性外,添加了mFromX、mToX、mFromY、mToY和mPivotXType、mPivotXValue、mPivotYType、mPivotYValue八个属性。这个八个属性可以通过构造方法或xml属性传入。

public class ScaleAnimation extends Animation {
    private float mFromX;
    private float mToX;
    private float mFromY;
    private float mToY;
    private int mFromXType = TypedValue.TYPE_NULL;
    private int mToXType = TypedValue.TYPE_NULL;
    private int mFromYType = TypedValue.TYPE_NULL;
    private int mToYType = TypedValue.TYPE_NULL;


    private int mPivotXType = ABSOLUTE;
    private int mPivotYType = ABSOLUTE;
    private float mPivotXValue = 0.0f;
    private float mPivotYValue = 0.0f;
    private float mPivotX;
    private float mPivotY;
}

mPivotX和mPivotY最终参与动画的计算,在ABSOLUTE类型下,mPivotXValue和mPivotYValue会赋值给mPivotX和mPivotY。initializePivotPoint()方法在构造方法中调用。

private float mPivotX;
private float mPivotY;

private void initializePivotPoint() {
    if (mPivotXType == ABSOLUTE) {
        mPivotX = mPivotXValue;
    }
    if (mPivotYType == ABSOLUTE) {
        mPivotY = mPivotYValue;
    }
}

使用java代码的方式创建ScaleAnimation,传入八个参数,fromX、toX、fromY、toY和pivotXType、pivotXValue、pivotYType、pivotYValue,使用如下构造方法。

参数说明:


fromX:动画开始前在X坐标的大小。


toX:动画结束后在X坐标的大小。


fromY:动画开始前在Y坐标的大小。


toY:动画结束后在Y坐标的大小。


pivotXType:缩放中心点的X坐标类型。取值范围为ABSOLUTE、RELATIVE_TO_SELF、RELATIVE_TO_PARENT。


pivotXValue:缩放中心点的X坐标值。当pivotXType==ABSOLUTE时,表示绝对位置;否则表示相对位置,1.0表示100%。


pivotYType:缩放中心点的Y坐标类型。


pivotYValue:缩放中心点的Y坐标。

public ScaleAnimation(float fromX, float toX, float fromY, float toY,
                      int pivotXType, float pivotXValue, int pivotYType, float pivotYValue) {
    mResources = null;
    mFromX = fromX;
    mToX = toX;
    mFromY = fromY;
    mToY = toY;


    mPivotXValue = pivotXValue;
    mPivotXType = pivotXType;
    mPivotYValue = pivotYValue;
    mPivotYType = pivotYType;
    initializePivotPoint();
}

使用java代码的方式创建ScaleAnimation,传入六个参数,fromX、toX、fromY、toY和pivotX、pivotY,使用如下构造方法。

此时,mPivotXType和mPivotYType为ABSOLUTE。

public ScaleAnimation(float fromX, float toX, float fromY, float toY,
                      float pivotX, float pivotY) {
    mResources = null;
    mFromX = fromX;
    mToX = toX;
    mFromY = fromY;
    mToY = toY;


    mPivotXType = ABSOLUTE;
    mPivotYType = ABSOLUTE;
    mPivotXValue = pivotX;
    mPivotYValue = pivotY;
    initializePivotPoint();
}

使用java代码的方式创建ScaleAnimation,传入四个参数,fromX、toX、fromY、toY,使用如下构造方法。

此时,mPivotXType和mPivotYType为ABSOLUTE,mPivotX和mPivotY为0。

public ScaleAnimation(float fromX, float toX, float fromY, float toY) {
    mResources = null;
    mFromX = fromX;
    mToX = toX;
    mFromY = fromY;
    mToY = toY;
    mPivotX = 0;
    mPivotY = 0;
}

当使用xml文件的方式创建ScaleAnimation时,由AnimationUtils工具类加载动画文件,使用如下构造方法,通过xml中的属性来获取值。

private int mFromXData = 0;
private int mToXData = 0;
private int mFromYData = 0;
private int mToYData = 0;

public ScaleAnimation(Context context, AttributeSet attrs) {
    super(context, attrs);

    mResources = context.getResources();

    TypedArray a = context.obtainStyledAttributes(attrs,
            com.android.internal.R.styleable.ScaleAnimation);

    // fromXScale
    TypedValue tv = a.peekValue(
            com.android.internal.R.styleable.ScaleAnimation_fromXScale);
    mFromX = 0.0f;
    if (tv != null) {
        if (tv.type == TypedValue.TYPE_FLOAT) {
            // This is a scaling factor.
            mFromX = tv.getFloat();
        } else {
            mFromXType = tv.type;
            mFromXData = tv.data;
        }
    }
    // toXScale
    tv = a.peekValue(
            com.android.internal.R.styleable.ScaleAnimation_toXScale);
    mToX = 0.0f;
    if (tv != null) {
        if (tv.type == TypedValue.TYPE_FLOAT) {
            // This is a scaling factor.
            mToX = tv.getFloat();
        } else {
            mToXType = tv.type;
            mToXData = tv.data;
        }
    }
    // fromYScale
    tv = a.peekValue(
            com.android.internal.R.styleable.ScaleAnimation_fromYScale);
    mFromY = 0.0f;
    if (tv != null) {
        if (tv.type == TypedValue.TYPE_FLOAT) {
            // This is a scaling factor.
            mFromY = tv.getFloat();
        } else {
            mFromYType = tv.type;
            mFromYData = tv.data;
        }
    }
    // toYScale
    tv = a.peekValue(
            com.android.internal.R.styleable.ScaleAnimation_toYScale);
    mToY = 0.0f;
    if (tv != null) {
        if (tv.type == TypedValue.TYPE_FLOAT) {
            // This is a scaling factor.
            mToY = tv.getFloat();
        } else {
            mToYType = tv.type;
            mToYData = tv.data;
        }
    }
    // pivotX
    Animation.Description d = Animation.Description.parseValue(a.peekValue(
            com.android.internal.R.styleable.ScaleAnimation_pivotX));
    mPivotXType = d.type;
    mPivotXValue = d.value;
    // pivotY
    d = Animation.Description.parseValue(a.peekValue(
            com.android.internal.R.styleable.ScaleAnimation_pivotY));
    mPivotYType = d.type;
    mPivotYValue = d.value;

    a.recycle();

    initializePivotPoint();
}

完成成员变量的初始化后,接下来进入动画的计算。核心在于重写父类Animation的initialize()和applyTransformation()方法。

initialize()方法中,根据构造方法或xml属性传入的值,结合当前View和父View的宽高,计算出缩放的中心点位置和X、Y轴缩放的大小。

float resolveScale(float scale, int type, int data, int size, int psize) {
    float targetSize;
    if (type == TypedValue.TYPE_FRACTION) {
        targetSize = TypedValue.complexToFraction(data, size, psize);
    } else if (type == TypedValue.TYPE_DIMENSION) {
        targetSize = TypedValue.complexToDimension(data, mResources.getDisplayMetrics());
    } else {
        return scale;
    }

    if (size == 0) {
        return 1;
    }

    return targetSize/(float)size;
}

@Override
public void initialize(int width, int height, int parentWidth, int parentHeight) {
    super.initialize(width, height, parentWidth, parentHeight);

    mFromX = resolveScale(mFromX, mFromXType, mFromXData, width, parentWidth);
    mToX = resolveScale(mToX, mToXType, mToXData, width, parentWidth);
    mFromY = resolveScale(mFromY, mFromYType, mFromYData, height, parentHeight);
    mToY = resolveScale(mToY, mToYType, mToYData, height, parentHeight);

    mPivotX = resolveSize(mPivotXType, mPivotXValue, width, parentWidth);
    mPivotY = resolveSize(mPivotYType, mPivotYValue, height, parentHeight);
}


applyTransformation()方法负责动画的执行。在动画从开始倒结束的过程中,参数interpolatedTime从0.0递增到1.0。通过不断的调整sx和sy的值,调用Matrix的setScale()方法,达到缩放View的效果。

@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
    float sx = 1.0f;
    float sy = 1.0f;
    float scale = getScaleFactor();

    if (mFromX != 1.0f || mToX != 1.0f) {
        sx = mFromX + ((mToX - mFromX) * interpolatedTime);
    }
    if (mFromY != 1.0f || mToY != 1.0f) {
        sy = mFromY + ((mToY - mFromY) * interpolatedTime);
    }

    if (mPivotX == 0 && mPivotY == 0) {
        t.getMatrix().setScale(sx, sy);
    } else {
        t.getMatrix().setScale(sx, sy, scale * mPivotX, scale * mPivotY);
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/181569.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Chromium-Dev一些缩写

    Chromium-Dev一些缩写

    2022年1月7日
    44
  • jiaowubuaa_acm题

    jiaowubuaa_acm题每一头牛的愿望就是变成一头最受欢迎的牛。现在有 N 头牛,编号从 1 到 N,给你 M 对整数 (A,B),表示牛 A 认为牛 B 受欢迎。这种关系是具有传递性的,如果 A 认为 B 受欢迎,B 认为 C 受欢迎,那么牛 A 也认为牛 C 受欢迎。你的任务是求出有多少头牛被除自己之外的所有牛认为是受欢迎的。输入格式第一行两个数 N,M;接下来 M 行,每行两个数 A,B,意思是 A 认为 B 是受欢迎的(给出的信息有可能重复,即有可能出现多个 A,B)。输出格式输出被除自己之外的所有牛认为是

    2022年8月9日
    5
  • 手把手教你训练自己的Mask R-CNN图像实例分割模型(PyTorch官方教程)

    手把手教你训练自己的Mask R-CNN图像实例分割模型(PyTorch官方教程)近来在学习图像分割的相关算法,准备试试看MaskR-CNN的效果。关于MaskR-CNN的详细理论说明,可以参见原作论文https://arxiv.org/abs/1703.06870,网上也有大量解读的文章。本篇博客主要是参考了PyTorch官方给出的训练教程,将如何在自己的数据集上训练MaskR-CNN模型的过程记录下来,希望能为感兴趣的读者提供一些帮助。PyTorch官方教程(…

    2022年8月23日
    12
  • 易企秀的制作方法和步骤_易企秀制作流程

    易企秀的制作方法和步骤_易企秀制作流程虽然易企秀邀请函日渐被广大网友所知,也有很多网友在自己制作易企秀,但仍有很多想要制作易企秀,却自己不会制作的朋友,不得不花大价钱请他人制作,所以我们特地为您准备了一个如何快速学会制作易企秀的教程。打开

    2022年8月4日
    5
  • java json字符串转list集合

    java json字符串转list集合StringjsonString=”[{“plateNumber”:”1″,”holeNumber”:”A02″,”qcType”:”L”,”value”:”2.36″}”,{“plateNumber”:”1″,”holeNumber”:”A03″,”qcType”:”M”,”value”:”5.36″}]List<QcPlate>listQcPlate=newArr…

    2022年5月14日
    42
  • linux安装telnet服务「建议收藏」

    linux安装telnet服务「建议收藏」文章目录前言一、telnet是什么?二、使用步骤1.安装telent2、重新启动守护进程3、测试总结前言最新公司需要迁移项目需要用到telnet命令,趁此机会做个总结归纳提示:以下是本篇文章正文内容,下面案例可供参考一、telnet是什么?telnet是一种简单的基于文本的网络协议,用于通过“TCP/IP”网络访问远程计算机和终端;telnet为用户提供了一个双向的交互式文本通信系统,该系统使用超过8字节的虚拟终端连接。二、使用步骤1.安装telent步骤如下:tep1、rpm.

    2025年7月9日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号