Android使用echart展示图表

news2024/12/24 9:05:51

Android使用echart展示酷炫的图表

最近开发的时候,遇到了柱状图,刻度图等各种图表的展示。查资料发现,Android用的的最多的是MPAndroidChart,我也尝试了,一般的柱状图和饼状图都可以实现,但是刻度图就不行。经了解,h5端有百度的echart可以实现各种酷炫的图表展示,echarts官方示例地址。产品能想到的图表都有,哈哈,于是乎我封装了一个webview来展示echarts的图表。效果如下:刻度图

首先去官网下载echart的依赖库echarts.min.js,放入项目的assets文件夹中(没有自己创建一个)。

然后,编写一个html文件,也放入项目的assets文件夹中,代码如下:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="renderer" content="webkit">
    <!-- 引入 ECharts 文件 -->
    <script src="./echarts.min.js"></script>
    <style type="text/css">
            html,
            body {
                width: 100%;
                height: 100%;
            }

            * {
                margin: 0;
            }

            #chart {
                display: flex;
                flex-direction: column;
                align-items: center;
                justify-content: center;
                font-size: .24rem;
                color: #999;
            }

    </style>
</head>
<body style="height: 100%; margin: 0">
<!-- 为 ECharts 准备一个具备大小(宽高)的 DOM -->
<div id="chart" style="height: 100%"></div>
<script type="text/javascript">
    function setData(option) {
        console.log("设置图表:\n" + JSON.stringify(option));
        // 基于准备好的dom,初始化echarts实例
        try {
            var myChart = echarts.init(document.getElementById('chart'));
            myChart.setOption(option);
             window.addEventListener('resize', myChart.resize);
        } catch (e) {
            console.log("设置图表error:\n" + JSON.stringify(e));
        }
    }

</script>
</body>
</html>

最后自定义一个webview,里面本地和html进行交互,传递数据。上代码:

public class EChartsWebView extends WebView {
    private boolean requestDisallowInterceptTouchEvent = true;
    private static int emptyFontSize = 14;
    private static String emptyMsg = "暂无数据~";

    public EChartsWebView(@NonNull Context context) {
        this(context, null);
    }

    public EChartsWebView(@NonNull Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public EChartsWebView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    @SuppressLint({"ClickableViewAccessibility", "SetJavaScriptEnabled"})
    private void init() {
        this.getSettings().setJavaScriptEnabled(true);
        this.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        this.getSettings().setSupportZoom(false);
        this.getSettings().setDisplayZoomControls(false);

        this.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        requestDisallowInterceptTouchEvent(requestDisallowInterceptTouchEvent);
        return super.onTouchEvent(event);
    }

    public void setData(String data) {
        loadData(data);
    }

    public void setEmpty() {
        loadData("");
    }

    public void setEmpty(String msg, int emptyFontSize) {
        emptyMsg = msg;
        this.emptyFontSize = emptyFontSize;
        loadData("");
    }

    private void loadData(String data) {
        this.loadUrl("file:///android_asset/echarts.html");
        this.setWebViewClient(new EChartsWebViewClient(data));
    }

    public static class EChartsWebViewClient extends WebViewClient {

        private String data;

        public EChartsWebViewClient(String data) {
            this.data = data;
        }

        @Override
        public void onPageStarted(WebView view, String url, Bitmap favicon) {
            super.onPageStarted(view, url, favicon);
        }

        @Override
        public void onPageFinished(final WebView view, String url) {
            view.post(() -> {
                if (TextUtils.isEmpty(data)) {
                    String emptyUrl = String.format("javascript:setEmpty(%s, %s)", "'" + emptyMsg + "'", emptyFontSize);
                    view.loadUrl(emptyUrl);
                } else
                    view.loadUrl(String.format("javascript:setData(%s)", data));
            });
            super.onPageFinished(view, url);
        }

        @Override
        public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
            super.onReceivedError(view, request, error);
        }
    }
}

至此,准备工作都做好了,可以使用了,在activity中使用

