Android中属性动画和flash补间动画教程的区别

&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
Android中属性动画和补间动画的区别
摘要:目录目录前言为什么引入属性动画属性动画ObjectAnimatorValueAnimatorAnimatorSetAnimator监听器前言Android属性动画和补间动画,既是日常工作中经常接触到的技术,也是面试常考的问题。这篇博客主要是为了介绍Android的属性动画使用,同时带着大家总结一下关于面试过程中常被面试到的动画问题。关于补间动画,可以参考之前的博客:Android动画学习——TweenAnimation为什么引入属性动画Android3.0之前提供的补间动画机
为什么引入属性动画
ObjectAnimator
ValueAnimator
AnimatorSet
Animator监听器
Android属性动画和补间动画,既是日常工作中经常接触到的技术,也是面试常考的问题。 这篇博客主要是为了介绍Android的属性动画使用,同时带着大家总结一下关于面试过程中常被面试到的动画问题。
关于补间动画,可以参考之前的博客:Android动画学习——Tween Animation
为什么引入属性动画
Android3.0之前提供的补间动画机制还算相对比较健全的,比如你的需求中只需要对View进行移动、缩放、旋转和淡入淡出的操作,那么补间动画已经足够健全了。但是,如果一旦需求超出了这四种操作,补间动画就无能为力了。 例如,我们需要改变View的宽度,这个时候就不能通过补间动画实现。此外,补间动画还有一个最大的缺陷,就是它只是改变了View的显示效果而已,并不会真正的改变View的属性。具体来说,例如屏幕左上角有一个Button,使用补间动画将其移动到右下角,此刻你去点击右下角的Button,它是绝对不会响应点击事件的,因此其作用区域依然还在左上角。只不过是补间动画将其绘制在右下角而已。
ObjectAnimator
ObjectAnimator是属性动画框架中最重要的实现类,创建一个ObjectAnimator只需要通过它的静态工厂类直接返回一个ObjectAnimator对象。参数包括一个对象和对象的属性名字,但这个属性必须有get和set函数,内部会通过Java反射机制来调用set函数修改对象的属性值。
我们举一个例子,在5秒内,让一个ImageView平移一段距离,代码如下: private void startAnimator() { ObjectAnimator animator = ObjectAnimator.ofFloat(mImageView, &translationY&, 300); animator.setDuration(5000); animator.start();}
通过ObjectAnimator的静态工厂方法,创建一个ObjectAnimator对象。第一个参数是需要操纵的View,第二个参数则是需要操纵的属性,而最后一个参数是一个可变数组参数,需要传进去该属性变化的一个取值过程,这里只设置了一个参数,即变化到300。
在使用ObjectAnimator的时候,有一点非常重要,那就是要操纵的属性必须具有get、set方法,不然ObjectAnimator就无法生效。下面列举出一些可以直接使用的属性:
translationX、translationY:这两个属性作为一种增量来控制着View对象从它布局容器的左上角坐标开始的位置。
rotation、rotationX、rotationY:这三个属性控制着View对象围绕它的支点进行2D和3D的旋转。
scaleX和scaleY:这两个属性控制着View对象围绕它的支点进行2D缩放。
pivotX和pivotY:这两个属性控制着View对象的支点位置,围绕这个支点进行旋转和缩放变换处理。默认情况下,该支点的位置就是View对象的中心点。
alpha:它表示View对象的alpha透明度。
x、y:这是两个简单的实用的属性,它描述了View对象在它的容器中最终的位置。
上面提到ObjectAnimator操作的属性必须在View中提供get和set方法,那如果我们想改变一个View的宽度,但是View中并没有提供宽度的get和set方法,那是不是我们就没有办法使用ObjectAnimator了呢?
答案当然是否定的,我们可以通过封装的机制,来为View提供一个width属性的get和set方法。示例代码如下: import android.view.Vpublic class WrapperView { private View mT public WrapperView(View target) { this.mTarget = } public int getWidth() { return mTarget.getLayoutParams(). } public void setWidth(int width) { mTarget.getLayoutParams().width = mTarget.requestLayout(); }}
一个简单的封装就达到了我们需要的效果,其他View没有提供get和set方法的属性大家也可以参考这种方式进行封装。
ValueAnimator
ValueAnimator是整个属性动画中最核心的一个类,前面介绍的ObjectAnimator也是继承自ValueAnimator。通过前面对ObjectAnimator的介绍,我们知道属性动画的实现机制是通过不断的地对View属性进行操作来实现的,而初始值和结束值之间的动画过渡就是由ValueAnimator这个类负责计算的。 它的内部使用一种时间循环的机制来计算值与值之间的动画过渡,我们只需要将初始值和结束值提供给ValueAnimator,并且告诉它动画所需运行的时长,那么ValueAnimator就会自动帮助我们完成从初始值平滑过渡到结束值这样的效果。 ValueAnimator本身不提供任何动画效果,它更像一个数值发生器,用来产生具有一定规律的数字,从而让调用者来控制动画的实现过程。通常情况下,在ValueAnimator的AnimatorUpdateListener中监听数值的变化,从而完成动画的切换。 示例代码提供了一个TextView利用ValueAnimator计时器的效果: private void startTimeClock() { final ValueAnimator valueAnimator = ValueAnimator.ofInt(0, 60); valueAnimator.setDuration(1000 * 60); valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { int time = (int) valueAnimator.getAnimatedValue(); Log.e(TAG, &time=& + time); mTextView.setText(time + &&); } }); valueAnimator.start();}
AnimatorSet
在补间动画学习时,我们知道可以利用AnimationSet将补间动画组合使用,同样的,属性动画也提供了AnimatorSet这个类来帮我们实现组合属性动画的效果。 AnimatorSet这个类提供了一个play()方法,如果我们向这个方法中传入一个Animator对象(ObjectAnimator或者ValueAnimator)将会返回一个AnimatorSet.Builder的实例,AnimatorSet.Builder中包含了以下四个方法:
after(Animator anim) : 将现有动画插入到传入的动画之后执行。
after(long delay):将现有的动画延迟指定的毫秒后执行。
before(Animator anim):将现有的动画插入到传入的动画之前执行。
with(Animator anim):将现有的动画和传入的动画同时执行。
有了这个方法,我们就可以完成组合动画的逻辑了。例如我们想让一个TextView先从屏幕外移动到屏幕内,然后旋转360度,同时旋转过程中进行淡入淡出的效果,就可以写出如下代码: private void multiAnimator() { // 移动动画 ObjectAnimator transAnimator = ObjectAnimator.ofFloat(mTextView, &translationX&, -500f, 300f); // 旋转动画 ObjectAnimator rotationAnimator = ObjectAnimator.ofFloat(mTextView, &rotation&, 0f, 360f); // 淡入淡出 ObjectAnimator alphaAnimator = ObjectAnimator.ofFloat(mTextView, &alpha&, 1f, 0f, 1f); AnimatorSet animatorSet = new AnimatorSet(); animatorSet.play(rotationAnimator).with(alphaAnimator).after(transAnimator); animatorSet.setDuration(5000); animatorSet.start();}
Animator监听器
一个完整的动画具有start、Repeat、End、Cancel四个过程,Android提供了接口,让我们能够很容易监听到这些事件。示例代码如下: animatorSet.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { Log.e(TAG, &onAnimationStart&); } @Override public void onAnimationEnd(Animator animation) { Log.e(TAG, &onAnimationEnd&); } @Override public void onAnimationCancel(Animator animation) { Log.e(TAG, &onAnimationCancel&); } @Override public void onAnimationRepeat(Animator animation) { Log.e(TAG, &onAnimationRepeat&); }});
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
为您提供0门槛上云实践机会
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
Android中属性动画和补间动画的区别相关信息,包括
的信息,所有Android中属性动画和补间动画的区别相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
International没有更多推荐了,
不良信息举报
举报内容:
Android补间动画&逐帧动画
举报原因:
原文地址:
原因补充:
最多只允许输入30个字
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!Android中的常用的动画类型及其本质的区别
中的动画 Animation
android3.0之前 执行两种动画, 帧动画 和 补间动画
android3.0之后 引入了一个新的动画: 属性动画
帧动画 Frame
补间动画 Tween
透明度补间动画
缩放补间动画
旋转补间动画
移动补间动画
属性动画 Property
三, 帧动画 Frame Drawable Animation &一组图片& GIF文件
每一张静止的图片显示出来, 利用人眼睛的错觉, 得出的动画
1, 资源文件创建方式
1.1 在res中创建drawable文件夹
1.2 创建动画的文件 ***.xml 标签:
1.3 在代码中或者在布局页面中, 设置ImageView的背景动画资源
android:background=&&
1.4 获得AnimationDrawable动画管理器, 调用start() 开始播放动画, 调用stop()停止播放
2, java代码创建方式
2.1 在代码中获得AnimationDrawable动画管理器
2.2 向动画管理器中添加动画
2.3 为图片设置动画
2.4 调用AnimationDrawable中start() 开始播放动画, 调用stop() 停止播放
3, 设置动画播放的次数
//if true: 执行一次
, if false: 重复执行
drawable.setOneShot(false);
四, 补间动画
补充中间的动画
开发者只需要设置开始和结束的动画, 中间的动画是由计算补齐
透明度/ 缩放/ 旋转/ 平移 / set(集合)
1, 资源文件中
存放的目录:
在res/anim/ 创建xml的资源文件
在java代码中 startAnimation(AnimationUtils.londAnimation(上下文对象,anim的资源文件id));
2, java代码中
得到Animation对象
为控件启动动画
五, 为Activity的切换添加动画
//为Activity添加动画
* enterAnim
进入的动画
* exitAnim 出去的动画
overridePendingTransition(R.anim.anim01, R.anim.anim02);
六, 属性动画 Property 3.0后出现 增强版补间动画
存放的文件夹:
res/animator/***.xml
属性动画和补间动画区别
1, 补间动画可以设置4个方向的动画,
属性动画指定任意动画
2, 补间动画是针对UI控件执行的动画, 属性动画是针对对象进行的动画
3, 补间动画移动后, 控件的实际位置没有变化 ;
属性动画会随着位置的变化而变化
translationX
translationY
透明度: alpha
1, xml的方式
1.1 res中创建文件夹 animator, 并且在文件夹中创建.xml的文件
1.2 在代码中加载资源文件中的动画
ObjectAnimator animator = (ObjectAnimator) AnimatorInflater.loadAnimator(this, R.animator.anim_scalex);
1.3 设置要执行该动画的对象
animator.setTarget(iv);
1.4 启动动画
animator.start();
2, 代码的方式
ObjectAnimator animator = ObjectAnoimator.ofFloat(目标对象,属性名称,可变参数的值);
animator.start();
AnimatorSet set = new AnimatorSet();
//定义每个动画
ObjectAnimator animator1 = ObjectAnoimator.ofFloat(目标对象,属性名称,可变参数的值);
ObjectAnimator animator2 = ObjectAnoimator.ofFloat(目标对象,属性名称,可变参数的值);
List list = new ArrayList();
list.add(animator1);
list.add(animator2);
//把动画添加到集合中
set.playSequentially(list);//依次执行
//set.playTogether(list);//一起执行
//第二种方式
//set.play(animator1).with(animator2);
set.start();
alphaAnimator.addListener(new AnimatorListener() {
public void onAnimationStart(Animator animation) {
// TODO 动画开始时, 执行
public void onAnimationRepeat(Animator animation) {
// TODO 动画重复的时候, 执行
public void onAnimationEnd(Animator animation) {
// TODO 动画结束时,执行
public void onAnimationCancel(Animator animation) {
// TODO 动画取消时执行Android 中的动画有哪几类,它们的特点和区别是什么【芯学苑吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:23贴子:
Android 中的动画有哪几类,它们的特点和区别是什么收藏
视图动画,或者说补间动画。只是视觉上的一个效果,实际view属性没有变化,性能好,但是支持方式少。属性动画,通过变化属性来达到动画的效果,性能略差,支持点击等事件。android 3.0帧动画,通过drawable一帧帧画出来。Gif动画,原理同上,canvas画出来。
登录百度帐号android使用属性动画代替补间动画
本文参考属性动画完全解析(上),初识属性动画的基本用法
android3.0之前一共有两种动画,分别是frame动画和tween动画,关于这两种动画如果不了解可以查看我之前的文章android之frame动画详解 和android之tween动画详解 ,frame动画就是逐帧动画,把多张图片放在一起连续播放实现一种类似于gif图片的动画效果,tween动画就是补间动画,主要是对图像进行平移,缩放,旋转,改变透明度等。
tween动画被称作View Animation,第一句就说的很清楚了,你可以使用View Animation System 来在View上实现tween动画。也就是说tween动画只能作用在view上,可是如果我们想变换一个自定义View的颜色该怎么办?抱歉,tween无法做到。
android3.0推出了一种新的动画实现方式,那就是属性动画,属性动画,顾名思义,就是作用在View的属性上,我们可以让View的属性实现动画效果。
说到这里我们不得不介绍ObjectAnimator类,这个也是在实际开发中用的最多的,追根溯源,我们发现ObjectAnimator继承自ValueAnimator,ValueAnimator可以帮助我们实现一些简单的数值的变化,不过到目前为止还没用上这个东东。
下面我们先来看看怎么使用属性动画来实现tween动画效果:
ObjectAnimator animator = ObjectAnimator.ofFloat(tv, alpha, 1f,
animator.setDuration(5000);
animator.start();
我们通过ofFloat方法来获得一个ObjectAnimator实例,先看看该方法的:
public static ObjectAnimator ofFloat(Object target, String propertyName, float... values) {
ObjectAnimator anim = new ObjectAnimator(target, propertyName);
anim.setFloatValues(values);
从源码中可以看到该方法接收N个参数,第一个是我们要设置动画的对象,第二个参数给哪个属性设置动画,后面两个参数表示控件从不透明变为半透明,后面的参数可以传N多个,比如
ObjectAnimator animator = ObjectAnimator.ofFloat(tv, alpha, 1f,
0.5f,1f,0f);
表示控件从不透明到半透明再到不透明,最后到全透明这样一个状态。有了这个例子之后,我想要实现其他tween动画实现的效果都不是问题了。
ObjectAnimator animator2 = ObjectAnimator.ofFloat(tv2, rotation,
0f, 360f);
animator2.setDuration(5000);
animator2.start();
float curTranslationX = tv.getTranslationX();
ObjectAnimator animator = ObjectAnimator.ofFloat(tv,
translationX, curTranslationX, -1000f, curTranslationX);
animator.setDuration(3000);
animator.start();
如果要实现组合动画效果呢?
ObjectAnimator moveIn = ObjectAnimator.ofFloat(tv, translationX,
-500f, 0f);
ObjectAnimator rotate = ObjectAnimator.ofFloat(tv, rotation, 0f,
ObjectAnimator fadeInOut = ObjectAnimator.ofFloat(tv, alpha, 1f,
AnimatorSet animSet = new AnimatorSet();
animSet.play(rotate).with(fadeInOut).after(moveIn);
animSet.setDuration(5000);
animSet.start();
哈哈,还是很简单吧。
这里有一个需要注意的地方就是:
// after(Animator anim) 现有动画在传入的动画之后执行
// after(long delay) 现有动画延迟指定毫秒后执行
// before(Animator anim) 现有动画在传入的动画之前执行
// with(Animator anim) 现有动画和传入的动画同时执行
当然,属性动画和tween动画一样,即可以使用代码实现也可以使用xml来实现,那么我们看看怎么通过xml文件来实现属性动画:
android:ordering的值为together表示各个维度的变化同时发生,缺省值也是together,sequentially表示动画依次发生。
基本上就是这样。

我要回帖

更多关于 flash形状补间动画 的文章

 

随机推荐