仿造android 写的 JS动画

<html>
    <head>
        <title>Animation</title>
        <meta http-equiv="X-UA-Compatible" content="edge" />
        <meta http-equiv="X-UA-Compatible" content="IE=10">
        <meta http-equiv="X-UA-Compatible" content="IE=9">
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
    </head>
    <body>
        <div id="box1" style="position: absolute;top:100px;left:100px;width:100px;height:100px;background: #FF8D40"></div>
        <div id="box2" style="position: absolute;top:100px;left:100px;width:100px;height:100px;background: #FF4400"></div>
        <script>
            /**
             * 线性运动插件
             * @type type
             */
            var LinearInterpolate={
                getPosRate:function(timeRate){
                    return timeRate>1?1:(timeRate<0?0:timeRate);
                }
            };
            /**
             * 先慢后快
             * @type type
             */
            var AccelerateDecelerateInterpolator={
                /**
                 * 将路程分成100份 前50份 走了0.6 0.5/0.6 后期 0.5/0.4
                 * @param {type} elem
                 * @param {type} styleName
                 * @returns {getStyle.s}
                 */
                getPosRate:function(timeRate){
                    var v=0.5/0.6;
                    if(timeRate<0.6){
                        return timeRate*v;
                    }else{
                        v=0.5/0.4;
                        var endPos=0.5+(timeRate-0.6)*v;
                        return endPos>1?1:endPos;
                    }
                }
            };
            /**
             * 重力加速度公式
             * @type type
             */
            var AccelerateInterpolator={
                getPosRate:function(timeRate){
                    timeRate=timeRate*1.417;
                    var endPos=0.5*timeRate*timeRate;
                    return endPos>1?1:endPos;
                }
            };
            /**
             * 先后退一下段 然后前进
             * @type type
             */
            var AnticipateInterpolator={
                /**
                 * 开始速度-0.2 每次加0.1
                 * @param {type} elem
                 * @param {type} styleName
                 * @returns {getStyle.s}
                 */
                getPosRate:function(timeRate){
                    timeRate=timeRate*6.92;//(时间修正)
                    var endPos=timeRate*(-0.2+timeRate*0.1-0.2)*0.5;
                    return endPos>1?1:endPos;
                }
            };
            /**
             * css属性获取
             * @returns {undefined}
             */
            function getStyle(elem,styleName){
                if(elem.style[styleName]){//内联样式
                    return elem.style[styleName];
                }
                else if(elem.currentStyle){//IE
                    return elem.currentStyle[styleName];
                }
                else if(document.defaultView && document.defaultView.getComputedStyle){//DOM
                    styleName = styleName.replace(/([A-Z])/g,‘-$1‘).toLowerCase();
                    var s = document.defaultView.getComputedStyle(elem,‘‘);
                    return s&&s.getPropertyValue(styleName);
                }else{//other,for example, Safari
                    return null;
                }
            }
            /**
             * animation对象
             * @param {type} div
             * @returns {Animation}
             */
            function Animation(div){
                var self=this;
                this.interpolate=AnticipateInterpolator;
                this.list=[];
                var runFunc=function(){
                    var now=new Date().getTime();
                    var timeRate=(now-self.startTime)/self.time;
                    var posRate=self.interpolate.getPosRate(timeRate);
                    for(var i in self.startPos){
                        div.style[i]=self.startPos[i]+self.offsetPos[i]*posRate+"px";
                    }
                    if(posRate===1){
                        if(self.haveNext()){
                            if(self.callback instanceof Function){
                                self.callback(timeRate);
                            }
                            setTimeout(runFunc,1);
                            return;
                        }
                    }else{
                        setTimeout(runFunc,1);
                    }
                };
                this.haveNext=function(){
                    if(this.list.length){
                        var animData=this.list.shift();
                        this.interpolate=animData.interpolate;
                        this.time=animData.time;
                        this.startTime=new Date().getTime();
                        this.offsetPos={};
                        this.startPos={};
                        for(var i in animData.opt){
                            var val=getStyle(div,i);
                            if(val&&animData.opt[i]){
                                this.startPos[i]=parseInt(val);
                                this.offsetPos[i]=parseInt(animData.opt[i])-parseInt(val);
                            }
                        }
                        return true;
                    }
                    return false;
                };
                this.addNext=function(opt,time,interpolate,callback){
                    if(!opt)return this;
                    this.list.push({opt:opt,time:time||1000,callback:callback,interpolate:interpolate||AnticipateInterpolator});
                    return this;
                };
                this.start=function(){
                    if(this.haveNext()){
                        setTimeout(runFunc,1);
                    }
                };
            }
            var anim=new Animation(document.getElementById("box1"))
                    .addNext({left:300,top:400,width:50,height:50},1000,AccelerateInterpolator)
                    .addNext({left:600},1000,AnticipateInterpolator,function(timeRate){
                        alert(timeRate);
                    }).addNext({top:100,width:100,height:100},1000,AccelerateDecelerateInterpolator)
                      .addNext({left:100,width:10,height:10},1000,LinearInterpolate);
              var anim2=new Animation(document.getElementById("box2"))
                    .addNext({left:300,width:50,height:50},500,AccelerateInterpolator)
                    .addNext({left:600},500,AnticipateInterpolator,function(timeRate){
                        alert(timeRate);
                    }).addNext({top:100,width:100,height:100},1500,AccelerateDecelerateInterpolator)
                      .addNext({left:100,width:10,height:10},1500,LinearInterpolate);
            anim.start();
            anim2.start();
        </script>
    </body>
