1. 知识体系四:android动画工作原理
1.Android 动画的工作原理?
在android系统中动画分为两种分别是帧动画和属性动画。对于动画的工作原理主要涉及到的是帧动画的实现。
帧动画主要有旋转RotatleAnimation,缩放ScaleAnimation,透明AlphaAnimation,平移TranslateAnimation等都是Animation的子类。Animation控制动画的效果,Transformation 对动画进行计算。
对于动画的原理简单说就是从一个动画的启动状态,到动画结束状态,和动画持续总时间,在这段时间中任一时间点动画的状态计算和显示的过程。
计算 :是通过Animation的getTransformation()方法首先对时间进行归一化时间让时间在0~1之间,进行计算。满足条件之后就会调用applyTransformation()方法处理实现动画类型的计算。当前时间点的转换状态保存到Transformation 的Matrix中等待显示的时候使用。
显示 :动画显示工作主要依赖于Choreograther类,此类是线程唯一的,Choreograther和Handler用法类似,都是通过post一个Runnable对象到队列中等待VSYSC屏幕垂直同步信号刷新(16ms)刷新一次,然后触发ViewRootImpl的view的遍历工作,回调到view.draw()方法时就会把之前applyTransformation 计算的此时刻的Transformation 的Matrix赋值到Canvas上, 这也就是为什么我们使用帧动画时候我们的view的属性并没有改变,这就是根源因为计算得到的Matrix被Canvas使用了,并没有直接赋值到我们的view上。 对于属性动画来说主要使用animator实现看下面解析:
2.Animation 和 Animator 的区别?
Animation和Animator都是抽象类,都有子类,Animation通过Transformation对动画进行Matrix转换来作用到Canvas上实现动画效果。而Animator只是一个工具类,主要是用来控制在一段时间内某一个值的变化过程,然后我们再根据这个值来作用到view的属性上,以此来实现动画效果。为了让这个变化的过程能达到加速减速等变化效果系统提供了插值器Interpolator。他们的实现思想都是一致的。
3.帧动画 和 属性动画的区别?
2. Carson带你学Android:常见的三种动画类型
Android 动画主要分为分为两大类(三种):
下面。我将简单介绍这两大类、三种 Android 常用动画
根据不同的动画效果,补间动画分为4种动画:
具体效果分别如下:
较为复杂的个性化动画效果。
将动画拆分后的图片帧
在 Android 3.0 ( API 11 )后才提供的一种全新动画模式
与属性相关、更加复杂的动画效果。
不定期分享关于 安卓开发 的干货,追求 短、平、快 ,但 却不缺深度 。
3. android应用的动画ui怎么实现的
Android的动画归纳起来有帧动画,和属性动画。一般情况下,帧动画实现起来会相对简单很多,只要美工提供一帧一帧的图片就可以很容易的实现,代码不用很复杂。但是相对而言,弊端有很多,比如内存占用大,动画不流畅,所以很多时候,我们还是推荐属性动画。
在Android4.0之前我们可以使用Animation实现简单的动画,但是一些复杂的动画,我们想要组合起来就会复杂很多,代码量也会大很多。所以Android4.0以后推出了ObjectAnim相关的API,会让动画更加简单。另外有些特别复杂的动画,我们可以自定义View在onDraw中实现相关的绘图,让画面重复绘制,产生动画效果,但这其实也应该属于属性动画的范畴,但确实Android中高级动画的实现方式。
4. android中的动画有哪几类,它们的特点和区别是什么
android动画有两类:
一种是tweened animation(渐变动画)
一种是frame by frame(逐帧动画)
特点:
渐变动画是通过改变view的大小、旋转的角度、透明度、位置来产生动画,可以控制动画的播放快慢以及加速度。
逐帧动画是用一组图片轮流绘制,产生动画的感觉。类似于gif图片。
区别:
渐变动画的所有操作是通过矩阵变换对同一个物体(绘制的一个view或者图片)进行操作产生动画。
而逐帧动画是多个物体(多张图片)进行绘制,可以说这多张图片是不相关的(从播放的角度来看只能说是内容相关)。
5. 怎么设置android中的popupwindow进入和退出的动画
首先定义显示效果的动画文件:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="0"
android:toXDelta="0"
android:fromYDelta="120"
android:toYDelta="0"
android:ration="500" />
</set>
然后定义消失效果的动画文件:
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:fromXDelta="0"
android:toXDelta="0"
android:fromYDelta="0"
android:toYDelta="120"
android:ration="500" />
</set>
PopupWindow的动画显示效果是通过setAnimationStyle(int id)方法设置的,其中id为一个style的id,所以我们要在styles.xml文件中设置一个动画样式:
<style name="popwin_anim_style">
<item name="android:windowEnterAnimation">@anim/menushow</item>
<item name="android:windowExitAnimation">@anim/menuhide</item>
</style>
然后在程序中为PopupWindow设置就成:
PopupWindow pop = new PopupWindow(view, ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
pop.setAnimationStyle(R.style.popwin_anim_style);