ObjectAnimator
TextView mTextView = (TextView) findViewById(R.id.tv);
//objectAnimator
//alpha
//rotation
//scaleX
//translationX
// ObjectAnimator animator1 = ObjectAnimator.ofFloat(mTextView, "alpha", 0f, 1f, 0f, 1f); // 透明度变换
// ObjectAnimator animator1 = ObjectAnimator.ofFloat(mTextView, "rotation", 0f, 360f); // 旋转
// ObjectAnimator animator1 = ObjectAnimator.ofFloat(mTextView, "scaleX", 1f, 2f, 1f); //缩放X
// 当前X的位置
float currentX = mTextView.getTranslationX();
ObjectAnimator animator1 = ObjectAnimator.ofFloat(mTextView, "translationX", currentX, -500f, currentX); // 位移X
animator1.setDuration(5000);
animator1.start();
组合动画 AnimatorSet
AnimatorSet set = new AnimatorSet();
ObjectAnimator animator2 = ObjectAnimator.ofFloat(mTextView, "alpha", 0f, 1f, 0f, 1f); // 透明度变换
ObjectAnimator animator3 = ObjectAnimator.ofFloat(mTextView, "rotation", 0f, 360f); // 旋转
ObjectAnimator animator4 = ObjectAnimator.ofFloat(mTextView, "scaleX", 1f, 2f, 1f); //缩放X
set.play(animator2).with(animator3).after(animator4); // 同时播放animator2和animator3,在animator4之后
set.setDuration(5000);
set.start();
Animator 监听
所有继承animator的类都可以添加这个监听。
set.addListener(new AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
Log.v("TAG", "/// onAnimationStart");
}
@Override
public void onAnimationRepeat(Animator animation) {
Log.v("TAG", "/// onAnimationRepeat");
}
@Override
public void onAnimationEnd(Animator animation) {
Log.v("TAG", "/// onAnimationEnd");
}
@Override
public void onAnimationCancel(Animator animation) {
Log.v("TAG", "/// onAnimationCancel");
}
});
XML编写动画
1.在res目录下新建animator文件夹
2.使用xml编写动画可以重复使用
animator1.xml
<objectAnimator
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="5000"
android:propertyName="alpha"
android:valueType="floatType"
android:valueFrom="0f"
android:valueTo="1f"
>
</objectAnimator>
Activity
TextView mTextView = (TextView) findViewById(R.id.tv);
Animator animator = AnimatorInflater.loadAnimator(this, R.animator.animator1);
animator.setTarget(mTextView);
animator.start();
复杂的动画 XML
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="sequentially" >
<!-- sequentially == 连续 -->
<objectAnimator
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="5000"
android:propertyName="alpha"
android:valueFrom="0f"
android:valueTo="1f"
android:valueType="floatType" >
<set android:ordering="together" >
<!-- together == 一起 -->
<objectAnimator
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2500"
android:propertyName="rotation"
android:valueFrom="0f"
android:valueTo="360f"
android:valueType="floatType" />
<objectAnimator
xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2500"
android:propertyName="translationX"
android:valueFrom="0f"
android:valueTo="100f"
android:valueType="floatType" />
</set>
</objectAnimator>
</set>
转载于:
http://blog.csdn.net/guolin_blog/article/details/43536355
TypeEvalutor
地址:http://blog.csdn.net/guolin_blog/article/details/43816093
Interpolator
地址:http://blog.csdn.net/guolin_blog/article/details/44171115
2016/08/03更新
View动画(Tween,补间动画)
1.xml控制(可以复用, 可读性好)
2.代码控制(代码量少)
<!-- 平移 -->
<translate
android:fromXDelta="-100"
android:toXDelta="800"
android:fromYDelta="-100"
android:toYDelta="400"
android:duration="3000"/>
这里的fromXDelta和toXDelta等都是指相对于View的距离,并不是绝对的X,Y坐标。正值代表方向是右边或下边,负值代表方向是左边或上边
<set xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 平移 -->
<translate
android:fromXDelta="-100"
android:toXDelta="800"
android:fromYDelta="-100"
android:toYDelta="400"
android:duration="3000"/>
<!-- 旋转 ,以自身中心为原点 -->
<!--pivotX 和 pivotY 都等于0, 则旋转中心为View的左上角 -->
<rotate
android:fromDegrees="0"
android:toDegrees="359"
android:duration="6000"
android:pivotX="50%"
android:pivotY="50%"
/>
</set>
在同一个动画集合里,动画效果是同步执行的。如果使用上述这种动画集合,View不会自我旋转。因为当动画开始时已经确定了旋转中心,而平移效果也开始了,所以集合起来的效果就是View围绕了原来的自身中心点旋转。
缩放Scale:
fromYScale = “float”
fromXScale = “float”
toYScale = “float”
toXScale = “float”
pivotX = “float”
pivotY = “float”
透明度alpha
fromAlpha = “float”
toAlpha = “float”
fillAfter = boolean ,动画结束后View是否停留在结束位置。
使用XML定义的动画集合
Animation animation = AnimationUtils.loadAnimation(this, R.anim.anim);
// 设置动画监听
animation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
Log.d("MyTAG", "start");
}
@Override
public void onAnimationRepeat(Animation animation) {
Log.d("MyTAG", "repeat");
}
@Override
public void onAnimationEnd(Animation animation) {
Log.d("MyTAG", "end");
}
});
mIv1.startAnimation(animation);
有序执行动画
错误做法:
mIv1.startAnimation(AnimationUtils.loadAnimation(this, R.anim.anim));
mIv1.startAnimation(AnimationUtils.loadAnimation(this, R.anim.anim2));
这种做法会导致anim不执行,直接执行anm2。
正确做法:
android:startOffset = “3000”,表示该动画延迟3000毫秒执行。
<set xmlns:android="http://schemas.android.com/apk/res/android"
>
<!-- 平移 -->
<translate
android:fromXDelta="-100"
android:toXDelta="800"
android:fromYDelta="-100"
android:toYDelta="400"
android:duration="3000"/>
<!-- 旋转 ,以自身中心为原点 -->
<!--pivotX 和 pivotY 都等于0, 则旋转中心为View的左上角 -->
<rotate
android:startOffset="3000"
android:fromDegrees="0"
android:toDegrees="359"
android:duration="6000"
android:pivotX="50%"
android:pivotY="50%"
/>
</set>
使用代码创建动画
AlphaAnimation alphaAnimation = new AlphaAnimation(1, 0);
alphaAnimation.setDuration(2000);
// View保持动画结束后的效果
alphaAnimation.setFillAfter(true);
mIv1.startAnimation(alphaAnimation);
帧动画
使用场景少,暂无研究。
LayoutAnimation, 作用于ViewGroup,这样当它的子元素出场时都带有特定的动画效果。
LayoutAnimation同样有xml和代码2种方式设置。
<layoutAnimation
xmlns:android="http://schemas.android.com/apk/res/android"
android:delay="0.5"
android:animationOrder="normal"
android:animation="@anim/anim"
/>
delay:子元素开始动画的时间延迟,比如子元素的入场动画周期为300ms,则0.5代表每个子元素都要延迟150ms。总的来说,即第一个子元素延迟150ms,第二个子元素延迟300ms,以此类推。
animationOrder:子元素入场方式,normal顺序,reverse逆序,random随机。
animation:动画集合
使用方式:
xml
<ViewGroup
android:layoutAnimation = "@anim/layoutanim" />
代码
LayoutAnimationController controller = new LayoutAnimationController(animation);
controller.setDelay(0.5f);
controller.setOrder(LayoutAnimationController.ORDER_NORMAL);
ViewGroup.setLayoutAnimation(controller);