View动画
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:fillAfter="true"
android:fromAlpha="1.0"
android:repeatCount="2"
android:toAlpha="0.3" >
</alpha>
<!--
android:duration 执行时间
android:fillAfter 动画停留在结束位置
android:repeatCount 重复次数
android:fromAlpha 动画开始状态
android:toAlpha 动画结束状态
说明:
0.0表示完全透明
1.0表示完全不透明
以上值取0.0-1.0之间的float数据类型的数字
-->
View动画Set 使用
如果 set 标签是父级标签, 子标签设置:android:fillAfter=”true” 是无效的
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<alpha
android:duration="1000"
android:fromAlpha="1.0"
android:toAlpha="0.3" />
<rotate
android:duration="1000"
android:fromDegrees="0"
android:interpolator="@android:anim/linear_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:repeatCount="-1"
android:repeatMode="restart"
android:startOffset="-1"
android:toDegrees="+360" />
<scale
android:duration="1000"
android:fromXScale="1.0"
android:fromYScale="1.0"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="0.5"
android:toYScale="0.5" />
<translate
android:duration="2000"
android:fromXDelta="0%"
android:fromYDelta="0%"
android:toXDelta="100%"
android:toYDelta="100%" />
</set>
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:fromDegrees="0"
android:interpolator="@android:anim/linear_interpolator"
android:pivotX="20%p"
android:pivotY="20%p"
android:repeatCount="-1"
android:repeatMode="restart"
android:startOffset="-1"
android:toDegrees="+360" >
</rotate>
<!--
android:fromDegrees 角度,从哪开始旋转
android:toDegrees 角度,旋转到哪里结束
说明:
当角度为负数——表示逆时针旋转
当角度为正数——表示顺时针旋转
(负数from——to正数:顺时针旋转)
(负数from——to负数:逆时针旋转)
(正数from——to正数:顺时针旋转)
(正数from——to负数:逆时针旋转)
android:interpolator 插值器 ,定义动画的变化率。
AccelerateDecelerateInterpolator @android:anim/accelerate_decelerate_interpolator 动画始末速率较慢,中间加速
AccelerateInterpolator @android:anim/accelerate_interpolator 动画开始速率较慢,之后慢慢加速
AnticipateInterpolator @android:anim/anticipate_interpolator 开始的时候从后向前甩
AnticipateOvershootInterpolator @android:anim/anticipate_overshoot_interpolator 类似上面AnticipateInterpolator
BounceInterpolator @android:anim/bounce_interpolator 动画结束时弹起
CycleInterpolator @android:anim/cycle_interpolator 循环播放速率改变为正弦曲线
DecelerateInterpolator @android:anim/decelerate_interpolator 动画开始快然后慢
LinearInterpolator @android:anim/linear_interpolator 动画匀速改变
OvershootInterpolator @android:anim/overshoot_interpolator 向前弹出一定值之后回到原来位置
PathInterpolator 新增,定义路径坐标后按照路径坐标来跑。,,,这个不知道怎么用
android:pivotX 旋转时,X轴的作用位置
android:pivotY 旋转时,Y轴的作用位置
说明:
以上两个属性值 从0%-100%中取值
50%为物件的X或Y方向坐标上的中点位置
0.数值、百分数、百分数p
1.譬如50表示以当前View左上角坐标加50px为初始点、
2.50%表示以当前View的左上角加上当前View宽高的50%做为初始点、
3.50%p表示以当前View的左上角加上父控件宽高的50%做为初始点
android:repeatCount 重复次数,不写默认是1次,写了数值是数值+1次,-1 是无限重复执行
android:repeatMode 动画的正restart 反 reverse
android:startOffset 动画执行之后,等待开始运行的时间
-->
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="1000"
android:fillAfter="true"
android:fromXScale="1.0"
android:fromYScale="1.0"
android:pivotX="50%p"
android:pivotY="50%p"
android:repeatCount="1"
android:toXScale="0.0"
android:toYScale="0.0" >
</scale>
<!--
android:duration 动画执行时间
android:fillAfter 动画停留在执行结束后的位置
android:fromXScale X轴开始缩放的比例
android:fromYScale Y轴开始缩放的比例
android:toXScale X轴结束缩放的比例
android:toYScale Y轴结束缩放的比例
说明:
以上四种属性值
0.0表示收缩到没有
1.0表示正常无伸缩
值小于1.0表示收缩
值大于1.0表示放大
android:pivotX 缩放时,动画相对于物件的X坐标的开始位置
android:pivotY 缩放时,动画相对于物件的Y坐标的开始位置
说明:
以上两个属性值 从0%-100%中取值
50%为物件的X或Y方向坐标上的中点位置
0.数值、百分数、百分数p
1.譬如50表示以当前View左上角坐标加50px为初始点、
2.50%表示以当前View的左上角加上当前View宽高的50%做为初始点、
3.50%p表示以当前View的左上角加上父控件宽高的50%做为初始点
android:repeatCount 缩放重复次数
-->
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:fillAfter="true"
android:fromXDelta="0%"
android:fromYDelta="0%"
android:toXDelta="100%"
android:toYDelta="100%" >
</translate>
<!--
android:fromXDelta X轴位移的开始的位置
android:fromYDelta .....
android:toXDelta X轴位移的结束的位置
android:toYDelta .....
注意:
没有指定fromXType toXType fromYType toYType 时候,
默认是以自己为相对参照物
android:fillAfter 动画执行完,停留在结束位置,但是如果跟<set 组合动画一起使用,android:fillAfter 无效。
使用:
Animation list1_xml = AnimationUtils.loadAnimation(this, R.anim.list1);
setBtn.startAnimation(list1_xml);
list1_xml 这个对象也,可以设置监听器以及一些其他的功能
-->
Drawable动画
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item android:drawable="@drawable/amp1" android:duration="200" />
<item android:drawable="@drawable/amp2" android:duration="200" />
<item android:drawable="@drawable/amp3" android:duration="200" />
<item android:drawable="@drawable/amp4" android:duration="200" />
<item android:drawable="@drawable/amp5" android:duration="200" />
<item android:drawable="@drawable/amp6" android:duration="200" />
<item android:drawable="@drawable/amp7" android:duration="200" />
</animation-list>
<!--
drawableAnimBtn = findViewById(R.id.drawable_anim);
drawableAnimBtn.setBackgroundResource(R.anim.drawable_anim);
AnimationDrawable drawableAnimation = (AnimationDrawable) drawableAnimBtn.getBackground();
drawableAnimation.start();
特别注意,AnimationDrawable的start()方法不能在Activity的onCreate方法中调运,
因为AnimationDrawable还未完全附着到window上,
所以最好的调运时机是onWindowFocusChanged()方法中。
-->
Property 动画
XML 使用
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="together" >
<objectAnimator
android:duration="1000"
android:propertyName="scaleX"
android:valueFrom="1"
android:valueTo="2" >
</objectAnimator>
<objectAnimator
android:duration="1000"
android:propertyName="scaleY"
android:valueFrom="1"
android:valueTo="2" >
</objectAnimator>
</set>
<!--
android:ordering
<set>标签的android:ordering属性规定了这个set中的动画的执行顺序。该属性值默认是together (default)。
sequentially:顺序执行;
together:同时执行;
附加:
<set> 既java代码里面的 AnimatorSet
<animator> 既java代码里面的 ValueAnimator
<objectAnimator> 既java代码里面的ObjectAnimator
android:duration 动画执行时间
android:propertyName 要执行的动画类型,参数可配
android:valueFrom 动画开始位置
android:valueTo 动画结束位置
注意:
开始参数跟结束参数的关系是:倍率关系。
用户加载属性动画的xml文件 ,java代码示例:
Animator anim = AnimatorInflater.loadAnimator(this, R.animator.scaleX_Y);
anim.setTarget(mMv);
anim.start();
-->
AnimatorSet 使用
ObjectAnimator anim1 = ObjectAnimator.ofFloat(mViwe, "scaleX", 1.0f, 2f);
ObjectAnimator anim2 = ObjectAnimator.ofFloat(mViwe, "scaleY", 1.0f, 2f);
ObjectAnimator anim3 = ObjectAnimator.ofFloat(mViwe, "x", cx, 0f);
ObjectAnimator anim4 = ObjectAnimator.ofFloat(mViwe, "x", cx);
ObjectAnimator anim5 = ObjectAnimator.ofFloat(mViwe, "scaleX", 2f, 1.0f);
ObjectAnimator anim6 = ObjectAnimator.ofFloat(mViwe, "scaleY", 2f, 1.0f);
/**
* anim1,anim2,anim3同时执行 anim4接着执行
*/
AnimatorSet animSet = new AnimatorSet();
animSet.play(anim1).with(anim2);
animSet.play(anim2).with(anim3);
animSet.play(anim4).after(anim3);
animSet.play(anim5).with(anim6);
animSet.play(anim6).after(anim4);
animSet.setDuration(100);
//插值器,增加动画特效
//animSet.setInterpolator(new LinearInterpolator());
//两个动画同时执行
//animSet.playTogether(anim1, anim2);
//顺序执行
//animSet.playSequentially(anim1,anim2);
animSet.start();
PropertyValuesHolder 使用
PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("alpha", 1f, 0f, 1f);
PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("scaleX", 1f, 0, 1f);
PropertyValuesHolder pvhZ = PropertyValuesHolder.ofFloat("scaleY", 1f, 0, 1f);
ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(mView, pvhX, pvhY, pvhZ).setDuration(2000);
animator.start();
ObjectAnimator 使用
指定明确属性
/**
* 第二个参数 propertyName 介绍:
* translationX 相对view自身开始X轴位移
* translationY 相对view自身开始Y轴位移
* x 在屏幕X轴像素开始位移
* y 在屏幕Y轴像素开始位移
* alpha 透明动画
* rotation 相对view中心开始旋转
* rotationX 相对view X轴开始旋转
* rotationY 相对view Y轴开始旋转
* scaleY 相对view Y轴开始缩放
* scaleX 相对view X轴开始缩放
*/
ObjectAnimator anim = ObjectAnimator.ofFloat(view, "rotation", 1.0F, 360F).setDuration(1000);
anim.setRepeatCount(-1);
anim.start();
// 由于ofFloat 是可变参数,我们也可以这样玩:
// ObjectAnimator anim = ObjectAnimator.ofFloat(view, "alpha", 1.0f, 0.85f, 0.65f, 0.45f, 0.35f, 0.15f).setDuration(2000);
// anim.start();
不指定明确属性
/**
* 即使在第二个参数,没有指定,属性动画的名称,我们还可以在animator.addUpdateListener,指定动画的类型
* eg:
* Integer value= (Integer)animation.getAnimatedValue();
* view.setTranslationY(value);
*/
ObjectAnimator animator=ObjectAnimator.ofInt(mView, "lxcay", 800);
animator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Integer value= (Integer)animation.getAnimatedValue();
mView.setAlpha(value);
mView.setScaleX(value);
mView.setScaleY(value);
mView.setTranslationX(value);
mView.setTranslationY(value);
}
});
/**
* 设置插值器,插值器,增加动画特效
*/
animator.setInterpolator(new BounceInterpolator());
animator.setDuration(3000);
animator.start();
ValueAnimator 使用
不需要指定 propertyName 用法跟 ObjectAnimator 使用差不多,但是必须结合
animator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {}
});
一起使用,不然无效;
// 开始颜色为色
int startColor = 0xffff0000;
// 终止颜色为绿色
int endColor = 0xff00ff00;
ValueAnimator animator = ValueAnimator.ofArgb(startColor, endColor);
animator.setTarget(mTextView);
animator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int color = (Integer) animation.getAnimatedValue();
mTextView.setBackgroundColor(color);
}
});
animator.setDuration(3000);
animator.start();
DisplayMetrics outMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(outMetrics);
int mScreenHeight = outMetrics.heightPixels;
ValueAnimator animator = ValueAnimator.ofFloat(0, mScreenHeight - mView.getHeight() * 4);
animator.setTarget(mBlueBall);
animator.setDuration(1000).start();
animator.setInterpolator(new OvershootInterpolator()/*AnimationUtils.loadInterpolator(this, android.R.anim.overshoot_interpolator)*/);
animator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float value = (Float) animation.getAnimatedValue();
// mBlueBall.setScaleX(value);
// mBlueBall.setScaleY(value);
// mBlueBall.setTranslationX(value);
// mBlueBall.setAlpha(value);
mBlueBall.setTranslationY(value);
}
});
删除动画
ObjectAnimator animation = ObjectAnimator.ofFloat(mBlueBall, "alpha", 0.5f);
animation.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
Log.e(TAG, "onAnimationEnd");
ViewGroup parent = (ViewGroup) mView.getParent();
if (parent != null){
//删除动画
parent.removeView(mView);
}
}
});
animation.start();
3.1系统及以上:
ViewPropertyAnimator的使用
mTextView.animate().x(500).y(500).setDuration(5000).setInterpolator(new BounceInterpolator());
炒鸡简单,有木有!
虽然代码里面没有调用start(),但是在创建好动画后会在内部隐士调用。start();
全文参考自:
http://blog.csdn.net/guolin_blog/article/details/43536355
http://blog.csdn.net/guolin_blog/article/details/43816093
http://blog.csdn.net/guolin_blog/article/details/44171115
http://blog.csdn.net/lmj623565791/article/details/38067475
LayoutAnimations学习请看
http://blog.csdn.net/lmj623565791/article/details/38092093
https://developer.android.com/reference/android/animation/ObjectAnimator.html