android动画原理
⑴ Android常见动画效果合集,让APP熠熠生辉,绚丽灵动
在App中添加一些动画效果,会给用户耳目一新,眼前一亮的感觉,让APP显的高端大气上档次,因此开发项目的过程中能够实现一些常见的动画效果还是很有必要的,Android本身提供了丰富的动画API,方便我们实现炫酷的动画效果。
先放上几张实现的效果图:
一帧一帧进行播放,它的原理与Gif类似,按序播放一组预先定义好的图片序列,如:
直接更改View 的属性来实现的动画。
工作原理:在一定时间间隔内,通过不断调用set方法对值进行改变,并不断将该值赋给对象的属性,从而实现该对象在该属性上的动画效果
Google在Android 5.0之后推出的一种动画效果,就是以某种方式从一个场景以动画的形式过渡到另一个场景,可以参考 Material-Animations ,常用于点击列表页中的图片跳转到大图或由列表页跳转到详情页
Lottie 是 Airbnb推出的一套跨平台的动画完整解决方案,它能够帮助开发者直接加载json格式的文件在 iOS、Android 和 React Native之上,实现 100% 与设计稿相同的动画效果,而无需关心中间的实现细节。设计师只需要使用 After Effectes 设计出动画之后,通过使用 Lottie 提供的Bodymovin插件将设计好的动画导出成json格式的文件交付给开发即可完成。 Lottie网站 lottie-android
跨平台的即时通信软件Telegram推出的新的Sticker贴纸格式,这个全新的 Sticker 贴纸格式为 .tgs,其实就是基于Lottie json文件改造而来的一种格式
GIF(Graphics Interchange Format)是由CompuServe公司开发的一种图像文件格式,可以将多幅图像保存到一个图像文件,展示的时候将多幅图像数据逐帧读出并显示到屏幕上,从而形成动画效果。在Android中播放GIF通常有以下几种方式:
https://github.com/kongpf8848/Animation
animlogoview
Telegram
⑵ Android 动画详解
android中酷炫的效果,都离不开动画的支持。这里我们详细介绍一下android中动画的分类。android的中动画分为帧动画、补间动画、属性动画。原理各不相同,实现的效果也大不相同。下面一一讲解三种动画。
帧动画顾名思义就是通过顺序一帧一帧播放图片从而产生动画效果,效果类似放电影。该动画缺点比较明显,就是如果图片过大过多会导致OOM。帧动画xml文件放置在drawable目录下而非anim文件夹下。
补间动画是通过对view进行旋转、缩放、渐变、透明度变化,而达到的一种动画效果。是一种渐进式动画。并且可以通过组合以上四种操作,完成复杂的自定义动画效果。缺点就是只是改变的view的展示状态,但是不会改变view的位置。例如我们将一个button通过位移想左移动100dp,然后停留在终点。但是我们可以发现展示的位置button点击无效果,不可以交互。而在button原始位置空白的地方点击会触发button的点击效果。也就是button本质还是在原来位置,只是展示左移了100dp。
透明度动画,通过改变view的透明度展示动画。对应AlphaAnimation和<alpha>xml标签
缩放动画,通过修改view的大小展示动画。对应ScaleAnimation类和<scale>xml表情
通过旋转view展示动画。对应RotateAnimation类和<rotate>xml标签
平移动画,更改view的展示位置展示动画。对应TranslateAnimation类和<translate>xml表情
应用动画xml配置
使用java类配置动画,具体参数类同xml参数,建议使用xml配置动画
属性动画本质是通过改变对象的属性(例如:x,y等属性),来实现动画的,所以基本上是无所不能的,只要对象有这个属性,就能实现动画效果。属性动画是在api11的新特性,通过动态的改变view的属性从而达到动画效果。虽然可以使用nineoldandroid库向下兼容,但是兼容本质是使用补间动画完成,也就是说不会更改view的属性,也不会更改view的位置。属性动画比较常用的类: ValueAnimator、ObjectAnimator、AnimationSet,其中ObjectAnimator是ValueAnimator的子类,而AnminationSet是动画集合
动画配置同样可以使用xml配置,参数类似,这里不做详细说明。
根据时间流逝百分比计算当前属性改变百分比。同xml配置动画中的 android:interpolator 属性配置,常见有LinearInterpolator(线性差值器)、(加速减速差值器)
等。自定义需要实现 Interpolator 或者 TimeInterpolator 。Interpolator接口继承TimeInterpolator。
根据当前属性改变百分比计算改变后的属性值。属性动画特有的属性。自定义估值器需要实现 TypeEvaluator 接口。
可以对任意属性做属性动画,属性动画要求动画作用的对象提供该属性的get()和set()方法。因为属性动画本质就是根据外界传递的对象属性的初始值和终点值,然后根据估值器和差值器计算属性值,不断调用属性的set方法,通过时间的推移所传递的值,越来越近终点值。
注意:
使用ValueAnimator通过监听动画过程,自己改变对象属性完成动画
⑶ ios和安卓的动画原理是什么
1:首先说动画效果,所谓的动画效果就是一个属性(属性组)的数值随时间从一个值变化到另一个值得过程。Android 目前提供了两个机制来实现动画: 一种是比较古老的 Animation 机制,对应的也是 Animation 类和它的子类,但是这些类并不负责调度动画。什么意思呢,动画的运行需要让数值随着时间变化,怎么随时间变化?通常来说我们需要一个 Timer,但是 Animation 机制没有使用所谓的 Timer,而采用了自刷新的方式,所谓自刷新就是当一帧绘制完的时候马上再计划绘制下一帧,直到动画到达终点。具体的逻辑在View#draw(Canvas canvas, ViewGroup parent,long drawingTime) 这个方法中Animation 类及子类的作用就是根据一个时间,计算出对应的属性值,然后设置到 View 上。 2:于 alpha、transform 之类的属性是如何实现的,这个说简单也不简单,说复杂也不复杂,实际上很多 2D 图形渲染库都能很轻易实现这些。只不过 Android 5.0 之后引入 RenderNode 的机制,每个单一的 View 实际都是 RenderNode-backing 的一层皮,实际的渲染内容是包含在等高级特性。Canvas 在 Android 5.0 之后直接向 DisplayList 中绘制,也就是记录下来绘制指令,然后将这些一并送到渲染服务中进行合成,以 View 为单位的 alpha、transform 可以得到硬件加速(OpenGL、Vulkan)的支持,而面向 Bitmap(或旧版本 Android 的 View)的 Canvas 绘制有透明度的东西就是纯 CPU 计算了,由 Skia 库实现算法。
⑷ Android如何将逐帧动画加在界面上
动画的使用 是 Android 开发中常用的知识
可是动画的 种类繁多、使用复杂 ,每当需要 采用自定义动画 实现 复杂的动画效果 时,很多开发者就显得束手无策
本文将详细介绍 Android 动画中 逐帧动画 的原理 & 使用
#1. 作用对象 视图控件( View )
1. 如 Android 的 TextView、Button 等等
2. 不可作用于 View 组件的属性,如:颜色、背景、长度等等
#2. 原理
将动画拆分为 帧 的形式,且定义每一帧 = 每一张图片
逐帧动画的本质:按序播放一组预先定义好的图片
#3. 具体使用 ####步骤1:将动画资源(即每张图片资源)放到 drawable 文件夹里
技巧:
1. 找到自己需要的gif动画
2. 用 gif 分解软件(如 GifSplitter )将 gif 分解成一张张图片即可
⑸ Android 中的动画有哪几类,它们的特点和区别是什么
Android3.0(即API Level11)前Android仅支持2种画:别Frame Animation(逐帧画)Tween Animation(补间画)3.0Android支持种新画系统称:Property Animation(属性画)
、Frame Animation:(逐帧画)
理解帧帧播放图片利用眼视觉残留原理给我带画觉原理GIF图片、电影播放原理
1.定义逐帧画比较简单要使用元素定义所播放帧即
(1) android:oneshot 设置否仅播放
(2) android:drawable 设置每帧图片
(3) android:ration 设置图片间切换间隔
2.习惯AnimationDrawable设置ImageView背景
android:background=@anim/frame_anim
我java代码获取AnimationDrawable象
AnimationDrawable anim = (AnimationDrawable)imageView.getBackground();
(需要注意AnimationDrawable默认播放调用其start()始播放stop停止播放)
3.面画文件通xml文件配置喜欢通java代码创建AnimationDrawable象通addFrame(Drawable frame, int ration)向画添加帧start()
二、Tween Animation:(补间画)
补间画我需指定始、结束关键帧变化其帧由系统计算必自帧帧定义
1. Android使用Animation代表抽象画包括四种类:AlphaAnimation(透明度画)、ScaleAnimation(缩放画)、TranslateAnimation(位移画)、RotateAnimation(透明度画)Android面允许java创建Animation类象般都采用画资源文件定义画界面与逻辑离
(set同定义画起执行)
2. android:interpolator=@android:anim/linear_interpolator控制画期间需要补入少帧简单说控制画速度些翻译插值Interpolator几种实现类:LinearInterpolator、AccelerateInterpolator、、CycleInterpolator、DecelerateInterpolator具体使用参考官API Demo
3. 定义anim文件我通AnimationUtils工具类加载加载功返Animation通ViewstartAnimation(anim)始执行画
Animation anim = AnimationUtils.loadAnimation(this, R.anim.anim);
//设置画结束保留结束状态
anim.setFillAfter(true);
//设置插值效
anim.setInterpolator(interpolator);
//view执行画
view. startAnimation(anim);
三、Property Animation:(属性画)
属性画Android 3.0才引进直接更改我象属性面提Tween Animation更改View绘画效View真实属性改变假设用Tween画Button左边移右边论点击移Button都没反应点击移前Button位置才反应Button位置属性木改变Property Animation则直接改变View象属性值让我少做些处理工作提高效率与代码读性
(1)ValueAnimator:包含Property Animation画所核功能画间始、结束属性值相应间属性值计算等应用ValueAnimator两步骤
1计算属性值
2根据属性值执行相应作改变象某属性
我主第二步需要实现ValueAnimator.onUpdateListener接口接口函数onAnimationUpdate()要改变View象属性事情该接口do
animation.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
//do your work
}
});
(2)ObjectAnimator:继承自ValueAnimator要指定象及该象属性属性值计算完自设置该象相应属性即完Property Animation全部两步操作实际应用般都用ObjectAnimator改变某象某属性用ObjectAnimator定限制要想使用ObjectAnimator应该满足条件:
1.象应该setter函数:set(驼峰命名)
2面例像ofFloat类工场第参数象名第二属性名面参数变参数values…参数设置值假定目值属性值变化范围前值目值获前值该象要相应属性getter:get
3getter其应返值类型应与相应setter参数类型致
ObjectAnimator oa=ObjectAnimator.ofFloat(tv, alpha, 0f, 1f);
oa.setDuration(3000);
oa.start();
满足面条件我能乖乖使用ValueAnimator创建画
(3)Animator.AnimatorListener:Animator设置画监听需要重写面四
onAnimationStart()
onAnimationEnd()
onAnimationRepeat()
onAnimationCancel()
我实现AnimatorListenerAdapter处用定义想监听事件用实现每函数却定义空函数体:
anim.addListener(new AnimatorListenerAdapter() {
public void on AnimationEnd(Animator animation){
//do your work
}
});
(4)AnimationSet:组合画共同工作
AnimatorSet bouncer = new AnimatorSet();
bouncer.play(anim1).before(anim2);
bouncer.play(anim2).with(anim3);
bouncer.play(anim2).with(anim4)
bouncer.play(anim5).after(amin2);
animatorSet.start();
面代码意思: 首先播放anim1;同播放anim2,anim3,anim4;播放anim5
(5)TimeInterplator:与Tweeninterpolator类似几种
AccelerateInterpolator 加速始慢间加速
DecelerateInterpolator 减速始快减速
先加速减速始结束慢间加速
AnticipateInterpolator 反向 先向相反向改变段再加速播放
反向加弹先向相反向改变再加速播放超目值缓慢移至目值
BounceInterpolator 跳跃快目值值跳跃目值100面值能依8577708090100
CycleIinterpolator 循环画循环定数值改变弦函数:Math.sin(2 * mCycles * Math.PI * input)
LinearInterpolator 线性线性均匀改变
OvershottInterpolator 弹超目值缓慢改变目值
TimeInterpolator 接口允许自定义interpolator几都实现接口
(6)Keyframes:让我定义除始结束外关键帧KeyFrame抽象类要通ofInt(),ofFloat(),ofObject()获适KeyFrame通PropertyValuesHolder.ofKeyframe获PropertyValuesHolder象:
Keyframe kf0 = Keyframe.ofInt(0, 400);
Keyframe kf1 = Keyframe.ofInt(0.25f, 200);
Keyframe kf2 = Keyframe.ofInt(0.5f, 400);
Keyframe kf4 = Keyframe.ofInt(0.75f, 100);
Keyframe kf3 = Keyframe.ofInt(1f, 500);
PropertyValuesHolder pvhRotation = PropertyValuesHolder.ofKeyframe(width, kf0, kf1, kf2, kf4, kf3);
ObjectAnimator rotationAnim = ObjectAnimator.ofPropertyValuesHolder(btn, pvhRotation);
述代码意思:设置btn象width属性值使其:始 Width=400画始1/4 Width=200画始1/2 Width=400画始3/4 Width=100画结束 Width=500
(7)ViewPropertyAnimator:View同改变种属性非推荐用种该类属性画进行优化合并些invalidate()减少刷新视图且使用起非简便要求API LEVEL 12即Android 3.1仅需要行代码即完水平、竖直移
myView.animate().translationX(50f). translationY(100f);
(8)需要改变些属性:
translationX,translationY: View相于原始位置偏移量
rotation,rotationX,rotationY: 旋转rotation用于2D旋转角度3D用两
scaleX,scaleY: 缩放比
x,y: View终坐标Viewlefttop位置加translationXtranslationY
alpha: 透明度
四、自总结三种画优缺点:
(1)Frame Animation(帧画)主要用于播放帧帧准备图片类似GIF图片优点使用简单便、缺点需要事先准备每帧图片;
(2)Tween Animation(补间画)仅需定义始与结束关键帧变化间帧由系统补优点用准备每帧缺点改变象绘制没改变View本身属性改变按钮位置需要点击原按钮所位置才效
(3)Property Animation(属性画)3.0推画优点使用简单、降低实现复杂度、直接更改象属性、几乎适用于任何象仅非View类缺点需要3.0API支持限制较目前外源库提供低版本支持
⑹ Android WMS动画系统初探(一)
Android WMS动画系统初探(一)
Android WMS动画系统初探(二)
Android WMS动画系统初探(三)
Android中动画的工作过程:在某一个时间点,调用getTransformation(),根据mStartTime和mDuration,计算出当前的进度,在根据mInterpolator计算出转换的进度,然后计算出属性的当前值,保存在matrix中。
再调用Matrix.getValues将属性值取出,运用在动画目标上。
[图片上传失败...(image-8c5ae5-1636101404926)]
Animation
在给定了初始状态、结束状态、启动时间与持续时间后,可以为使用者计算其动画目标在任意时刻的变换(Transformation)
Transformation
描述了一个变换,包含两个分量:透明度和一个二维变换矩阵
无论APP或者系统,都是可以直接向Choreographer注册FrameCallback来实现动画驱动的。
Choreographer 类似 Handler,处理回调的时机为屏幕的垂直同步(VSync)事件到来之时,其处理回调的过程被当作渲染下一帧的工作的一部分
postCallback(int callbackType, Runnable action, Object token)
postCallbackDelayed(int callbackType, Runnable action, Object token, delayMillis)
postFrameCallback(FrameCallback callback)
对于View动画,动画的目标就是View,而对于窗口来说,动画的目标其实都是Surface,对 不同层级的SurfaceControl 进行操纵,会产生不同的动画效果。
[图片上传失败...(image-b25ef9-1636101404926)]
如上图 WMS的结构层次可以简单概括为:
RootWindowContainer -> DisplayContent -> DisplayArea -> Task -> WindowToken -> WindowState
[图片上传失败...(image-2bdd8a-1636101404926)]
根据操纵层级的不同我把动画分类为:窗口动画、过渡动画、Task动画、全屏动画等等
[图片上传失败...(image-d5ed20-1636101404926)]
在窗口布局(relayout)阶段调用到
WindowStateAnimator#commitFinishDrawingLocked ->
WindowState#performShowLocked ->
WindowStateAnimator#applyEnterAnimationLocked
开启窗口动画流程
frameworks/base/services/core/java/com/android/server/wm/WindowContainer.java中定义了一个mSurfaceAnimator成员变量
SurfaceAnimator的startAnimation方法中创建Leash,可以通过SurfaceAnimator的类注释了解 Leash
为什么引入Leash可以参考此文: Android P——LockFreeAnimation
mAnimation.startAnimation这一步最终会通过LocalAnimationAdapter找到WMS里的SurfaceAnimationRunner进行执行。
这是 WindowContainer与SurfaceAnimtor、SurfaceAnimationRunner的持有关系 :
[图片上传失败...(image-f741c0-1636101404926)]
往编舞者上抛的runnable是执行startAnimations方法
SurfaceAnimationRunner#startAnimations ->
SurfaceAnimationRunner#startPendingAnimationsLocked
会从mPendingAnimations遍历RunningAnimation并执行startAnimationLocked
这一步构建了一个SfValueAnimator来真正的驱动动画,每一帧的处理是通过WindowAnimationSpec构建真正要执行的动画事务,然后使用mChoreographer.postCallback在下一个vsync信号到来时提交动画事务。
ValueAnimator驱动动画的原理本文就不做深入了。
下一篇文章我将进一步分析Activiy的过渡动画和屏幕旋转动画的相关流程。
Android WMS动画系统初探(二)
Android WMS动画系统初探(三)
⑺ android中的动画有哪几类
在Android3.0(即API Level11)以前,Android仅支持2种动画:分别是Frame Animation(逐帧动画)和Tween Animation(补间动画),在3.0之后Android支持了一种新的动画系统,称为:Property Animation(属性动画)。
一、Frame Animation:(逐帧动画)
这个很好理解,一帧帧的播放图片,利用人眼视觉残留原理,给我们带来动画的感觉。它的原理的GIF图片、电影播放原理一样。
1.定义逐帧动画比较简单,只要在中使用子元素定义所有播放帧即可。
(1) android:oneshot 设置是否仅播放一次
(2) android:drawable 设置每一帧图片
(3) android:ration 设置图片间切换间隔
2.习惯上把AnimationDrawable设置为ImageView的背景
android:background=@anim/frame_anim
然后我们就可以在java代码中获取AnimationDrawable对象了
AnimationDrawable anim = (AnimationDrawable)imageView.getBackground();
(需要注意的是,AnimationDrawable默认是不播放的,调用其start()方法开始播放,stop停止播放)
3.上面的动画文件是通过xml文件来配置的,如果你喜欢,也可以通过在java代码中创建AnimationDrawable对象,然后通过addFrame(Drawable frame, int ration)方法向动画添加帧,然后start()。。。
二、Tween Animation:(补间动画)
补间动画就是我们只需指定开始、结束的“关键帧“,而变化中的其他帧由系统来计算,不必自己一帧帧的去定义。
1. Android使用Animation代表抽象动画,包括四种子类:AlphaAnimation(透明度动画)、ScaleAnimation(缩放动画)、TranslateAnimation(位移动画)、RotateAnimation(透明度动画)。Android里面允许在java中创建Animation类对象,但是一般都会采用动画资源文件来定义动画,把界面与逻辑分离
<set android:interpolator="@android:anim/linear_interpolator" xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 定义透明度的变换 -->
<!-- 定义旋转变换 -->
<rotate android:ration="3000/" android:fromdegrees="0" android:pivotx="50%" android:pivoty="50%" android:todegrees="1800">
</rotate></alpha></set>
(一个set可以同时定义多个动画,一起执行。)
2. android:interpolator=@android:anim/linear_interpolator控制动画期间需要补入多少帧,简单来说就是控制动画速度,有些地方翻译为“插值“。Interpolator有几种实现类:LinearInterpolator、AccelerateInterpolator、、CycleInterpolator、DecelerateInterpolator,具体使用可以参考官方API Demo。
3. 定义好anim文件后,我们可以通过AnimationUtils工具类来加载它们,加载成功后返回一个Animation。然后就可以通过View的startAnimation(anim)开始执行动画了。
Animation anim = AnimationUtils.loadAnimation(this, R.anim.anim);
//设置动画结束后保留结束状态
anim.setFillAfter(true);
//设置插值效果
anim.setInterpolator(interpolator);
//对view执行动画
view. startAnimation(anim);
三、Property Animation:(属性动画)
属性动画,这个是在Android 3.0中才引进的,它可以直接更改我们对象的属性。在上面提到的Tween Animation中,只是更改View的绘画效果而View的真实属性是不改变的。假设你用Tween动画将一个Button从左边移到右边,无论你怎么点击移动后的Button,他都没有反应。而当你点击移动前Button的位置时才有反应,因为Button的位置属性木有改变。而Property Animation则可以直接改变View对象的属性值,这样可以让我们少做一些处理工作,提高效率与代码的可读性。
(1)ValueAnimator:包含Property Animation动画的所有核心功能,如动画时间,开始、结束属性值,相应时间属性值计算方法等。应用ValueAnimator有两个步骤
1计算属性值。
2根据属性值执行相应的动作,如改变对象的某一属性。
我们的主是第二步,需要实现ValueAnimator.onUpdateListener接口,这个接口只有一个函数onAnimationUpdate(),将要改变View对象属性的事情在该接口中do。
animation.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
//do your work
}
});
(2)ObjectAnimator:继承自ValueAnimator,要指定一个对象及该对象的一个属性,当属性值计算完成时自动设置为该对象的相应属性,即完成了Property Animation的全部两步操作。实际应用中一般都会用ObjectAnimator来改变某一对象的某一属性,但用ObjectAnimator有一定的限制,要想使用ObjectAnimator,应该满足以下条件:
1.对象应该有一个setter函数:set(驼峰命名法)
2如下面的例子,像ofFloat之类的工场方法,第一个参数为对象名,第二个为属性名,后面的参数为可变参数,如果values…参数只设置了一个值的话,那么会假定为目的值,属性值的变化范围为当前值到目的值,为了获得当前值,该对象要有相应属性的getter方法:get
3如果有getter方法,其应返回值类型应与相应的setter方法的参数类型一致。
ObjectAnimator oa=ObjectAnimator.ofFloat(tv, alpha, 0f, 1f);
oa.setDuration(3000);
oa.start();
如果不满足上面的条件,我们只能乖乖的使用ValueAnimator来创建动画。
(3)Animator.AnimatorListener:可以为Animator设置动画监听,需要重写下面四个方法。
onAnimationStart()
onAnimationEnd()
onAnimationRepeat()
onAnimationCancel()
这里我们也可以实现AnimatorListenerAdapter,他的好处是可以只用定义想监听的事件而不用实现每个函数却只定义一空函数体。如下:
anim.addListener(new AnimatorListenerAdapter() {
public void on AnimationEnd(Animator animation){
//do your work
}
});
(4)AnimationSet:可以组合多个动画共同工作
AnimatorSet bouncer = new AnimatorSet();
bouncer.play(anim1).before(anim2);
bouncer.play(anim2).with(anim3);
bouncer.play(anim2).with(anim4)
bouncer.play(anim5).after(amin2);
animatorSet.start();
上面的代码意思是: 首先播放anim1;同时播放anim2,anim3,anim4;最后播放anim5。
(5)TimeInterplator:与Tween中的interpolator类似。有以下几种
AccelerateInterpolator 加速,开始时慢中间加速
DecelerateInterpolator 减速,开始时快然后减速
先加速后减速,开始结束时慢,中间加速
AnticipateInterpolator 反向 ,先向相反方向改变一段再加速播放
反向加回弹,先向相反方向改变,再加速播放,会超出目的值然后缓慢移动至目的值
BounceInterpolator 跳跃,快到目的值时值会跳跃,如目的值100,后面的值可能依次为85,77,70,80,90,100
CycleIinterpolator 循环,动画循环一定次数,值的改变为一正弦函数:Math.sin(2 * mCycles * Math.PI * input)
LinearInterpolator 线性,线性均匀改变
OvershottInterpolator 回弹,最后超出目的值然后缓慢改变到目的值
TimeInterpolator 一个接口,允许你自定义interpolator,以上几个都是实现了这个接口
(6)Keyframes:可以让我们定义除了开始和结束以外的关键帧。KeyFrame是抽象类,要通过ofInt(),ofFloat(),ofObject()获得适当的KeyFrame,然后通过PropertyValuesHolder.ofKeyframe获得PropertyValuesHolder对象,如下:
Keyframe kf0 = Keyframe.ofInt(0, 400);
Keyframe kf1 = Keyframe.ofInt(0.25f, 200);
Keyframe kf2 = Keyframe.ofInt(0.5f, 400);
Keyframe kf4 = Keyframe.ofInt(0.75f, 100);
Keyframe kf3 = Keyframe.ofInt(1f, 500);
PropertyValuesHolder pvhRotation = PropertyValuesHolder.ofKeyframe(width, kf0, kf1, kf2, kf4, kf3);
ObjectAnimator rotationAnim = ObjectAnimator.ofPropertyValuesHolder(btn, pvhRotation);
上述代码的意思是:设置btn对象的width属性值使其:开始时 Width=400,动画开始1/4时 Width=200,动画开始1/2时 Width=400,动画开始3/4时 Width=100,动画结束时 Width=500。
(7)ViewPropertyAnimator:对一个View同时改变多种属性,非常推荐用这种。该类对多属性动画进行了优化,会合并一些invalidate()来减少刷新视图。而且使用起来非常简便,但是要求API LEVEL 12,即Android 3.1以上。仅需要一行代码即可完成水平、竖直移动
myView.animate().translationX(50f). translationY(100f);
(8)常需要改变的一些属性:
translationX,translationY: View相对于原始位置的偏移量
rotation,rotationX,rotationY: 旋转,rotation用于2D旋转角度,3D中用到后两个
scaleX,scaleY: 缩放比
x,y: View的最终坐标,是View的left,top位置加上translationX,translationY
alpha: 透明度
四、最后自己总结一下这三种动画的优缺点:
(1)Frame Animation(帧动画)主要用于播放一帧帧准备好的图片,类似GIF图片,优点是使用简单方便、缺点是需要事先准备好每一帧图片;
(2)Tween Animation(补间动画)仅需定义开始与结束的关键帧,而变化的中间帧由系统补上,优点是不用准备每一帧,缺点是只改变了对象绘制,而没有改变View本身属性。因此如果改变了按钮的位置,还是需要点击原来按钮所在位置才有效。
(3)Property Animation(属性动画)是3.0后推出的动画,优点是使用简单、降低实现的复杂度、直接更改对象的属性、几乎可适用于任何对象而仅非View类,缺点是需要3.0以上的API支持,限制较大!但是目前国外有个开源库,可以提供低版本支持!
⑻ Android 共享元素效果
Transition 框架是 Android 4.4 KitKat 中加入的,但在 5.0 才开始被人应用起来,
而且这一部分也涉及了 22.0 的 API,虽然有对应的 support.v4 包,但也还是有点问题。
所以这一部分可以说是 5.0 以上适用的方法。
效果(录制出来的效果有点卡顿):
这里遇到一点小问题,即上述 Activity 引用的 style 中不仅设置了 android:windowIsTranslucent ,也设置了 android:windowIsTranslucent : 让 Activity 的背景为透明,在我测试的时候发现使用共享元素的时候出现了返回时闪屏的现象,解决方法是设置 Activity 背景颜色为透明。
在 onCreate 中:
或者在上述的 style 中的 theme 添加:
在打开的 Activity 的 xml 中
对应的 ImageView 中的 android:transitionName 属性值必须相同,而对两个控件的大小、id 等属性并无要求。
在 makeSceneTransitionAnimation 传入的参数中,mImgView 是第一个界面中 ImageView 的实例,第三个参数对应 xml 中的 android:transitionName 的值。
因为打开新的 Activity 的时候,可能要去加载新的图片,这时候我们需要 延迟过渡动画的开始 ,直到图片加载完成之后再开始动画。否则会出现各种 bug。
所以要在第二个 Activity 中的 onCreate() 中阻止动画的执行:
然后在图片加载完成后开始动画:
当然,启动动画不一定要等待图片加载完成再进行,因为还存在着图片加载失败、加载时间过长等问题,这里只是提出一种方法,实际还是自己看情况决定。
以上只是简单的实现了一种效果,关于 Transition 的使用、共享元素在
Fragment 中的使用、多个共享元素的使用等,在这里暂时不打算细讲,可以参考:
使用 Transition FrameWork 实现有意义的转场动画(译)
(译)Android 5.0 页面共享元素过渡
定义定制动画
原理大概就是如此,实现动画的方法有很多种。
可以参考:
Activity 共享元素转场动画实践
Android共享元素转场动画兼容实践
⑼ Android动画之ViewPropertyAnimator(专用于view的属性动画)
属性动画对比原来的视图动画有很多的优点,属性动画可以对所有的对象做动画操作,但Android开发中需要做动画最多的还是View,如果只是对一个view做动画,很少的几个属性还行,如果是对同一个view的十几个属性同时做动画,相信属性动画的写法是比较繁琐的。ViewPropertyAnimator从名字就可以看出是专用于View的属性动画,在API12被提供。ViewPropertyAnimator专用于操作View动画,语法更加简洁,使用更加方便。
developer: https://developer.android.google.cn/reference/android/view/ViewPropertyAnimator
如何获取ViewPropertyAnimator 对象:
ViewPropertyAnimator 没有构造函数,通过View.animate()方法可以方便的获取ViewPropertyAnimator 对象,此时获取的动画对象就专用于操作当前view。
setDuration(); //设置动画时长
setInterpolator(); //设置插值器
setStartDelay(); //设置延迟开始时间
start(); //立刻开始动画
cancel(); //取消动画
明显看到图片先往下走了一段,然后向左的动画才开始执行。
链式操作
ViewPropertyAnimator viewPropertyAnimator = gongxiang.animate().setDuration(2000).translationY(300).scaleX(0.5f);
以上函数的执行,会导致相同动画的cancle,以上函数都是除了坐标相关都是以view左上角为坐标原点。
方法都比较简单,下面距几个列子:
首先利用translationX,translationXBy来区分By的意义:
ViewPropertyAnimator viewPropertyAnimator = gongxiang.animate().setDuration(3000).translationY(300);
ViewPropertyAnimator viewPropertyAnimator = gongxiang.animate().setDuration(3000).translationYBy(300);
translationYBy 可以多次移动View,translationY多次执行没有效果。
ViewPropertyAnimator viewPropertyAnimator = gongxiang.animate().setDuration(3000).x(100).y(100);
ViewPropertyAnimator viewPropertyAnimator = gongxiang.animate().setDuration(2000).rotation(270);
据观察withEndAction相当于动画开始,withStartAction相当于动画结束。
可以看到可以添加setUpdateListener监听,但无法通过这个监听函数监听到当前动画的信息,所以这个监听函数可能用处不大。
Animation动画概述和执行原理
Android动画之补间动画TweenAnimation
Android动画之逐帧动画FrameAnimation
Android动画之插值器简介和系统默认插值器
Android动画之插值器Interpolator自定义
Android动画之视图动画的缺点和属性动画的引入
Android动画之ValueAnimator用法和自定义估值器
Android动画之ObjectAnimator实现补间动画和ObjectAnimator自定义属性
Android动画之ObjectAnimator中ofXX函数全解析-自定义Property,TypeConverter,TypeEvaluator
Android动画之AnimatorSet联合动画用法
Android动画之LayoutTransition布局动画
Android动画之共享元素动画
Android动画之ViewPropertyAnimator(专用于view的属性动画)
Android动画之Activity切换动画overridePendingTransition实现和Theme Xml方式实现
Android动画之ActivityOptionsCompat概述
Android动画之场景变换Transition动画的使用
Android动画之Transition和TransitionManager使用
Android动画之圆形揭露动画Circular Reveal
Android 动画之 LayoutAnimation 动画
Android动画之视图动画的缺点和属性动画的引入
⑽ android中怎么实现属性动画
手机上去实现一些动画效果算是件比较炫酷的事情,因此Android系统在一开始的时候就给我们提供了两种实现动画效果的方式,逐帧动画(frame-by-frame animation)和补间动画(tweened animation)。逐帧动画的工作原理很简单,其实就是将一个完整的动画拆分成一张张单独的图片,然后再将它们连贯起来进行播放,类似于动画片的工作原理。补间动画则是可以对View进行一系列的动画操作,包括淡入淡出、缩放、平移、旋转四种。