1:补间动画仅仅可以对view进行操作,对其他对象就不可以执行动画。
补间动画不是真正的改变view的属性,当对view做移动动画时 其实本质上view的位置并没有发生变化。
ValueAnimator详见:
//设置动画执行取值区间 valueAnimator= ValueAnimator.ofInt(0,2);
//设置插值器 fraction的计算实现 valueAnimator.setInterpolator(aci);
//动画执行时间 valueAnimator.setDuration(3000);
//设置动画重复执行的模式
valueAnimator.setRepeatMode();
//设置开始执行动画的延时时间
valueAnimator.setStartDelay(2000);
//设置重复次数
valueAnimator.setRepeatCount();
//立即在此时结束动画执行
valueAnimator.cancel();
//立即结束动画执行 并且立即执行动画到最后
valueAnimator.end();
//设置动画的估值器
valueAnimator.setEvaluator(new FloatEvaluator());
//添加动画执行过程的监听 自定义动画时根据这个值来设置动画执行的进度 valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener()
//开始执行动画
valueAnimator.start();
//判断动画是否还在执行中
valueAnimator.isRunning()
Interpolator
插值器 自定义插值器:(就是根据数学中的曲线来个方程 计算每个阶段的值)
class MyInterpolator implements TimeInterpolator { @Override public float getInterpolation(float input) { pos = -4 * input * input + 4 * input + 1; Log.d(TAG, "getInterpolation: pos==" + pos); return 0; } }
注意:我们这个地方计算的结果就是 animation.getAnimatedFraction() 的结果
这个就是插值器的作用
估值器:TypeEvaluator 作用就是决定 animation.getAnimatedValue() 返回对象的类型
实例:
valueAnimator= ValueAnimator.ofObject(new MyEvaluator(),0,1);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { Position position= (Position) animation.getAnimatedValue(); } }); }
class MyEvaluator implements TypeEvaluator{ @Override public Object evaluate(float fraction, Object startValue, Object endValue) { return new Position(100*fraction,100*fraction); } } ObjectAnimator AnimatorSet AnimatorSet set = new AnimatorSet(); ObjectAnimator animatorX = ObjectAnimator.ofFloat(v, "scaleX", scaleX); 属性动画的变幻类型: translationY backgroundColor rotationX rotationY rotation translationX translationY scaleX scaleY alpha 属性动画直接可以变换的要求是已经给这个对象设置了get set方法 否则不可以使用相关属性进行变换 如何我们向设置一个width属性变换一个view的宽度 但是没有这个属性对应的get set方法 实现思路下面三个: 1:用一个类来包装原始对象,间接为其提供get和set方法
ObjectAnimator animator=ObjectAnimator.ofInt(new ViewWraper(but),"width",10,300); animator.setDuration(3000); animator.setInterpolator(new LinearInterpolator()); animator.start();
class ViewWraper{ private View mTarget; public ViewWraper(View mTarget) { this.mTarget = mTarget; } public int getWidth(){ return mTarget.getLayoutParams().width; } public void setWidth(int width){ mTarget.getLayoutParams().width=width; mTarget.requestLayout(); } }
2:通过ValueAnimator监听动画的进程实现手动更新view属性
ValueAnimator valueAnimator = ValueAnimator.ofInt(1, 100);
valueAnimator.addUpdateListener(new AnimatorUpdateListener() {
//持有一个IntEvaluator对象,方便下面估值的时候使用
private IntEvaluator mEvaluator = new IntEvaluator();
@Override
public void onAnimationUpdate(ValueAnimator animator) {
//获得当前动画的进度值,整型,1-100之间
int currentValue = (Integer)animator.getAnimatedValue();
Log.d(TAG, "current value: " + currentValue);
//计算当前进度占整个动画过程的比例,浮点型,0-1之间
float fraction = currentValue / 100f;
//这里我偷懒了,不过有现成的干吗不用呢
//直接调用整型估值器通过比例计算出宽度,然后再设给Button
target.getLayoutParams().width = mEvaluator.evaluate(fraction, start, end);
target.requestLayout();
}
});
valueAnimator.setDuration(5000).start();
ObjectAnimator相关监听:
Animator.AnimatorListener() 监听动画开始结束 重复次数等等的监听器
ValueAnimator.AnimatorUpdateListener 监听动画执行进度的监听器
结束一个view的属性动画不可以通过view实现关闭 必须通过属性动画本身关闭自己
注意点:
view上对动画的操作api都是对补间动画有作用:
but.clearAnimation(); but.getAnimation()
对属性动画没有任何效果。
各类效果展示
PROXY_PROPERTIES.put("alpha", PreHoneycombCompat.ALPHA); PROXY_PROPERTIES.put("pivotX", PreHoneycombCompat.PIVOT_X); PROXY_PROPERTIES.put("pivotY", PreHoneycombCompat.PIVOT_Y); PROXY_PROPERTIES.put("translationX", PreHoneycombCompat.TRANSLATION_X); PROXY_PROPERTIES.put("translationY", PreHoneycombCompat.TRANSLATION_Y); PROXY_PROPERTIES.put("rotation", PreHoneycombCompat.ROTATION); PROXY_PROPERTIES.put("rotationX", PreHoneycombCompat.ROTATION_X); PROXY_PROPERTIES.put("rotationY", PreHoneycombCompat.ROTATION_Y); PROXY_PROPERTIES.put("scaleX", PreHoneycombCompat.SCALE_X); PROXY_PROPERTIES.put("scaleY", PreHoneycombCompat.SCALE_Y); PROXY_PROPERTIES.put("scrollX", PreHoneycombCompat.SCROLL_X); PROXY_PROPERTIES.put("scrollY", PreHoneycombCompat.SCROLL_Y); PROXY_PROPERTIES.put("x", PreHoneycombCompat.X); PROXY_PROPERTIES.put("y", PreHoneycombCompat.Y);
ViewHelper
额外点:
+// 设置动画放大的相对位置
v.setPivotX(0);
v.setPivotY(0);