如何利用CSS3动画实现css3弹跳动画效果效果

主题信息(必填)
主题描述(最多限制在50个字符)
申请人信息(必填)
申请信息已提交审核,请注意查收邮件,我们会尽快给您反馈。
如有疑问,请联系
CSDN &《程序员》编辑/记者,我的邮箱
一只文艺范的软件攻城狮,Keep Learn,Always.
本人热爱编程,有着很强的兴趣,做事认真,对待项目任务有很强的责任心.
以前买过腾讯云centos服务器,自己搭建java环境,将自己编写的网上商城小项目发布在服务器上,通过域名绑定ip可以成功访问,
平时自己也用网络编程socket套接字,然后结合Thread线程做过聊天系统,用链表的方式做过贪吃蛇,坦克大战游戏。
?熟练运用Eclipse/MyEclipse在Window下进行Java软件开发
?熟练运用MySQL、SQLServer等数据库技术
?熟练运用Struts2、Hibernate、Spring、Spingmvc、Mybatis框架进行web开发
?熟悉Tomcat等主流服务器了解jetty服务器
?熟悉XML、HTML、Servlet、JSP、FreeMarker、JavaScript、AJAX、Jquery,DOM了解CSS+DIV等前端技术
熟悉Linux下的基本命令操作
?掌握SVN版本管理的使用以及nodeJS的模板引擎 jade
?掌握MVC,proxy,chainofResponsibility,Adapter,factory等设计模式的思想
?掌握maven,webService,activiti工作流的使用
?掌握easyui,Bootstrap等前端框架的基本使用
掌握java反射调用,FIFO,topK等算法
了解nodeJS,Jfinal,JPA
一、属性动画:在没有了解属性动画时,我们做动画一般用的就是View Animation,这样能简单实现位移、旋转、缩放以及alpha渐变等等效果,但是当我们用久了以后,总是会发现一些缺陷,例如:一些复杂动画无法实现;控件不会停留在动画结束位置等等。这个时候我们就需要了解属性动画了。属性动画我是在之前郭神的一篇文章()中所了解到的,在此就不一一赘述了。未了解属性动画的小伙伴可以去看看。二、实现思路:我们就可以开始动工了。做复杂的属性动画,我们要从Evarlutor入手:
public class GravityEvarlutor implements TypeEvaluator&Integer& {
public Float evaluate(float fraction, Float startValue, Float endValue) {
}接下来我们分析下运动流程。从物理课本中我们知道,物体掉落时受重力加速度g的影响而加速掉落,当接触地面时到达最大速度vmax然后回弹,回弹到达最大高度时速度为0。由于动能损失,每次回弹的高度会越来越小,直到最后静止。已知值确定:由于是动画过程,所以总时间t我们也应该知道;起始下落高度_h1,动能损失过程复杂,为了简单实现效果,所以我们做如下规定:弹跳次数为3次,回弹高度我们确定为_h2=_h1/7,_h3=_h1/35,_h4=_h1/105。如图所示:由于fraction的范围在0~1之间,因此我们可以把总时长看为1,接着我们可以得出如下代码:public class GravityEvarlutor implements TypeEvaluator&Integer& {
public Float evaluate(float fraction, Integer startValue, Integer endValue) {
int _h1 = endValue - startV
int _h2 = _h1/7;
int _h3 = _h1/35;
int _h4 = _h1/105;
double t1 = 1 / 2.28917;
double a = (2 * _h1) / (t1 * t1);
double t2 = Math.sqrt(2 * _h2 / a);
double t3 = Math.sqrt(2 * _h3 / a);
double t4 = Math.sqrt(2 * _h4 / a);
double vt1 = a * t1;
double vt2 = a * t2;
double vt3 = a * t3;
double vt4 = a * t4;
}接下来就是分析各个阶段的运动分析。下落时,小球的起始高度为h0,某个时刻的高度为h,根据公式s=(gt^2)/2,算出小球在时刻t所掉落的距离s,因此可以得出某时刻的小球高度h=h0-s=h0-(gt^2)/2。回弹时,小球的起始速度为vt,由于此刻是减速运动,所以某时刻t小球的高度h=vt*t-(gt^2)/2。由上面的运动分析图中看出,小球运动大致分7个阶段,我们拆解为1-1、2-1、2-2、3-1、3-2、4-1、4-2,ok,分析完毕,我们可以开始动代码了。首先,我们对fraction进行拆解,进行分段分析:
double fraction2_1 = fraction - t1;
double fraction2_2 = fraction - t1 - t2;
double fraction3_1 = fraction - t1 - (2 * t2);
double fraction3_2 = fraction - t1 - (2 * t2) - t3;
double fraction4_1 = fraction - t1 - (2 * t2) - (2 * t3);
double fraction4_2 = fraction - t1 - (2 * t2) - (2 * t3) - t4;接着,我们就可以算出各个时间段所对应的h值:
int h = 0;
if(fraction &= t1) {
h = (int)(_h1 - a * 0.5 * fraction * fraction);
}else if(fraction & t1 && fraction &= (t1 + t2)){
h = (int)(vt2 * fraction2_1 - a * 0.5 * fraction2_1 * fraction2_1);
}else if(fraction & (t1 + t2) && fraction &= (t1 + (2 * t2))){
h = (int)(_h2 - a * 0.5 * fraction2_2 * fraction2_2);
}else if(fraction & (t1 + (2 * t2)) && fraction &= (t1 + (2 * t2) + t3)){
h = (int)(vt3 * fraction3_1 - a * 0.5 * fraction3_1 * fraction3_1);
}else if(fraction & (t1 + (2 * t2) + t3) && fraction &= (t1 + (2 * t2) + (2 * t3))){
h = (int)(_h3 - a * 0.5 * fraction3_2 * fraction3_2);
}else if(fraction & (t1 + (2 * t2) + (2 * t3))&& fraction &= (t1 + (2 * t2) + (2 * t3) + t4)){
h = (int)(vt4 * fraction4_1 - a * 0.5 * fraction4_1 * fraction4_1);
h = (int)(_h4 - a * 0.5 * fraction4_2 * fraction4_2);
}ok,大功告成,但是有个小问题,因为我们算出来的值为double类型,强转成int后会有偏差,因此最后我们需要做下偏差矫正:
if(fraction == 1){
}最难的Evalutor到此就告一段落了,贴下总代码:public class GravityEvarlutor implements TypeEvaluator&Integer& {
public Integer evaluate(float fraction, Integer startValue, Integer endValue) {
int _h1 = endValue - startV
int _h2 = _h1/7;
int _h3 = _h1/35;
int _h4 = _h1/105;
double t1 = 1 / 2.28917;
double a = (2 * _h1) / (t1 * t1);
double t2 = Math.sqrt(2 * _h2 / a);
double t3 = Math.sqrt(2 * _h3 / a);
double t4 = Math.sqrt(2 * _h4 / a);
double vt1 = a * t1;
double vt2 = a * t2;
double vt3 = a * t3;
double vt4 = a * t4;
double fraction2_1 = fraction - t1;
double fraction2_2 = fraction - t1 - t2;
double fraction3_1 = fraction - t1 - (2 * t2);
double fraction3_2 = fraction - t1 - (2 * t2) - t3;
double fraction4_1 = fraction - t1 - (2 * t2) - (2 * t3);
double fraction4_2 = fraction - t1 - (2 * t2) - (2 * t3) - t4;
int h = 0;
if(fraction &= t1) {
h = (int)(_h1 - a * 0.5 * fraction * fraction);
}else if(fraction & t1 && fraction &= (t1 + t2)){
h = (int)(vt2 * fraction2_1 - a * 0.5 * fraction2_1 * fraction2_1);
}else if(fraction & (t1 + t2) && fraction &= (t1 + (2 * t2))){
h = (int)(_h2 - a * 0.5 * fraction2_2 * fraction2_2);
}else if(fraction & (t1 + (2 * t2)) && fraction &= (t1 + (2 * t2) + t3)){
h = (int)(vt3 * fraction3_1 - a * 0.5 * fraction3_1 * fraction3_1);
}else if(fraction & (t1 + (2 * t2) + t3) && fraction &= (t1 + (2 * t2) + (2 * t3))){
h = (int)(_h3 - a * 0.5 * fraction3_2 * fraction3_2);
}else if(fraction & (t1 + (2 * t2) + (2 * t3))&& fraction &= (t1 + (2 * t2) + (2 * t3) + t4)){
h = (int)(vt4 * fraction4_1 - a * 0.5 * fraction4_1 * fraction4_1);
h = (int)(_h4 - a * 0.5 * fraction4_2 * fraction4_2);
if(fraction == 1){
}接下来我们只要运用到属性动画中即可。布局简单,我就不贴了,需要最后留意的一点是,我们的Evalutor是以y轴正方向为正值的场景来写的,而在屏幕坐标中是相反的,这时候我们需要加个负号,然而加了负号之后,发现还有一个高度为startValue-endValue的偏差值,此时我们进行相应处理就好。public void play(View v){
ValueAnimator va = ValueAnimator.ofObject(new GravityEvarlutor(), 0, layout_main.getHeight() - btn_play.getHeight() - ball.getHeight())
va.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
public void onAnimationUpdate(ValueAnimator animation) {
ball.setY(layout_main.getHeight() - btn_play.getHeight() - ball.getHeight() - (Integer) animation.getAnimatedValue())
va.setDuration(800)
va.setInterpolator(new LinearInterpolator())
va.start()
}至此,大功告成。CSS3 3D小球上下弹跳动画特效
使用CSS3中的transform、animation和keyframes来实现小球上下跳动;使用CSS3中的圆角和背景渐变来实现小球的3D效果。
下载资源:159次
下载积分:20分
本站评论功能暂时取消,后续此功能例行通知。
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
下载该资源用户也下载了
未注册过用户可以点击直接登录哦!
使用注册邮箱登录
选择画板...
你已经成功采集到
&|关闭窗口主题信息(必填)
主题描述(最多限制在50个字符)
申请人信息(必填)
申请信息已提交审核,请注意查收邮件,我们会尽快给您反馈。
如有疑问,请联系
CSDN &《程序员》编辑/记者,我的邮箱
一只文艺范的软件攻城狮,Keep Learn,Always.
本人热爱编程,有着很强的兴趣,做事认真,对待项目任务有很强的责任心.
以前买过腾讯云centos服务器,自己搭建java环境,将自己编写的网上商城小项目发布在服务器上,通过域名绑定ip可以成功访问,
平时自己也用网络编程socket套接字,然后结合Thread线程做过聊天系统,用链表的方式做过贪吃蛇,坦克大战游戏。
?熟练运用Eclipse/MyEclipse在Window下进行Java软件开发
?熟练运用MySQL、SQLServer等数据库技术
?熟练运用Struts2、Hibernate、Spring、Spingmvc、Mybatis框架进行web开发
?熟悉Tomcat等主流服务器了解jetty服务器
?熟悉XML、HTML、Servlet、JSP、FreeMarker、JavaScript、AJAX、Jquery,DOM了解CSS+DIV等前端技术
熟悉Linux下的基本命令操作
?掌握SVN版本管理的使用以及nodeJS的模板引擎 jade
?掌握MVC,proxy,chainofResponsibility,Adapter,factory等设计模式的思想
?掌握maven,webService,activiti工作流的使用
?掌握easyui,Bootstrap等前端框架的基本使用
掌握java反射调用,FIFO,topK等算法
了解nodeJS,Jfinal,JPAdiv&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
给小球div一些基本样式:
#redball {&&border-radius: 50%;&&width: 20 height: 20&&background-image: radial-gradient(ellipse farthest-corner at 25% 25%, #f00,#000);&&margin: 0 auto;}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
border-radius: 50%;将div设置为圆形,然后通过渐变使它产生立体感。小球的宽度和高度都使用vw作为单位,1vw等于当前屏幕宽度的1%。(关于CSS的单位可以查看。)这样做是为了是使设计具有响应式效果。
然后,我们就可以使用CSS的帧动画来制作小球受重力运动的效果。注意代码中没有使用浏览器厂商的前缀。
@keyframes bounce {&&from, to {&&transform: translateY(30vh);&&}&&80% {&&transform: translateY(15vh);&&}}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
同样,translate的值使用了vh作为单位。1vh等于当前屏幕高度的1%。
通过vw和vh作为单位的最大好处是,不必使用@media queries也能在现代浏览器中做到响应式效果。
接下来在小球上调用帧动画。
#redball {&&transform-origin: center bottom;&&animation: bounce 1.3s cubic-bezier(0.30, 2.40, 0.85, 2.50)}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
注意要记得修改小球的transform-origin,这使得小球动画可以很好的定位。另外在animation中使用了一个特殊的贝兹曲线函数,用以制作重力效果。
现在,小球已经可以上下弹跳了,但是整个动画效果还不十分完美。现实生活中,小球在弹跳时,受重力和引力的作用会在弹跳过程中被轻微的挤压。所以,我们也要模拟这一效果,可以通过 CSS transforms 的scale属性来完成它。
@keyframes bounce {&&from, to {&&transform: translateY(30vh) scaleY(.98);&&}&&80% {&&transform: translateY(15vh) scaleY(1.02);&&}}&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
当然,我们不可能模拟得十全十美。小球会一直弹跳下去,并不会因为引力的作用而慢慢停止。但是这些问题都是可以解决的,希望大家自己开动脑筋,动手做一下!
本文版权属于jQuery之家,转载请注明出处:
& & & & & & & & & &
发表评论:
TA的最新馆藏}

我要回帖

更多关于 css3实现图片动画摇摆 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信