Android 动画简单理解

动画这个东西,他和前几期,有一个很大的不同的是,概念很简单,动画,不就是动一动嘛

首先说一下动画的本质:

动画是什么呢?

  1. 动画就是将两个内容平滑的移动,而不是直接切换,所谓的平滑移动就是在一段时间里面,不断地用View.setTranslationX去更新他的位置,一点一点地向目标靠近,直到到达目标为止,这个渐变的过程要通过其他线程来控制.

    因为如果用主线程的话,他就卡住了,对吧,用线程的操作方式有很多,我举一个最简便的: View.postDelayed() 方法,你不是要在一段时间里面重复的更新他的位置吗?那就可以用一个For循环, 来设定一个连续的流程,一点一点的更新View的位置,把他慢慢的往右挪, 直到挪动到右边的500像素为止,这个就是动画了,

你看,不断的更新View的属性,让它表现出动画效果,这个就是所谓的属性动画的原理,但是,你可能看出来了,这么做可能很麻烦,你想让View往某个方向移动,你得看看他要移动多远, 要花多长时间,然后根据这个区计算,它一共要移动多少步,每一步要移动多少距离
这个是你能想到能看到的还有你想不到的

比如:我想让这个动画进行到一半的时候,用户它点击一个按钮,动画要瞬间取消,怎么取消,或者是我让这个动画她不要匀速运动, 我希望他是一个减速的过程,就是开始速度快,然后慢慢的速度越来越慢,直到减到0的时候,正好达到目标位置,那么这种情况,他的速度曲线怎么算,就是每一个时间点他所对应的位置在哪?不好算,还有就是,假如我希望这个动画它在结束的时候给我一个反馈,我去做一些用户的通知,或者资源回收这样的工作.
那么这个监听器怎么设置?
理论上来说,这些东西你通过手写代码都是可以实现的,但是太麻烦了如果你用属性动画的APi,可能是一行代码或者几行代码就能给做出来了,很简单,你只要告诉他我要什么? 剩下的各种设定工作各种计算工作 API 都帮你完成了,这个就是属性动画 API 它的作用,它很方便,有些人,尤其是没有做过动画的人,他会觉得属性动画很神奇,它做了一些我们没有做的事情,其实不是,他做的事情并没有什么神奇的
但是它很方便,它就是一个非常方便的动画工具,这个就是属性动画的本质,好,你现在知道什么是属性动画呢,知道它的本质呢,也知道属性动画它的角色了,那么现在我再跟你去介绍属性动画的API,它有什么功能呀, 怎么用,你就很好理解了, 属性动画里面最简单的是 ViewPropertyAnimotor,它的使用方法很简单,你调用View.animate(),然后再加几行代码, 描述出你的动画就可以了

比如:你想通过View来向右移动500个像素,你只要加上一句translate(500),就这么简单,你在调用这行代码之后, 它就会每隔10ms,调用一次 View.setTranlationX() 方法, 把View一点点的往右挪,知道挪到目标位置,也就是右边 500 像素的位置,整个过程是自动的,挪动多少次,每次挪动挪多远, 都是自动计算的,你只要告诉它往右挪,距离是 500 像素 ,这个过程它会自动编排好,这个就是 ViewPropertyAnimotor ,在这里可能有人要问了

你说的这个 ViewPropertyAnimotor 是个什么东西呀?

我在代码里面怎么没看见呢?其实你在调用View.animate的时候,返回的就是 ViewPropertyAnimotor 对象,只是我没有赋值给一个变量,所以你看不到他写出来,但是它其实是用到了的,明白吧,如果你比较细心,你发现了这个疑问,那么在这儿给你解答一下
另外,有的人可能会问:你说的这个每隔 10s 自动调用一次这个 view.setTranslation 这个方法 是什么?

表示没有听说过,其实这也不是什么新东西呢?它在Android 3.0 也就是 API 11 就出现了,它的作用是给View 设置横向的位置偏移,比如按照你的layout文件,你的View1的某个坐标应该是 100 ,100像素,那么如果你调用一下View.setranslationX(50) ,它的实际横坐标就会再往右挪动 50 ,也就是 150 ,
这个方法有什么用呢?
用来做动画,它就是为动画而生的,在动画之外,它的使用场景还真是不多这个同时也是为什么这个方法历史悠久了,但是很多人却不知道,因为我们不会做动画呀,起码在中国是这样,和这个方法一起在Android 3.0 也就是 API 11 诞生的方法有十几个,他们多数都是只用在动画里,所以没见过这个方法,估计别的方法也够呛,不过不用担心,啊 十几个方法我怎么学呀!没事,他们都非常简单,就像这个setTrasnX(),
它的功能就是把View往左往右移,你用学吗?不用学!
我一句话你就听懂了,再实践一下就会了,非常简单的这些方法用在动画里面的时候,用法和原理也和刚才讲的一样横向平移是一样的,比如刚才说的是:ViewPoertyAnimotor 的 transationX() 来操作 View 的 setTranstionX() 方法,来实现动画的横向平移, 同样 你如果用 translationY() 那么 他就会操作View的setTranslationY 来实现纵向平移 ,如果再换一个 rotation(),那么就是调用view 的setRotion 方法
来实现旋转,你还可以一起使用这些方法,赖在动画里面同时改变多个属性,比如在放大的同事改变透明度, 做一个弹出效果,你写两个方法可以同时改变两个属性,写三个四个方法,可以同时改变三个四个属性,另外呢?
你还可以设置动画的时长,默认的动画的时常是300ms,也就是0.3s,不过呢,你也可以自己来定制它,定制的方法依然是加一行代码,setDuration, 参数的单位是ms,你参数填500 就是 500ms,填2000救赎 2000ms
除了时长,你还可以设置动画的速度模型, 什么是速度模型呢?就是 你从 A 点 移动到B点,你是匀速移动过去的,还是先加速后减速移动过去的,还是直接减速过去的,这个就是速度模型,设置速度模型用的是 setInterpolator() 方法

猜你喜欢

转载自blog.csdn.net/Kibaco/article/details/88584704