在上一篇文章末尾我提出了三点不足 ,遂本篇主要是为了解决上篇的不足之处。
对于上一篇的不足之处 有三点 :
1. 特效动画死板,变化速度死板;
2. 特效动画不能设置动画时间,如遇到高分辨率的机型,动画时间会变长。
3. view只能水平伸缩,不能竖直伸缩。
对于第一点不足之处变化速度死板,我立马想到了Android中Interpolator类,对于做过Android中动画的同学
来说,这个类应该并不陌生,该类可以改变动画的变化速率,它的直接子类中有
BounceInterpolator 弹球效果
AccelerateInterpolator 加速
LinearInterpolator 匀速
更多子类可请查阅Android开发文档
它有个getInterpolation (float input) 方法,你可以传入动画消逝时间值(input范围 [0,1] ),0代表开始,1代表
结束,获取变化速率。等会儿代码中有用到这个类。
有关插值器可参考: android动画(一)Interpolator
对于第一二三点不足,我写了辅助类StretchAnimation可以解决。欢迎批评指正。
StretchAnimation只负责view水平拉伸或者垂直拉伸。你可以设置动画的时间,你可以设置它的插值器,改变动
画的效果。下面该类的实现过程。
[java]
public class StretchAnimation {
private final static String TAG = "SizeChange";
private Interpolator mInterpolator; // 好多书上翻译为插值器
private View mView; // 你要伸缩的view
private int mCurrSize; //当前大小
private int mRawSize;
private int mMinSize; // 最小大小 固定值
private int mMaxSize; // 最大大小 固定值
private boolean isFinished = true;// 动画结束标识
private TYPE mType = TYPE.vertical;
private final static int FRAMTIME = 20;// 一帧的时间 毫秒
public static enum TYPE {
horizontal, // 改变view水平方向的大小
vertical // 改变view竖直方向的大小
}
private int mDuration; // 动画运行的时间
private long mStartTime;// 动画开始时间
private float mDurationReciprocal;
private int mDSize; // 需要改变view大小的增量
public StretchAnimation(int maxSize, int minSize, TYPE type, int duration) {
if (minSize >= maxSize) {
throw new RuntimeException("View的最大改变值不能小于最小改变值");
}
mMinSize = minSize;
mMaxSize = maxSize;
mType = type;
mDuration = duration;
}
public void setInterpolator(Interpolator interpolator) {
mInterpolator = interpolator;
}
public TYPE getmType() {
return mType;
}
public boolean isFinished() {
return isFinished;
}
public void setDuration(int duration) {
mDuration = duration;
}
private void changeViewSize() {
if (mView != null && mView.getVisibility() != View.GONE) {
LayoutParams params = mView.getLayoutParams();
if (mType == TYPE.vertical) {
params.height = mCurrSize;
} else if (mType == TYPE.horizontal) {
params.width = mCurrSize;
}
Log.i(TAG, "CurrSize = " + mCurrSize + " Max=" + mMaxSize + " min="
+ mMinSize);
mView.setLayoutParams(params);
}
}
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 1) {
if (!computeViewSize()) {
mHandler.sendEmptyMessageDelayed(1, FRAMTIME);
} else {
if (animationlistener != null) {
animationlistener.animationEnd(mView);
}
}
}
super.handleMessage(msg);
}
};
/**
* @return 返回true 表示动画完成
*/
private boolean computeViewSize() {
if (isFinished) {
return isFinished;
}
int timePassed = (int) (AnimationUtils.currentAnimationTimeMillis() - mStartTime);
if (timePassed <= mDuration) {
float x = timePassed * mDurationReciprocal;
if (mInterpolator != null) {
x = mInterpolator.getInterpolation(x);
}
mCurrSize = mRawSize + Math.round(x * mDSize);
} else {
补充:移动开发 , Android ,