var option = "{\n" +
                "  series: [\n" +
                "    {\n" +
                "      type: 'gauge',\n" +
                "      startAngle: 180,\n" +
                "      endAngle: 0,\n" +
                "      center: ['50%', '75%'],\n" +
                "      radius: '90%',\n" +
                "      min: 0,\n" +
                "      max: 1,\n" +
                "      splitNumber: 8,\n" +
                "      axisLine: {\n" +
                "        lineStyle: {\n" +
                "          width: 6,\n" +
                "          color: [\n" +
                "            [0.25, '#FF6E76'],\n" +
                "            [0.5, '#FDDD60'],\n" +
                "            [0.75, '#58D9F9'],\n" +
                "            [1, '#7CFFB2']\n" +
                "          ]\n" +
                "        }\n" +
                "      },\n" +
                "      pointer: {\n" +
                "        icon: 'path://M12.8,0.7l12,40.1H0.7L12.8,0.7z',\n" +
                "        length: '12%',\n" +
                "        width: 20,\n" +
                "        offsetCenter: [0, '-60%'],\n" +
                "        itemStyle: {\n" +
                "          color: 'inherit'\n" +
                "        }\n" +
                "      },\n" +
                "      axisTick: {\n" +
                "        length: 12,\n" +
                "        lineStyle: {\n" +
                "          color: 'inherit',\n" +
                "          width: 2\n" +
                "        }\n" +
                "      },\n" +
                "      splitLine: {\n" +
                "        length: 20,\n" +
                "        lineStyle: {\n" +
                "          color: 'inherit',\n" +
                "          width: 5\n" +
                "        }\n" +
                "      },\n" +
                "      axisLabel: {\n" +
                "        color: '#464646',\n" +
                "        fontSize: 16,\n" +
                "        distance: -60,\n" +
                "        rotate: 'tangential',\n" +
                "        formatter: function (value) {\n" +
                "          if (value === 0.875) {\n" +
                "            return '优秀';\n" +
                "          } else if (value === 0.625) {\n" +
                "            return '良好';\n" +
                "          } else if (value === 0.375) {\n" +
                "            return '一般';\n" +
                "          } else if (value === 0.125) {\n" +
                "            return '差';\n" +
                "          }\n" +
                "          return '';\n" +
                "        }\n" +
                "      },\n" +
                "      title: {\n" +
                "        offsetCenter: [0, '-10%'],\n" +
                "        fontSize: 14\n" +
                "      },\n" +
                "      detail: {\n" +
                "        fontSize: 30,\n" +
                "        offsetCenter: [0, '-35%'],\n" +
                "        valueAnimation: true,\n" +
                "        formatter: function (value) {\n" +
                "          return Math.round(value * 100) + '';\n" +
                "        },\n" +
                "        color: 'inherit'\n" +
                "      },\n" +
                "      data: [\n" +
                "        {\n" +
                "          value: 0.7,\n" +
                "          name: '发电完成率'\n" +
                "        }\n" +
                "      ]\n" +
                "    }\n" +
                "  ]\n" +
                "}"
        mWebview?.setData(option)
   

这样,图片里面的刻度图就展示出来了,option可以去echart官网示例里面直接复制,把里面的参数改成你想要的就可以了。

以上就实现了echart在Android端的使用,再也不要怕产品说h5可以,Android怎么不可以了,哈哈

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/683083.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【复习《剑指Offer》1-5题】【每天40分钟,我们一起用50天刷完 (剑指Offer)】第六天 6/50

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

第二章:项目环境搭建【基于Servlet+JSP的图书管理系统】

环境搭建 1.项目工具 本项目涉及到的工具都有在云盘提供&#xff0c;自行下载即可 JDK8IDEA2021Tomcat8.5MySQL的客户端工具SQLYog… 2.项目搭建 通过IDEA创建maven项目。勾选脚手架工具。选择maven-archetype-webapp 设置项目的基础信息 3.基本配置 3.1 JDK配置 JDK使用的…

前端Vue自定义服务说明弹窗弹框 自下而上底部弹框

前端Vue自定义服务说明弹窗弹框 自下而上底部弹框&#xff0c; 请访问uni-app插件市场地址&#xff1a;https://ext.dcloud.net.cn/plugin?id13108 效果图如下&#xff1a; # cc-serviceDialog 自定义服务说明弹窗 自下而上 底部弹窗 #### 使用方法 使用方法 <!-- 服务…

开发吐槽,谁说测试是二等公民,我们才是好吧

很多测试都认为自己是团队中的二等公民&#xff0c;从而各种看衰作贱自己。 这不&#xff0c;昨天在知乎上就看到一篇帖子&#xff1a;一女测试在团队中各种嘲讽自己的测试团队&#xff0c;“测试是低人一等的职业”&#xff0c;时刻劝说大家转开发。最后团队领导受不了&#…

机器学习:简介与类型

从翻译应用、商品推荐、医疗诊断到自动驾驶汽车&#xff0c;机器学习 (ML) 作为一种技术&#xff0c;都有用武之地。机器学习提供了一种解决问题、回答复杂问题以及创建新内容的新方式。机器学习可以预测天气、估算行程时间、推荐歌曲、自动补全句子、汇总文章以及生成全新的图…

【数据结构】串的基本定义及操作

&#x1f387;[数据结构]串的基本定义及操作&#x1f387; &#x1f308;积薪高于山&#xff0c;焉用先后别 &#x1f308; &#x1f31f; 正式开始学习数据结构啦~此专栏作为学习过程中的记录&#x1f31f; 文章目录 &#x1f387;[数据结构]串的基本定义及操作&#x1f387;&…

【运维心得】SAP EPM Add-In加载错误的另类解决方案

关键字&#xff1a;SAP BPC EPM OFFICE WPS 今天又解决了一个诡异的问题&#xff0c;记录一下&#xff0c;以备将来能够用上。 目录 问题现象 网上的方法 启发和解决 结论 问题现象 财务SAP系统需要BPC模块做报表&#xff0c;安装了OfficeEPM Add-In以后&#xff0c;结果…

抖音私域怎么做?

