基于MPAndroidChart库制作K线图(二) ­­­­­­­­­­­­—— 自定义x、y轴

2023-11-11 21:10

本文主要是介绍基于MPAndroidChart库制作K线图(二) ­­­­­­­­­­­­—— 自定义x、y轴,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录
基于MPAndroidChart库制作K线图(一) ­­­­­­­­­­­­—— 基础图
基于MPAndroidChart库制作K线图(二) ­­­­­­­­­­­­—— 自定义x、y轴
基于MPAndroidChart库制作K线图(三) ­­­­­­­­­­­­—— 手势高亮联动


一、效果图

二、针对x轴的标签进行自定义
可以看一下x轴的渲染器XAxisRenderer的源码,其中在绘制标签方法drawLabels()中可以发现所有的标签是居中显示在x轴的轴线上,而我需要的做的是将最左边的标签在屏幕靠右完整显示,最右边的标签在屏幕靠左完整显示,其余标签保持原来的不变。

继承XAxisRenderer重写drawLabels()方法

@Override
protected void drawLabels(Canvas c, float pos, MPPointF anchor) {final float labelRotationAngleDegrees = mXAxis.getLabelRotationAngle();boolean centeringEnabled = mXAxis.isCenterAxisLabelsEnabled();float[] positions = new float[mXAxis.mEntryCount * 2];for (int i = 0; i < positions.length; i += 2) {// only fill x valuesif (centeringEnabled) {positions[i] = mXAxis.mCenteredEntries[i / 2];} else {positions[i] = mXAxis.mEntries[i / 2];}}mTrans.pointValuesToPixel(positions);for (int i = 0; i < positions.length; i += 2) {float x = positions[i];if (mViewPortHandler.isInBoundsX(x)) {String label = mXAxis.getValueFormatter().getFormattedValue(mXAxis.mEntries[i / 2], mXAxis);if (mXAxis.isAvoidFirstLastClippingEnabled()) {// avoid clipping of the lastfloat width = Utils.calcTextWidth(mAxisLabelPaint, label);if (i == mXAxis.mEntryCount * 2 - 2 && mXAxis.mEntryCount > 1) {x -= width / 2 + interval;// avoid clipping of the first} else if (i == 0) {x += width / 2 + interval;}}drawLabel(c, label, x, pos, anchor, labelRotationAngleDegrees);}}
}

只修改了25行和28行 ,使第一个标签向右偏移一个距离、最后一个标签向左偏移一个距离;
然后将渲染器设置给CombinedChart

Transformer trans = ccKl.getTransformer(YAxis.AxisDependency.LEFT);
//自定义X轴标签位置
ccKl.setXAxisRenderer(new InBoundXAxisRenderer(ccKl.getViewPortHandler(), ccKl.getXAxis(), trans, 10));

然后就是设置x轴的显示的文字,通过setValueFormatter()方法可以自定义x轴显示的文字格式,如果不设置或者取不到x坐标值时不能返回null否则会空指针,返回空字符串即可。

xac.setValueFormatter(new IAxisValueFormatter() {@Overridepublic String getFormattedValue(float value, AxisBase axis) {int v = (int) value;if (!xValues.containsKey(v) && xValues.containsKey(v - 1)) {v = v - 1;}String x = xValues.get(v);return TextUtils.isEmpty(x) ? "" : x;}
});

三、针对y轴的标签进行自定义
y轴的渲染器YAxisRenderer,同理继承YAxisRenderer重写drawYLabels()方法,使y轴最上面的标签处于刻度下方,最下面的标签处于刻度上方

@Override
protected void drawYLabels(Canvas c, float fixedPosition, float[] positions, float offset) {final int from = mYAxis.isDrawBottomYLabelEntryEnabled() ? 0 : 1;final int to = mYAxis.isDrawTopYLabelEntryEnabled() ? mYAxis.mEntryCount : (mYAxis.mEntryCount - 1);int labelHeight = Utils.calcTextHeight(mAxisLabelPaint, "A");for (int i = from; i < to; i++) {String text = mYAxis.getFormattedLabel(i);float os = i == mYAxis.mEntryCount - 1 ? -0.9F * labelHeight : 0.7F * labelHeight;c.drawText(text, fixedPosition, positions[i * 2 + 1] + offset - os, mAxisLabelPaint);}
}

然后将渲染器设置给CombinedChart

//自定义Y轴标签位置
ccKl.setRendererLeftYAxis(new InBoundYAxisRenderer(ccKl.getViewPortHandler(), ccKl.getAxisLeft(), trans));

四、源码下载

github: https://github.com/xkdaq/KoinChart
coding: https://coding.net/u/xkdaq/p/KoinChart/git

这篇关于基于MPAndroidChart库制作K线图(二) ­­­­­­­­­­­­—— 自定义x、y轴的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/392847

相关文章

springboot项目打jar制作成镜像并指定配置文件位置方式

《springboot项目打jar制作成镜像并指定配置文件位置方式》:本文主要介绍springboot项目打jar制作成镜像并指定配置文件位置方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录一、上传jar到服务器二、编写dockerfile三、新建对应配置文件所存放的数据卷目录四、将配置文

Java实现自定义table宽高的示例代码

《Java实现自定义table宽高的示例代码》在桌面应用、管理系统乃至报表工具中,表格(JTable)作为最常用的数据展示组件,不仅承载对数据的增删改查,还需要配合布局与视觉需求,而JavaSwing... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

一文详解Java Stream的sorted自定义排序

《一文详解JavaStream的sorted自定义排序》Javastream中的sorted方法是用于对流中的元素进行排序的方法,它可以接受一个comparator参数,用于指定排序规则,sorte... 目录一、sorted 操作的基础原理二、自定义排序的实现方式1. Comparator 接口的 Lam

如何自定义一个log适配器starter

《如何自定义一个log适配器starter》:本文主要介绍如何自定义一个log适配器starter的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求Starter 项目目录结构pom.XML 配置LogInitializer实现MDCInterceptor

Druid连接池实现自定义数据库密码加解密功能

《Druid连接池实现自定义数据库密码加解密功能》在现代应用开发中,数据安全是至关重要的,本文将介绍如何在​​Druid​​连接池中实现自定义的数据库密码加解密功能,有需要的小伙伴可以参考一下... 目录1. 环境准备2. 密码加密算法的选择3. 自定义 ​​DruidDataSource​​ 的密码解密3

spring-gateway filters添加自定义过滤器实现流程分析(可插拔)

《spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔)》:本文主要介绍spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔),本文通过实例图... 目录需求背景需求拆解设计流程及作用域逻辑处理代码逻辑需求背景公司要求,通过公司网络代理访问的请求需要做请

Spring Security自定义身份认证的实现方法

《SpringSecurity自定义身份认证的实现方法》:本文主要介绍SpringSecurity自定义身份认证的实现方法,下面对SpringSecurity的这三种自定义身份认证进行详细讲解,... 目录1.内存身份认证(1)创建配置类(2)验证内存身份认证2.JDBC身份认证(1)数据准备 (2)配置依

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各