</html>
时间: 2024-10-06 01:27:34

仿造android 写的 JS动画的相关文章

关于JS动画和CSS3动画的性能差异

本文章为综合其它资料所得. 根据Google Developer,Chromium项目里,渲染线程分为main thread和compositor thread.如果CSS动画只是改变transforms和opacity,这时整个CSS动画得以在compositor thread完成(而JS动画则会在main thread执行,然后触发compositor进行下一步操作)在JS执行一些昂贵的任务时,main thread繁忙,CSS动画由于使用了compositor thread可以保持流畅,可

Android编程之Fragment动画加载方法源码详解

上次谈到了Fragment动画加载的异常问题,今天再聊聊它的动画加载loadAnimation的实现源代码: Animation loadAnimation(Fragment fragment, int transit, boolean enter, int transitionStyle) { 接下来具体看一下里面的源码部分,我将一部分一部分的讲解,首先是: Animation animObj = fragment.onCreateAnimation(transit, enter, fragm

Android应用开发:动画开发——XML动画

引言 当今,Android.IOS二分天下,什么Tizen.COS blabla的均为蝼蚁,一看就知道是为打发领导或为花研发资金产出的产品,根本不是为了赢得市场,为的只是博得领导一笑而已,完全可以忽视.而Android开发又因为开发语言以Java为主,入门门槛极低导致基本上是个程序员,泡两天EOE,或Android Developer Training都可以过来说"哥会开发Android app了!",那么什么才能将你的App脱颖而出呢?准确的用户痛点.良好的数据结构.简单易用的交互流

CSS VS JS动画,哪个更快[译]

英文原文:https://davidwalsh.name/css-js-animation 原作者Julian Shapiro是Velocity.js的作者,Velocity.js是一个高效易用的js动画库.在<Javascript网页动画设计>一书中对这个库有很多更具体的剖析,对Velocity及JS动画感兴趣的可以一看. 基于Javascript的动画怎么可能总是和 CSS transition 一样快,甚至更快呢?到底是什么秘密呢?Adobe 和 Google 是怎么做到让他们的富媒体移

Android自定义水波纹动画Layout

Android自定义水波纹动画Layout 源码是双11的时候就写好了,但是我觉得当天发不太好,所以推迟了几天,没想到过了双11女友就变成了前女友,桑心.唉不说了,来看看代码吧. 展示效果 Hi前辈 话不多说,我们先来看看效果: 这一张是<Hi前辈>的搜索预览图,你可以在这里下载这个APP查看更多效果:http://www.wandoujia.com/apps/com.superlity.hiqianbei LSearchView 这是一个MD风格的搜索框,集成了ripple动画以及searc

android code 和js的交互

小弟现在需要android code 和js的交互.出现了问题,求大家带一带啊. 我的页面:<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,

Android初级教程以动画的形式弹出窗体

这一篇集合动画知识和弹出窗体知识,综合起来以动画的形式弹出窗体. 动画的知识前几篇已经做过详细的介绍,可翻阅前面写的有关动画博文.先简单介绍一下弹出窗体效果的方法: 首先,需要窗体的实例:PopupWindow window = new PopupWindow(contentView, width, height); 总共需要三个参数,三个参数的含义分别是: /  **contentView:窗体属于一个"容器"因此填充一个布局,因此要专门为之建一个布局,它就是填充布局后的view,(

js动画---一个小bug的处理

对于前面的课程,大家似乎看不出来存在什么问题,一切都很顺利,但是其实是存在一个很大的bug的,这个bug是什么呢?? 我们来看看下面这个程序就知道了 <!DOCTYPE html> <html> <head> <title>js动画事件</title> <link href="move.css" rel="stylesheet" type="text/css"/> <s

android webview和js的交互

第一步: mainfest.xml中加入网络权限 <use-permission android:name="android.permission.INTERNET"/> 如果是访问本地的那就不需要加这个权限了 第二步: 加载本地写好的html文件(定义好js中提供给android调用的方法funFromjs(),和android提供给js调用的对象接口) fun1FromAndroid(String name)),放在assets目录下. eg. <body>