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"><scaleandroid: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);// fromXScaleTypedValue 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;}}// toXScaletv = 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;}}// fromYScaletv = 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;}}// toYScaletv = 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;}}// pivotXAnimation.Description d = Animation.Description.parseValue(a.peekValue(com.android.internal.R.styleable.ScaleAnimation_pivotX));mPivotXType = d.type;mPivotXValue = d.value;// pivotYd = 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);}
}

补间动画详解五 缩放动画ScaleAnimation相关推荐

  1. android动画详解二 属性动画原理

    property动画是一个强大的框架,它几乎能使你动画任何东西.你可以定义一个动画来改变对象的任何属性,不论其是否被绘制于屏幕之上.一个属性动画在一定时间内多次改变一个属性(对象的一个字段)的值.要动 ...

  2. Android的三种动画详解(帧动画、View动画、属性动画)

    Android的动画分为了三种, 分别是 帧动画.View动画.属性动画. 1.帧动画 帧动画就是顺序播放一组预先定义好的图片,就类似于我们观看视频,就是一张一张的图片连续播放. 帧动画的使用很简单, ...

  3. 骨骼动画详解 和 帧动画

     骨骼动画 vs. 精灵表(sprite sheets) 创建动画又快又简单的方法是使用"精灵表"(sprite sheets).当你意识到游戏需要大量动画,内存消耗会涨上来, ...

  4. iOS动画详解(学习动画看这一篇就够了)

    2019独角兽企业重金招聘Python工程师标准>>> 原文出处:wu大维 动效设计一直是iOS平台的优势,良好的动效设计可以很好地提升用户体验.而动画则是动效的基础支撑.本动画将从 ...

  5. Android动画详解之Android 动画属性和实现方法之帧动画(二)

    一.简介 Frame Animation(AnimationDrawable对象):帧动画,就像GIF图片,通过一系列Drawable依次显示来模拟动画的效果. 必须以<animation-li ...

  6. Linux 进程间通讯详解五

    msgrcv函数 ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,int msgflg); --功能:是从一个消息队列接 ...

  7. [转] ReactNative Animated动画详解

    http://web.jobbole.com/84962/ 首页 所有文章 JavaScript HTML5 CSS 基础技术 前端职场 工具资源 更多频道▼ - 导航条 -首页所有文章JavaScr ...

  8. android动画详解

    转自:工匠若水 http://blog.csdn.net/yanbober 1 背景 不能只分析源码呀,分析的同时也要整理归纳基础知识,刚好有人微博私信让全面说说Android的动画,所以今天来一发A ...

  9. Android 属性动画 详解

    Android 属性动画 详解 Android动画类型: View Animation(即所谓的Tween Animation补间动画):View Animation相当简单,不过只能支持简单的缩放. ...

最新文章

  1. Sharepoint the file is locked for use domain\user edit.文件被锁定,解锁方式
  2. java s字符_java 字符集s
  3. 02---控制移动底座4
  4. html 超链接打开Excel,计算机打开Excel超链接时提示的解决方案
  5. Tomcat的配置和优化
  6. iOS CoreData简单入门 - Swift版
  7. 什么是分布式数据库中间件
  8. linux优化服务器,Linux服务器优化
  9. android 连接已保存的wifi,手机连接WiFi显示已保存但是连接不上
  10. JAVA 的成员变量和局部变量
  11. 程序员必备的十个工具
  12. 基于帕累托的多目标遗传算法优化的原理与 Python 实现
  13. java实用型:mybatis的好帮手-MybatisCodeHelperPro
  14. 【小程序自动化Minium】二、元素定位-Page接口中的 get_element() 与 get_elements()
  15. 使用google高级搜索技巧
  16. 距离及相似度度量方法
  17. 【排序算法】冒泡排序、简单选择排序、直接插入排序比较和分析
  18. Java单元测试、反射、注解
  19. 系统性综述:特征点检测与匹配
  20. JAVA实现Excel照相机功能_Excel2010中的照相机功能如何使用?

热门文章

  1. 拱猪java_模拟——拱猪积分题解
  2. 如何屏蔽快压广告的弹出
  3. 最近最少使用算法(LRU)
  4. 转载——cmake入门教程
  5. 如何理解 select * from B where (select count(1) as num from A where A.ID = B.ID) = 0
  6. [BZOJ1112]砖块klo Treap
  7. PyInstaller天坑终极攻略(PyInstaller莫名报错?面对错误信息无从下手?全网找不到解决方法?面对PyInstaller中的那些莫名天坑不如和我一起手动打包python解释器和项目)
  8. Java8 stream流的演示
  9. 看图识物_《看图识物》.pdf
  10. 计算机网络教学方式探讨论文,网络教学模式下计算机教育改革探讨论文