Android 动画杂谈(一)
2015-11-26 17:40
417 查看
视图动画:
视图动画产生的动画,并不能改变事件响应的位置,它只是单纯地修改了显示,如果使用视图动画,那么按钮的实际点击有效区域还是在原来的地方,点击移动后的地方时不会有点击时间发生的。
而属性动画则不一样,由于它真实改变了一个View的属性,所以事件响应的区域也同样发生了改变,这时候点击移动后的按钮,就会响应点击事件了
PropertyValuesHolder
针对同一对象的多个属性,要同时作用多种动画,可以使用PropertyValuesHolder来实现,比如下面的在平移过程中,需要同时改变X,Y轴的缩放,可以这样实现:
使用方法类似视图动画的AnimationSet的使用。
动画事件的监听
其各方法的含义根据方法名很显然知道。当然,大部分的时候,我们都只关心onAnimationEnd 事件,所以可以如下这样使用
可以自由选择我们必要的事件进行监听。
AnimatorSet
为了实现更为精确的顺序控制
视图动画产生的动画,并不能改变事件响应的位置,它只是单纯地修改了显示,如果使用视图动画,那么按钮的实际点击有效区域还是在原来的地方,点击移动后的地方时不会有点击时间发生的。
TranslateAnimation ta = new TranslateAnimation(0,200,0,300); ta.setDuration(1000); ta.setFillAfter(true); view.startAnimation(ta);
而属性动画则不一样,由于它真实改变了一个View的属性,所以事件响应的区域也同样发生了改变,这时候点击移动后的按钮,就会响应点击事件了
ObjectAnimator animator = ObjectAnimator.ofFloat(view,"translationX",300); animator.setDuration(300); animator.start();
PropertyValuesHolder
针对同一对象的多个属性,要同时作用多种动画,可以使用PropertyValuesHolder来实现,比如下面的在平移过程中,需要同时改变X,Y轴的缩放,可以这样实现:
PropertyValuesHolder p1 =PropertyValuesHolder.ofFloat("translation",300f); PropertyValuesHolder p2 =PropertyValuesHolder.ofFloat("scaleX",1f,0,1f); PropertyValuesHolder p3 =PropertyValuesHolder.ofFloat("scaleY",1f,0,1f); ObjectAnimator.ofPropertyValuesHolder(view,p1,p2,p3).setDuration(1000).start();
使用方法类似视图动画的AnimationSet的使用。
动画事件的监听
ObjectAnimator anima = ObjectAnimator.ofFloat(view,"alpha",0.5f); anima.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) { } });
其各方法的含义根据方法名很显然知道。当然,大部分的时候,我们都只关心onAnimationEnd 事件,所以可以如下这样使用
ObjectAnimator anima = ObjectAnimator.ofFloat(view,"alpha",0.5f); anima.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); } });
可以自由选择我们必要的事件进行监听。
AnimatorSet
为了实现更为精确的顺序控制
ObjectAnimator animator1 = ObjectAnimator.ofFloat(view,"translationX",300f); ObjectAnimator animator2 = ObjectAnimator.ofFloat(view,"scaleX",1f,0f,1f); ObjectAnimator animator3 = ObjectAnimator.ofFloat(view,"scaleY",1f,0f,1f); AnimatorSet set = new AnimatorSet(); set.setDuration(1000); // 同时 set.playTogether(animator1, animator2, animator3); // 按顺序 set.playSequentially(animator1,animator2,animator3); /* * 或者通过下面的方法去控制 * set.play().with() * set.play().before() * set.play().after() * */ set.start();
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories