仿魅族flyme社区app的一个动画效果

属于魅族的忠实粉,使用flyme社区的时候发现一个不错的效果,所以就私下来研究哈。
效果如下:



<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <link rel="stylesheet" href="style/index.css">
    <link rel="stylesheet" href="font/font.css">
</head>
<body>


<div class="nav-wrap">
    <nav>
        <a class="nav-item"><i class="iconfont icon-biji"></i></a>
        <a class="nav-item"><i class="iconfont icon-xiangji"></i></a>
        <a class="nav-item"><i class="iconfont icon-hauti"></i></a>
    </nav>
    <div class="main-nav"><i class="iconfont icon-jiahao"></i></div>
</div>

</body>
<script src="http://s0.qhimg.com/lib/jquery/183.js" ></script>
<script type="text/javascript">
    (function(){

        // 当菜单没被激活时
        var isLocated = false;

        $('.nav-wrap').on('click','.main-nav',function(e){
            e.preventDefault();

            var me = $(this),
                navWrap = me.closest('.nav-wrap'), // 动画效果的父容器
                navs = navWrap.find('nav a'); // 父容器中的所有子菜单

            if(!navWrap.hasClass('active') && !isLocated){

                // 圆的半径 raduis
                var width = navWrap.width(),
                    radius = width / 2;

                // 圆形菜单的起始、终止角度
                var startAngle = -90,
                    endAngle =-230;

                // 两个子菜单间的夹角 gap
                var total = navs.length,
                    gap = (endAngle - startAngle)/total;

                // 角度->弧度
                var radian = Math.PI / 180;


                /*
                 * 计算并确定各个子菜单的最终位置
                 */
                $.each(navs, function(index, item){

                    // 当前子菜单与x轴正向的夹角 θ (角度->弧度)
                    var myAngle = (startAngle + gap*index) * radian;  // θ

                    // 计算当前子菜单相对于左上角(0,0)的坐标 (x,y)
                    var myX = radius + radius * Math.cos( myAngle ), // x=r+rcos(θ)
                        myY = radius + radius * Math.sin( myAngle ); // y=r+rsin(θ)

                    // 设置当前子菜单的位置 (left,top) = (x,y)
                    $(this).css({
                        left: myX + 'px',
                        top:  myY + 'px'
                    });
                });

                isLocated = true;
            }

            navWrap.toggleClass('active');
            $('.nav-item').toggleClass('a_active');
            $('.main-nav').toggleClass('main-active')

        });

    })();



</script>
</html>

index css部分:

* {
    margin: 0;
    padding: 0;
}
body {
    /*background-color: #292a38;*/
    font-family: "Microsoft Yahei";
}
h1 {
    margin-top: 20px;
    text-align: center;
    color: #fff;
}

.nav-wrap {
    position: relative;
    width: 200px;
    height: 200px;
    margin: 50px auto;
    /*border: 2px dotted #4e5061;*/
    border-radius: 50%;
}
.main-nav {
    position: absolute;
    left: 50%;
    top: 50%;
    -webkit-transform: translate(-50%,-50%) rotate(0deg) scale(1);
            transform: translate(-50%,-50%) rotate(0deg) scale(1);
    transition: all .2s linear;
    width: 50px;
    height: 50px;
    line-height: 50px;
    font-size: 16px;
    text-align: center;
    text-decoration: none;
    color: #fff;
    border-radius: 50px;
    text-shadow: 1px 1px 0px #000;
    background: #0184FF;
    cursor: pointer;
    opacity: 1;
}
.main-active{
    background: #15a5f3;
    opacity: .5;
    -webkit-transform: translate(-50%,-50%) rotate(45deg) scale(0.8);
    transform: translate(-50%,-50%) rotate(45deg) scale(0.8);
}

.nav-wrap nav {
    position: absolute;
    width: 100%;
    height: 100%;
    -webkit-transform: scale(0) ;
            transform: scale(0) ;
    -webkit-transition: all 0.5s ease-out;
    transition: all 0.5s ease-out;
    opacity: 0;
}
.nav-wrap.active nav {
    -webkit-transform: scale(1) ;
            transform: scale(1) ;
    opacity: 1;
}
.nav-item{
    position: absolute;
    width: 40px;
    height: 40px;
    background: #0184FF;
    text-align: center;
    line-height: 40px;
    text-decoration: none;
    color: #fff;
    border-radius: 50px;
    text-shadow: 1px 1px 0px #000;
    -webkit-transform: translate(-50%,-50%) rotate(0deg) ;
            transform: translate(-50%,-50%) rotate(0deg) ;
    -webkit-transition: all 0.5s ease-out;
    transition: all 0.5s ease-out;
}
.a_active{
    -webkit-transform: translate(-50%,-50%) rotate(720deg) !important;
            transform: translate(-50%,-50%) rotate(720deg) !important;  ;
}

