Android 属性动画使用(一)

来源:互联网 发布:系统表的定义sql语句 编辑:程序博客网 时间:2024/06/05 04:13

首先扯点别的:感觉自己好久没有用笔写过字了,下午去超市每个小本子,写写诗,练练字,陶冶一下情操,也不能有事没事就喝酒。

今天记录一下自己学习属性动画的过程,是看着郭霖大神的博客,链接会在文章末尾贴出。

1 ValueAnimator


ValueAnimator 。给它一个初始值和结束值,以及动画的时间,ValueAnimator 会自动计算在动画时间内如何从初始值过渡到结束值。
1.使用场景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();//开始动画

ValueAnimator当中最常用的应该就是ofFloat()和ofInt()和ofObject方法,ofInt方法跟ofFloat方法一样,ofObject后面再讲。

ObjectAnimator

//使用方式和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

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中包括以下四个方法:after(Animator anim)   将现有动画插入到传入的动画之后执行after(long delay)   将现有动画延迟指定毫秒后执行before(Animator anim)   将现有动画插入到传入的动画之前执行with(Animator anim)   将现有动画和传入的动画同时执行

所以上边的 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) {                    }                });

使用XML编写动画

在Android studio drawable目录下新建animator文件夹
旋转动画

<?xml version="1.0" encoding="utf-8"?><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

<?xml version="1.0" encoding="utf-8"?><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();

效果图
这里写图片描述

结尾:好今天就记录到这里,身体也是甚是乏累啊,出去跑跑步,狂狂超市,买点菜吃饭。
参考链接
【1】http://blog.csdn.net/guolin_blog/article/details/43536355

0 0