属性动画四种动画 :
alpha 渐变
scaleX
缩放 以x中心轴
scaleY
缩放 以y中心轴
translationX 位移 以x中心轴
translationY 位移 以y中心轴
rotation 旋转
通过
setPivotX(100); setPivotY(100); 设置中心点
rotationX 旋转
以x中心轴
rotationY 旋转
以y中心轴
Property Animation 是Android3.0(level 11)引入的一个款功能强大、灵活、健壮的动画系统,和补间动画很相似,不同的是补间动画不更改属性的值,只是实现了动画的效果,
但是属性动画是根据更改属性值来实现动画的效果.
ValueAnimator是Property Animation的核心类.
ValueAnimator的介绍:
Animator.AnimatorListener 属性动画的事件监听
onAnimationStart
(Animator
animation
) //动画开始触发
onAnimationRepeat(Animator
animation
) //动画循环播放触发
onAnimationEnd(Animator
animation
)
//动画结束触发
onAnimationCancel(Animator
animation
) //动画取消触发 不管是什么情况下结束
Animator.AnimatorUpdateListener //当使用ValueAnimator进行动画实现的情况下 需要实现这个事件监听
onAnimationUpadate
(ValueAnimator
animation
) //动画每一帧都会调用这个方法 在这个方法中进行属性的更改
getAnimatedValue() //通过这个方法可以获得当前的值 animation.getAnimaedValue()
创建一个动画 设置textview左间距从0到100改变的动画
ValueAnimator mAnimator = ValueAnimator.ofInt(0, 100); // 创建值动画
// 从0到100开始执行
mAnimator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int animatedValue = (int) animation.getAnimatedValue(); // 获得0到100的执行值
MarginLayoutParams layoutParamss = (MarginLayoutParams) textview
.getLayoutParams();
layoutParamss.leftMargin = animatedValue; //设置textview的外间距
textview.setLayoutParams(layoutParamss); //改变textveiw的属性值
}
});
mAnimator.setDuration(2000);
mAnimator.setRepeatCount(ValueAnimator.INFINITE);
mAnimator.setRepeatMode(ValueAnimator.REVERSE);
mAnimator.start();
ValueAnimator值动画只是提供了值的改变,具体的属性值应该是多少 还需要自己去计算和设置
例如设置一个控件的大小改变
**
* 隐藏或显示ListView的动画
*/
public void hideOrShowListViewAnimator(final int startValue,final int endValue){
//1.设置属性的初始值和结束值
ValueAnimator mAnimator = ValueAnimator.ofInt(0,100);
//2.为目标对象的属性变化设置监听器
mAnimator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
// TODO Auto-generated method stub
int animatorValue = (int)animation.getAnimatedValue();
float fraction = animatorValue/100f;
IntEvaluator mEvaluator = new IntEvaluator();
//3.使用IntEvaluator计算属性值并赋值给ListView的高 IntEvaluator是把startValue减去endValue乘以百分比在加上startValue
mListView.getLayoutParams().height = mEvaluator.evaluate(fraction, startValue, endValue);
mListView.requestLayout();
}
});
//4.为ValueAnimator设置LinearInterpolator
mAnimator.setInterpolator(new LinearInterpolator());
//5.设置动画的持续时间
mAnimator.setDuration(500);
//6.为ValueAnimator设置目标对象并开始执行动画
mAnimator.setTarget(mListView);
mAnimator.start();
}
ObjectAnimator的介绍:
重要方法:
view.
setRotation(); //view的方法 以view的中心点 改变view的角度属性值
view.
setRotationX(
);
//view的方法 以view的x的中心轴
view.
setScaleX();
//view的方法 进行x值的缩放
view.
setAlpha();
//view的方法 改变透明度的属性值
view.
setTranslationX();
//view的方法 改变x的位移属性值
ObjectAnimator是ValueAnimator的实现类,对ValueAnimator进行了封装,帮你实现了UpdateListener()的操作
位移动画的实现:
ObjectAnimator animator1 = ObjectAnimator.ofFloat(textview,
"translationX", 0, 300);
animator1.setDuration(1000);
//设置动画时间
animator1.setRepeatCount(111);
//设置动画播放次数
animator1.setRepeatMode(ObjectAnimator.REVERSE); //设置动画模式
animator1.setInterpolator(new OvershootInterpolator());//设置插值器
animator1.start();
这种实现只是改变了X值的位移,如果改变Y值的位移把translationX改变为translationY
但是有个问题,如果我们要实现斜向移动应该怎么做呢 系统提供了一个
PropertyValuesHolder类来解决
// x和y坐标 斜向移动
PropertyValuesHolder ofFloat = PropertyValuesHolder.ofFloat(
"translationX", 0, 300);
PropertyValuesHolder ofFloat1 = PropertyValuesHolder.ofFloat(
"translationY", 0, 300);
ObjectAnimator objectAnimator = ObjectAnimator
.ofPropertyValuesHolder(textview, ofFloat, ofFloat1); //把x和y需要移动的值都添加到ObjectAnimator中
objectAnimator.setDuration(1000);
objectAnimator.setRepeatCount(ObjectAnimator.INFINITE);
objectAnimator.setRepeatMode(ObjectAnimator.REVERSE);
objectAnimator.start();
旋转动画的实现:
以X中心轴进行旋转 从0度到90度再回去0度
ObjectAnimator animator1 = ObjectAnimator.ofFloat(textview,
"rotationX", 0.0f, 90.0f,0.0F);
textview.setPivotX(100);
textview.setPivotY(0);
animator1.setDuration(2000).start();
以Y为中心轴进行旋转
ObjectAnimator animator2 = ObjectAnimator.ofFloat(textview,
"rotationY", 0.0f, 90.0f,0.0F);
textview.setPivotX(100);
textview.setPivotY(0);
animator2.setDuration(2000).start();
自己设置旋转中心轴
ObjectAnimator animator = ObjectAnimator.ofFloat(textview,
"rotation", 0.0f, 90.0f, 0.0F);
textview.setPivotX(100); //设置旋转中心的x值
textview.setPivotY(0);
//设置旋转中心的y值
animator.setDuration(2000).start();
渐变动画的实现:
ObjectAnimator animator = ObjectAnimator.ofFloat(textview,
"alpha", 0f, 0.3f);
animator.start();
缩放动画的实现:
ObjectAnimator animator1 = ObjectAnimator.ofFloat(textview,
"scaleY", 1.0f, 0.0f);
animator1.setDuration(1000);
animator1.setRepeatCount(ObjectAnimator.INFINITE);
animator1.setRepeatMode(ObjectAnimator.REVERSE);