首先扯点别的:感觉自己好久没有用笔写过字了,下午去超市每个小本子,写写诗,练练字,陶冶一下情操,也不能有事没事就喝酒。
ValueAnimator 。给它一个初始值和结束值,以及动画的时间,ValueAnimator 会自动计算在动画时间内如何从初始值过渡到结束值。
使用场景1:比如说我现在有一个Button,点击的时候,我想改变他的height和width为原来的1/2,以及增加marginTop的值,就可以如下所示。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:layout_marginTop="8dp"
android:text="ValueAnimator" />
LinearLayout>
//点击button1的时候
case R.id.button1:
final LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) button1.getLayoutParams();
//得到初始的高度宽度和距离父级容器顶部的高度
final int height = button1.getHeight();
final int width = button1.getWidth();
final int top = button1.getTop();
//使用ofFloat方法实例化一个动画,初始值是0,结束值是0.5;
ValueAnimator va1 = ValueAnimator.ofFloat(0F, 0.5F);
//给动画添加一个监听事件,动画从在整个过渡过程中会一直执行
//onAnimationUpdate(ValueAnimator animation) 方法,我们的逻辑就应该写在这个方法里面
va1.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
//在动画执行的每一帧都会执行下面的代码
float fraction = (float) animation.getAnimatedValue();
params.height = (int) (height - height * fraction);
params.width = (int) (width - width * fraction);
params.topMargin = (int) (top + 200 * fraction);
button1.setLayoutParams(params);
}
});
va1.setRepeatCount(3);//设置动画重复次数
va1.setRepeatMode(ValueAnimator.RESTART);//重新播放
va1.setStartDelay(1000);//动画延迟多长时间开始
va1.setDuration(1000);//设置动画时长
va1.start();//开始动画
break;
ValueAnimator当中最常用的应该就是ofFloat()和ofInt()和ofObject方法,ofInt方法跟ofFloat方法一样,ofObject后面再讲。
//使用方式和ValueAnimator类似,第一个参数代表操作的对象,第二个参数表示改变对象的属性,
//后面的参数是变化范围。
//这行代码的意思就是通过调用button2透明度属性对应的get和set方法来改变button2的透明度,
//变化范围是先从完全不透明->完全透明->完全不透明
ObjectAnimator oa=ObjectAnimator.ofFloat(button2,"alpha",1F,0F,1F);
oa.setDuration(2000);
oa.start();
ObjectAnimator继承自ValueAnimator,ObjectAnimator内部的工作机制并不是直接对我们传入的属性名进行操作的,而是会去寻找这个属性名对应的get和set方法,因此alpha属性所对应的get和set方法应该就是
//button改变透明度的方法
button2.getAlpha();
button2.setAlpha(float alpha);
旋转动画
ObjectAnimator oa = ObjectAnimator.ofFloat(button2, "rotation", 0,360,0);
oa.setDuration(2000);
oa.start();
平移动画将 ,TextView先向左移出屏幕,然后再移动回来
float curTranslationX = textview.getTranslationX();
ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "translationX",
curTranslationX, -500f, curTranslationX);
animator.setDuration(5000);
animator.start();
缩放动画,将TextView在垂直方向上放大3倍再还原
ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "scaleY", 1f, 3f, 1f);
animator.setDuration(5000);
animator.start();
hehe动画,调用下面的代码发现什么都没有发生,这是为什么呢,因为Button类中并没有setHehe和getHehe方法。
ObjectAnimator oa1 = ObjectAnimator.ofFloat(button3, "hehe", 0,360,0);
oa1.setDuration(2000);
oa1.start();
AnimatorSet 可以将多个ObjectAnimator或者ValueAnimator组合到一起执行。比如说想让button旋转的时候同时改变透明度可以这样写:
ObjectAnimator oa = ObjectAnimator.ofFloat(button2, "rotation", 0,360,0);
ObjectAnimator oa1 = ObjectAnimator.ofFloat(button2, "alpha", 1,0,1);
AnimatorSet as=new AnimatorSet();
as.setDuration(2000);
as.playTogether(oa,oa1);//两个动画同时播放。
as.start();
AnimatorSet 的playTogether方法
//可变参数列表
public void playTogether(Animator... items)
//也可以传入一个集合
public void playTogether(Collection<Animator> items)
AnimatorSet 的playSequentially方法
//可变参数列表
public void playSequentially(Animator... items)
//传入一个集合
public void playSequentially(List<Animator> items)
AnimatorSet提供了一个play()方法,如果我们向这个方法中传入一个Animator对象(ValueAnimator或ObjectAnimator)将会返回一个AnimatorSet.Builder的实例,AnimatorSet.Builder中包括以下四个方法:
所以上边的as.playTogether(oa,oa1);
替换成as.play(oa).with(oa1);
效果也是一样的。
给动画添加监听事件
//只监听动画结束事件
moveIn.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
}
});
//监听动画开始,结束,取消和重复时候的事件
moveIn.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
//监听动画暂停和重新开始的事件
moveIn.addPauseListener(new Animator.AnimatorPauseListener() {
@Override
public void onAnimationPause(Animator animation) {
}
@Override
public void onAnimationResume(Animator animation) {
}
});
在res目录下新建animator文件夹
旋转动画
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:valueFrom="0"
android:valueTo="360"
android:propertyName="rotation"
android:duration="4000">
objectAnimator>
xml组合动画 anim_set.xml
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:ordering="sequentially">
<objectAnimator
android:duration="2000"
android:propertyName="translationX"
android:valueFrom="0"
android:valueTo="500"
android:valueType="floatType" />
<set android:ordering="together">
<objectAnimator
android:duration="3000"
android:propertyName="rotation"
android:valueFrom="0"
android:valueTo="360"
android:valueType="floatType" />
<set android:ordering="sequentially">
<objectAnimator
android:duration="1500"
android:propertyName="alpha"
android:valueFrom="1"
android:valueTo="0"
android:valueType="floatType" />
<objectAnimator
android:duration="1500"
android:propertyName="alpha"
android:valueFrom="0"
android:valueTo="1"
android:valueType="floatType" />
set>
set>
set>
在代码中加载动画
Animator animator= AnimatorInflater.loadAnimator(AnimatorActivity.this,R.animator.anim_set);
animator.setTarget(button3);
animator.start();
结尾:好今天就记录到这里,身体也是甚是乏累啊,出去跑跑步,狂狂超市,买点菜吃饭。
参考链接: