大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新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);
}
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/181569.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...