“私域流量”是如今备受市场瞩目的话题之一。众所周知&#xff0c;腾讯、阿里巴巴、抖音等互联网巨头已经开始布局私域资源&#xff0c;因此许多企业都希望在这些平台上获取生意增长。作为具有6亿日活跃用户的短视频平台&#xff0c;抖音也为企业提供了私域运营的阵地。那么&am…

2023年湖北黄冈人社局初、中级职称怎么评?申报条件是什么?启程别

2023年湖北黄冈人社局初、中级职称怎么评&#xff1f;申报条件是什么&#xff1f;启程别 想要评过人社局的初、中级职称&#xff0c;首先要满足申报条件&#xff0c;其次是要准备好申报资料&#xff0c;最后等待申报时间提交资料&#xff0c;等待结果。湖北目前改外全面线上申报…

SAP从入门到放弃系列之BOM技术类型-派生BOM-Part5

文章导航目录 一、概述二、基本概念-BOM技术类型三、BOM技术类型详解3.1、BOM技术类型-简单BOM&多重BOM 3.2、BOM技术类型-派生BOM 四、测试示例&#xff1a;4.1、数据准备4.2、创建派生BOM4.3、调整BOM组&#xff0c;更新派生BOM 一、概述 本来想在介绍BOM组的时候写这个…

hbase协处理器编码实例

Observer协处理器通常在一个特定的事件&#xff08;诸如Get或Put&#xff09;之前或之后发生&#xff0c;相当于RDBMS中的触发器。Endpoint协处理器则类似于RDBMS中的存储过程&#xff0c;因为它可以让你在RegionServer上对数据执行自定义计算&#xff0c;而不是在客户端上执行…

MATLAB 之 对话框设计实例和菜单设计

这里写目录标题 一、对话框设计实例1. 数值转化2. 图形演示 二、菜单设计1. 建立用户菜单2. 菜单对象常用属性3. 快捷菜单 一、对话框设计实例 在上一篇博客当中&#xff0c;我们介绍了控件的基本操作&#xff0c;这是建立对话框的基础。下面我们举两个例子&#xff0c;用以说…

软件测试工程师最常用的Linux系统命令大全(汇总)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 cd命令 这是一个…

最新导则下生态环评报告编制技术

根据生态环评内容庞杂、综合性强的特点&#xff0c;依据生态环评最新导则&#xff0c;将内容分为4大篇章(报告篇、制图篇、指数篇、综合篇)、 10大专题(生态环评报告编制、土地利用图的制作、植被类型及植被覆盖度图的制作、物种适宜生境分布图的制作、生物多样性测定、生物量…

开窗函数之聚合、取特定值、排名

一&#xff0c; 聚合开窗函数sum(score) over(partition by name ) 二&#xff0c;开窗函数之first_value&#xff0c;last_value&#xff0c;lead&#xff0c;lag 三&#xff0c;排名开窗函数ROW_NUMBER、DENSE_RANK、RANK 一&#xff0c;开窗函数的语法 开窗函数的语法为&am…

Pinia理解【Vue3】

什么是Pinia Pinia是Vue的专属的最新状态管理库&#xff0c;是Vuex状态管理工具的替代品 优势&#xff1a; 提供了更加简单的API (去掉了mutation)提供符合组合式风格的API(和Vue3新语法统一)去掉了 modules 的概念&#xff0c;每一个 store 都是一个独立的模块搭配 TypeScr…

RabbitMQ Exchange类型和工作模式介绍

RabbitMQ Exchange类型和工作模式介绍 一RabbitMQ Exchange类型1.1.Fanout1.2.Direct1.3.Topic1.4.Headers 二 RabbitMQ 工作模式介绍2.1.work工作模式(资源的竞争)2.2.publish/subscribe发布订阅(共享资源)2.3.routing路由模式应用--direct交换器 2.4.topic 主题模式(路由模式…

一键轻松造数据:通过Postman实现表单提交

一、原始需求的诞生 在测试的过程中&#xff0c;需要大量的表单。于是我选择了通过postman发送表单提交的接口来造数据。 如上图所示&#xff0c;表单提交接口所需的参数以及请求体中需模拟的IP地址。参数为 {{}} 的表示需要不同的实参&#xff0c;至于原因就不在这里赘述了。如…

618手机大战:各大品牌花式秀战报,但难掩冷淡行情

在手机出货量持续下行的态势下&#xff0c;各大手机厂商普遍对618这个年中大促寄予厚望&#xff0c;希望通过各种促销手段&#xff0c;扭转销售颓势。 比如&#xff0c;今年5月下旬&#xff0c;小米、荣耀、OPPO、vivo等厂商就已经开启了降价、分期免息等优惠活动&#xff0c;…

Vue3自定义指令实现按钮权限

一、需求前提 登录成功后&#xff0c;后端直接返回了用户的所有权限&#xff08;路由权限按钮权限&#xff09;&#xff0c;在已经实现菜单权限的基础上&#xff0c;实现每个页面的按钮权限&#xff0c;树形数据结构如下&#xff1a; { "roles": ["admin&q…