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
- Android 属性动画使用(一)
- Android 属性动画 (一)
- Android 属性动画(一)
- Android动画--属性动画总结(一)
- Android动画机制-属性动画(一)
- Android属性动画一
- Android动画属性一
- Android动画学习-视图动画&属性动画(一)
- android动画基础(一) View动画和属性动画
- Android动画机制与使用技巧(一)属性动画分析
- Android属性动画---Property Animation(一)
- Android属性动画--Property Animation(一)
- Android之属性动画(一)
- android属性动画Animator(一)
- Android之属性动画(一)
- Android属性动画Property Animation(一)
- Android属性动画完全解析(一)
- Android属性动画学习笔记(一)
- 系统架构师要点总结(一) —— 软件架构设计
- 关闭windows 2003 开机事件报错
- android Conversion to Dalvik format failed with error 1
- 关于VS2013序列号
- Vasiliy's Multiset
- Android 属性动画使用(一)
- Linux中安装jdk
- vue组件简单介绍与使用
- unity-序列帧动画
- MyBatis学习总结(二)表的关联以及动态SQL
- Android--ListView中item中实现跑马灯效果
- swift 8. 函数
- Codeforces 595 B. Pasha and Phone【数学】
- Swift常用正则表达式