美文网首页
tree-map 树图在iOS ,Android上的实现

tree-map 树图在iOS ,Android上的实现

作者: 朱允见 | 来源:发表于2019-09-15 11:15 被阅读0次

    首先还是先看一张效果图

    image.png

    思考

    • 如何在iOS中实现这样的效果呢
    • 首先在iOS中肯定能实现,任何一种语言都可以实现的,今天我们换一中思路,我们使用一种跨平台的语言开发,这样写出来的iOS,Android都可以使用岂不是更好,不用引用别人的第三方库,还可以保证Android,iOS两个系统上显示的效果是一样的,那是什么呢?
    • 估计你猜到了对,就是h5,接下来我们看如何实现

    具体实现

    实现代码

    • 引入了两个js.文件,一个是d3.js 一个是jQuery.js 大家都可以自己下载到的
    • showMsg 这个方法是点击给一个用户提示的,这是后期自己结合业务添加的
    • 上面的那个css 样式很长的是一个loading的样式
    • 所有代码有点长,建议复制下载,到本地调试运行
    <!DOCTYPE html>
    <meta charset="utf-8">
    
    <meta name="viewport" content="width=device-width, initial-scale=1.0,maximum-scale=1.0, user-scalable=no"/>
    
    <head>
        <style>
    
            .show_msg{
                width:100%;
                height:35px;
                text-align:center;
                position:fixed;
                left: 0;
                z-index: 999;
            }
            .show_span{
                display: inline-block;
                height: 35px;
                padding: 0 15px;
                line-height: 35px;
                background:rgba(0,0,0,0.8);
                border-radius: 50px;
                color: #fff;
                font-size: 1em;
            }
    
            *{
                padding: 0;
                margin: 0;
            }
            html,body,#main{
                width: 100%;
                height: 100%;
            }
            svg {
                font: 10px sans-serif;
            }
    
            a:hover tspan:first-child {
                text-decoration: underline;
            }
    
            tspan:last-child,tspan:first-child {
                line-height: 15px;
                font-size: 13px;
                fill-opacity: 0.7;
                color: white;
            }
            #main{
                position: relative;
            }
            #map2{
                width: 100%;
                height: 100%;
                position: absolute;
                left: 0;
                right: 0;
                top: 0;
                bottom: 0;
                z-index: -1;
            }
            svg{
                width: 100%;
                height: calc(100% - 50px);
                box-sizing: border-box;
            }
            #tools {
                height: 50px;
                background-color: #F3F4F5;
                display: flex;
                justify-content: space-around;
                align-items: center;
            }
            .point{
                display: block;
                width: 8px;
                height: 8px;
                background-color: #409FFF;
                border-radius: 4px;
            }
            p{
                display: flex;
                align-items: center;
                color: #606266;
                font-size: 12px;
            }
            i{
                font-style: normal;
            }
    
    
        </style>
    </head>
    <body>
    
        <div id="main">
            <div id="map2"></div>
            <div id="tools">
    
            </div>
            <svg id="map"></svg>
        </div>
    
        <script src="js/d3.min.js"></script>
        <script src="js/jquery.js"></script>
        <script >
            //点击添加提示
            function showMsg(text,position){
                var show    =   $('.show_msg').length
                if(show>0){
    
                }else{
                    var div     =    $('<div></div>');
                    div.addClass('show_msg');
                    var span    =   $('<span></span>');
                    span.addClass('show_span');
                    span.appendTo(div);
                    span.text(text);
                    $('body').append(div);
                }
                $(".show_span").text(text);
                if(position=='bottom'){
                    $(".show_msg").css('bottom','5%');
                }else if(position=='center'){
                    $(".show_msg").css('top','');
                    $(".show_msg").css('bottom','50%');
                }else{
                    $(".show_msg").css('bottom','95%');
                }
                $('.show_msg').hide();
                $('.show_msg').fadeIn(1000);
                $('.show_msg').fadeOut(1000);
            }
        </script>
    
        <script>
    
            subObj1 = {
                "name":"垂直媒体",
                "list":[
                    {
                        "size":120,
                        "name":"汽车之家"
                    },
                    {
                        "size":102,
                        "name":"太平洋"
                    },
                    {
                        "size":87,
                        "name":"易车网"
                    },
                    {
                        "size":62,
                        "name":"腾讯汽车"
                    },
                    {
                        "size":62,
                        "name":"爱卡"
                    }
    
                ]
            };
            subObj2 = {
                "name":"纸媒",
                "list":[
                    {
                        "size":27,
                        "name":"传单"
                    },
                    {
                        "size":53,
                        "name":"报纸"
                    }
    
                ]
            };
            subObj3 = {
                "name":"到店",
                "list":[
                    {
                        "size":13,
                        "name":"路过"
                    },
                    {
                        "size":22,
                        "name":"试驾"
                    },
                    {
                        "size":53,
                        "name":"自行来店"
                    }
    
                ]
            };
    
            subObj4 = {
                "name":"电联",
                "list":[
                    {
                        "size":33,
                        "name":"电联"
                    }
    
                ]
            };
            var sourceList = [subObj4,subObj1,subObj2,subObj3];
            for(var i=0,len = sourceList.length;i<len;i++){
                var obj = sourceList[i];
                var total = 0;
                for(var j=0,jlen = obj.list.length;j<jlen;j++) {
                    var jobj = obj.list[j];
                    total += jobj.size;
                }
                obj.total = total;
            }
            console.log(JSON.stringify(sourceList));
    
            function sortNumber(a,b) {
                return b.total - a.total;
            }
            sourceList = sourceList.sort(sortNumber);
            console.log(JSON.stringify(sourceList));
    
    
            var map = document.getElementById("map2");
            var svg = d3.select("svg");
            width = map.offsetWidth;
            height = map.offsetHeight;
    
            // 定义fader函数用来获取颜色,返回颜色字符串
            // d3.interpolateCubehelix(a, b)返回a和b之间的颜色插值,0.2是修正gamma值
            var fader = function(color) { return d3.interpolateRgb(color, "#fff")(0.2); };
    
    
            // d3.schemeCategory20.map(fader),将d3.schemeCategory20返回的20个颜色值通过fader函数
            // 进行映射转换,最终,生成离散颜色比例尺color函数
            var colorlistc = [
                "rgb(64, 159, 255)",
                "rgb(0, 204, 119)",
                "rgb(255, 114, 13)",
                "rgb(144, 147, 153)"
            ]
            var colrs = d3.schemeCategory20.map(fader);
            colrs = colorlistc.concat(colrs);
    
            color = d3.scaleOrdinal(colrs)
            format = d3.format(",d");
    
            //添加tools元素
            var tools = document.getElementById('tools');
            for(var i=0,len = sourceList.length;i<len;i++){
                var obj = sourceList[i];
                var node = document.createElement('p');
                node.innerHTML = "<p><span class=\"point\" style=\"background-color: "+ colrs[i] +"\"></span><i>&nbsp;"+ obj.name+"</i></p>";
                tools.appendChild(node);
            }
    
            var alllist = [{"size":0,"path":"d3"}];
            for(var i=0,len = sourceList.length;i<len;i++){
                var obj = {};
                obj.path = "d3/d"+i;
                obj.size = 0;
                alllist.push(obj);
            }
            console.log("------=====>");
            console.log(JSON.stringify(alllist));
    
            for(var i=0,len = sourceList.length;i<len;i++){
                var obj = sourceList[i];
                var preobj = alllist[i+1];
    
                for(var j=0,jlen = obj.list.length;j<jlen;j++) {
                    var jobj = obj.list[j];
                    jobj.path = preobj.path + "/" + jobj.name + '.js';
                    alllist.push(jobj);
                }
    
            }
            console.log("------=====>222");
            console.log(JSON.stringify(alllist));
    
            var senddata  = alllist;
    
        </script>
    
        <script>
    
    
            var treemap = d3.treemap()
                .size([width, height])
                .round(true)
                .padding(1);
    
            function loadtree(sendList) {
                d3.csv("", function(d) {
                    console.log(d);
                    d.size = +d.size;
                    return d;
                }, function(error, data) {
                    console.log(JSON.stringify(data));
    
                    console.log(data);
                    console.log("======");
    
                    if (error) throw error;
                    data = senddata;
    
    
                    var root = d3.stratify()
                        .id(function(d) { return d.path; })
                        .parentId(function(d) { return d.path.substring(0, d.path.lastIndexOf("/")); })
                        (data)
                        .sum(function(d) { return d.size; })
                        .sort(function(a, b) { return b.height - a.height || b.value - a.value; });
    
                    treemap(root);
    
                    console.log("000000>");
                    console.log(svg.selectAll("a"));
    
                    var cell = svg.selectAll("a")
                        .data(root.leaves())
                        .enter().append("a")
                        .attr("target", "_blank")
                        .attr("transform", function(d) { return "translate(" + d.x0 + "," + d.y0 + ")"; });
    
                    cell.append("rect")
                        .attr("id", function(d) { return d.id; })
                        .attr("width", function(d) { return d.x1 - d.x0; })
                        .attr("height", function(d) { return d.y1 - d.y0; })
                        .attr("fill", function(d) {
                            var a = d.ancestors();
                            console.log(a[a.length - 2].id);
                            return color(a[a.length - 2].id);
                        });
    
                    var label = cell.append("text")
                        .attr("clip-path", function(d) { return "url(#clip-" + d.id + ")"; });
    
                    label.append("tspan")
                        .attr("x", 5)
                        .attr("y", 15)
                        .attr("fill", function(d) {
                            return "rgb(255,255,255)";
                        })
                        .text(function(d) {
                            console.log(d);
                            return d.data.path.substring(d.data.path.lastIndexOf("/") + 1,
                                d.data.path.lastIndexOf("."));
                        });
    
                    label.append("tspan")
                        .attr("x", 5)
                        .attr("y", 30)
                        .attr("fill", function(d) {
                            return "rgb(255,255,255)";
                        })
                        .text(function(d) { return format(d.value); });
    
                    cell.append("title")
                        .text(function(d) { return d.id + "\n" + format(d.value); });
    
    
                    $("#map a").each(function(){
                        $(this).click(function(){
                            // alert($(this).text());
                            console.log($(this).text());
                            var all = $(this).text();
                            res = all.split("/");
                            var last = res[res.length-1];
                            last = last.replace(/.js/g,"");
                            console.log(res);
    
                            showMsg(last,'center');
                        });
                    });
    
                });
    
            }
            loadtree();
    
        </script>
    
    </body>
    

    如果你很懒没关系我把这个文件放到GitHub上,https://github.com/zyjian/tree-map

    总结

    • 可以运行了吧,怎么样是要把你自己的数据换一下就可以,很简单拿来就可以使用。

    相关文章

      网友评论

          本文标题:tree-map 树图在iOS ,Android上的实现

          本文链接:https://www.haomeiwen.com/subject/djvzyctx.html