.iconfont css:
@font-face {
    font-family: 'iconfont';  /* project id 422939 */
    src: url('//at.alicdn.com/t/font_422939_xqeu49ziopw4s4i.eot');
    src: url('//at.alicdn.com/t/font_422939_xqeu49ziopw4s4i.eot?#iefix') format('embedded-opentype'),
    url('//at.alicdn.com/t/font_422939_xqeu49ziopw4s4i.woff') format('woff'),
    url('//at.alicdn.com/t/font_422939_xqeu49ziopw4s4i.ttf') format('truetype'),
    url('//at.alicdn.com/t/font_422939_xqeu49ziopw4s4i.svg#iconfont') format('svg');
}
.iconfont{
    font-family:"iconfont" !important;
    font-size:18px;font-style:normal;
    -webkit-font-smoothing: antialiased;
    -webkit-text-stroke-width: 0.2px;
    -moz-osx-font-smoothing: grayscale;
}
.icon-jiahao:before { content: "\e603"; }
.icon-hauti:before { content: "\e895"; }
.icon-xiangji:before { content: "\e674"; }
.icon-biji:before { content: "\e606"; }


现在的APP Banner大多数千篇一律,前几天看到魅族手机上所有魅族自家APP上的Banner效果不错,于是就想着来仿着做一个类似的效果。因此就有了这个库。但是为了使用方便,这个库不仅仅只有仿魅族效果的BannerView 来使用,还可以当作普通的BannerView 来使用,还可以当作一个ViewPager 来使用。使用很方便,具体使用方法和API 请看后面的示例。 ---  左图为魅族APP上的Banner效果,右图是高仿效果。MZBannerView 有以下功能:1 . 仿魅族BannerView 效果。2 . 当普通Banner 使用3 . 当普通ViewPager 使用。4 . 当普通ViewPager使用(有魅族Banner效果)5 . 仿某视频网站Banner效果。Demo APKgif图片有点模糊,可以扫描下方二维码下载APK体验相关博客ViewPager系列之 仿魅族应用的广告BannerView更新日志v1.1.1 : 增加按住Banner 停止轮播,松开开始自动轮播的功能v1.1.0 : fix 在从网上获取数据后,banner 显示 造成 ANR 的bug(如果在onCreate()中设置资源显示则没问题)v1.1.2 : fix 更改数据之后,调用setPages重新刷新数据会crush的bugv2.0.0 :1,add: 添加仿魅族Banner效果,中间Page覆盖两边。 -- 2,fix 部分bug: 添加OnPageChangeListener 回调 pisition 不对的bug.DependencyAdd it in your root build.gradle at the end of repositories:allprojects {      repositories {           ...           maven { url 'https://jitpack.io' }      } }Step 2. Add the dependencydependencies {          compile 'com.github.pinguo-zhouwei:MZBannerView:v2.0.0' }自定义属性属性名属性意义取值open_mz_mode是否开启魅族模式true 为魅族Banner效果,false 则普通Banner效果canLoop是否轮播true 轮播,false 则为普通ViewPagerindicatorPaddingLeft设置指示器距离左侧的距离单位为 dp 的值indicatorPaddingRight设置指示器距离右侧的距离单位为 dp 的值indicatorAlign设置指示器的位置有三个取值:left 左边,center 剧中显示,right 右侧显示middle_page_cover设置中间Page是否覆盖(真正的魅族Banner效果)true 覆盖,false 无覆盖效果使用方法1 . xml 布局文件2 . activity中代码:mMZBanner = (MZBannerView) view.findViewById(R.id.banner);              // 设置数据         mMZBanner.setPages(list, new MZHolderCreator() {             @Override             public BannerViewHolder createViewHolder() {                 return new BannerViewHolder();             }         });  public static class BannerViewHolder implements MZViewHolder {         private ImageView mImageView;         @Override         public View createView(Context cont
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值