基于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自定义注解如何解决公共字段填充问题

《SpringBoot自定义注解如何解决公共字段填充问题》本文介绍了在系统开发中,如何使用AOP切面编程实现公共字段自动填充的功能,从而简化代码,通过自定义注解和切面类,可以统一处理创建时间和修改时间... 目录1.1 问题分析1.2 实现思路1.3 代码开发1.3.1 步骤一1.3.2 步骤二1.3.3

dubbo3 filter(过滤器)如何自定义过滤器

《dubbo3filter(过滤器)如何自定义过滤器》dubbo3filter(过滤器)类似于javaweb中的filter和springmvc中的intercaptor,用于在请求发送前或到达前进... 目录dubbo3 filter(过滤器)简介dubbo 过滤器运行时机自定义 filter第一种 @A

CSS自定义浏览器滚动条样式完整代码

《CSS自定义浏览器滚动条样式完整代码》:本文主要介绍了如何使用CSS自定义浏览器滚动条的样式,包括隐藏滚动条的角落、设置滚动条的基本样式、轨道样式和滑块样式,并提供了完整的CSS代码示例,通过这些技巧,你可以为你的网站添加个性化的滚动条样式,从而提升用户体验,详细内容请阅读本文,希望能对你有所帮助...

使用Python制作一个PDF批量加密工具

《使用Python制作一个PDF批量加密工具》PDF批量加密‌是一种保护PDF文件安全性的方法,通过为多个PDF文件设置相同的密码,防止未经授权的用户访问这些文件,下面我们来看看如何使用Python制... 目录1.简介2.运行效果3.相关源码1.简介一个python写的PDF批量加密工具。PDF批量加密

SpringBoot 自定义消息转换器使用详解

《SpringBoot自定义消息转换器使用详解》本文详细介绍了SpringBoot消息转换器的知识,并通过案例操作演示了如何进行自定义消息转换器的定制开发和使用,感兴趣的朋友一起看看吧... 目录一、前言二、SpringBoot 内容协商介绍2.1 什么是内容协商2.2 内容协商机制深入理解2.2.1 内容

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

用Unity2D制作一个人物,实现移动、跳起、人物静止和动起来时的动画:中(人物移动、跳起、静止动作)

上回我们学到创建一个地形和一个人物,今天我们实现一下人物实现移动和跳起,依次点击,我们准备创建一个C#文件 创建好我们点击进去,就会跳转到我们的Vision Studio,然后输入这些代码 using UnityEngine;public class Move : MonoBehaviour // 定义一个名为Move的类,继承自MonoBehaviour{private Rigidbo

Oracle type (自定义类型的使用)

oracle - type   type定义: oracle中自定义数据类型 oracle中有基本的数据类型,如number,varchar2,date,numeric,float....但有时候我们需要特殊的格式, 如将name定义为(firstname,lastname)的形式,我们想把这个作为一个表的一列看待,这时候就要我们自己定义一个数据类型 格式 :create or repla