首页 > 其他分享 >MPAndroidChart setLabelRotationAngle bug

MPAndroidChart setLabelRotationAngle bug

时间:2024-04-06 17:22:31浏览次数:23  
标签:setLabelRotationAngle 触发 MPAndroidChart lineChart analyzedData yRightAxis xAxis 

MPAndroidChart setLabelRotationAngle bug(应该包括其他关于修改x/y label的bug)

库是好库,但就是不更新了。。

bug 描述:修改 labelRotationAnglesetLabelRotationAngle()),手势缩放一下视图,才触发自动调整视图,会导致图表大小发生变化。用起来就是,第一次显示,label被截断,必须手动缩放一下图表,才能触发视图自适应。

解决过程

上 github 搜一下,也是一个已知陈年老 bug:https://github.com/PhilJay/MPAndroidChart/issues/3298#issuecomment-442241286

谷歌翻译:我尝试旋转标签 xAxis.setLabelRotationAngle(-30f); 这有帮助,但对于第一次渲染它被裁剪,我必须缩放图表以重新渲染,然后显示完整的标签。不知道如何强制初始重新渲染。

继续 github 上看了一个 pr,感觉改的也不好。google 了一圈,没有找到一个很好的不改动库源代码解决方法。

于是自己摸索了下:全文无图(懒

先知道一下某几个方法的意义(基于折线统计图):

mXAxisRenderer.computeAxis():涉及计算 xLabel 的宽高:mXAxis.mLabelRotatedHeightmXAxis.mLabelRotatedWidth

BarLineChartBase.calculateOffsets():涉及计算图表的宽高信息等 ViewPortHandler.mContentRect

调试了下,得到原先大致逻辑:

  1. setDate(),则 notifyDataSetChanged(),触发一次计算 mXAxisRenderer.computeAxis()calculateOffsets()
  2. onDraw 又触发一次 calculateOffsets()mXAxisRenderer.computeAxis() 直接绘制出 x、y 轴,以及上面的 label 标签;
  3. 然后是绘制图上的点,省略。

总结原因:当我们设置 data 的时候,会立即直接计算出对应的 label 宽高信息,而后续我们再设置 xAxis 等轴信息的时候就无法参与计算。导致最后绘图异常。

放大触发原因

手动放大 onTouch 会触发 mChart.calculateOffsets(),该方法会更新 ViewPortHandler.mContentRect 更新 bottom,随后再触发 onDraw

点击不触发原因

点击触发 BarLineChartBase.onDraw -> mXAxisRenderer.computeAxis 更新计算 mXAxis.mLabelRotatedHeightmXAxis.mLabelRotatedWidth;(加上bottom)
并画标签:mXAxisRenderer.renderAxisLabels(canvas);

好像没有重新计算 bottom 重绘啊,忘记了,笔者写此文时也没有验证,以上摘自草稿记录

解决方案

既然知道大致逻辑,那就很好办了。

我们直接先设置好轴信息,再 setDate() 即可!!!

本来是只想先把 setLabelRotationAngle()(即 lineChart.xAxis.labelRotationAngle),放在 setData() 前面。

测试发现高度最终会有些许出入,表现出来也就是旋转后的 label 会有部分被切掉,也就是展示高度虽有变高,但仍不够。

一想,我们对轴做了那么多自定义,那么这个误差也是理所当然的。

// kotlin举例
fun constructChart(analyzedData: AnalyzedData) {
    lineChart.tag = analyzedData
    lineChart.description.text = "数据图表"
    lineChart.description.yOffset = 22f
    lineChart.description.textColor = colorBoarder
    lineChart.setNoDataText("暂无数据")
    lineChart.setNoDataTextColor(primaryColor)

    val xCount = 999f

    // 设置 X 轴
    val xAxis = lineChart.xAxis
    xAxis.axisMaximum = xCount
    xAxis.axisMinimum = 0f
    xAxis.position = XAxis.XAxisPosition.BOTTOM
    xAxis.setDrawAxisLine(false)
    xAxis.setDrawGridLines(false)
    // 设置数量
    xAxis.setLabelCount(xCount.toInt())
    xAxis.valueFormatter = analyzedData
    xAxis.textColor = colorBoarder
    xAxis.isGranularityEnabled = true
    xAxis.setGranularity(1f)
    lineChart.xAxis.labelRotationAngle = when {
        xCount > 25f -> -90f
        xCount > 13f -> -45f
        else -> 0f
    }

    // 设置 Y 轴
    val yRightAxis = lineChart.axisRight
    yRightAxis.axisMaximum = analyzedData.ceilMaxY
    yRightAxis.axisMinimum = 0f
    LogUtils.log("YAxisMaximum: ${yRightAxis.axisMaximum}")
    yRightAxis.setDrawGridLines(true)
    yRightAxis.enableGridDashedLine(15f, 5f, 0f)
    yRightAxis.textColor = colorBoarder
    yRightAxis.isGranularityEnabled = true
    yRightAxis.setGranularity(1f)

    val yLeftAxis = lineChart.axisLeft
    yLeftAxis.axisMaximum = analyzedData.ceilMaxY
    yLeftAxis.axisMinimum = 0f
    yLeftAxis.setDrawLabels(false)
    yLeftAxis.setDrawGridLines(false)
    lineChart.animateXY(600, 600, Easing.EaseInSine, Easing.EaseInSine)

    // 设置图例
    val legend: Legend = lineChart.legend
    legend.isEnabled = false

    // 最后设置数据,第一次设置时也会触发notifyDataSetChanged,重新计算
    lineChart.data = analyzedData.lineData
}

写文章的时候,没有再调试了,全凭草稿写的,图都懒得弄。仅做一个记录。可能有所纰漏,欢迎指出。

标签:setLabelRotationAngle,触发,MPAndroidChart,lineChart,analyzedData,yRightAxis,xAxis,
From: https://www.cnblogs.com/ercilan/p/18117635

相关文章

  • VSCODE EIDE使用debug记录
    用上vscode之后就感觉之前的keil不太爽了,找什么东西搜索都很麻烦,之前有写过eide的文章,想着能不能在eide里面就把debug也做了,发现真的可以,下面记录一下,主要是参考这个大佬的文章,非常感谢。VscodeEIDE+CortexDebug搭建STM32开发仿真环境本身是依赖这个软件,需要安装一下......
  • 【爬虫】debug篇-关于fake_useragent无法使用:Error occurred during loading data. Tr
    Erroroccurredduringloadingdata.Tryingtousecacheserverhttps://fake-useragent.herokuapp.com/browsers/0.1.11Traceback(mostrecentcalllast):File"D:\python\lib\site-packages\fake_useragent\utils.py",line154,inloadfori......
  • dbt debug macro 简单说明
    dbt支持debugmacro可以用来进行调试使用{%macromy_macro()%} {%setsomething_complex=my_complicated_macro()%} {{debug()}} {%endmacro%}参考实现实际上就是通过环境变量开启了一个debug上下文变量ifos.en......
  • 个人所得税专项附加扣除子女/父母比例超出100%,而实际家人提交的个税申报并未包含冲突
    问题1:我老婆一开始填报了两个孩子的个人所得税专项附加扣除,写的比例是100%,在提交汇算时,她又去掉了,并且补了税。然后我再去填我的,然后就发现总是提示超过100%,如果提交就不会包含冲突项。问题1解决:1.没有办法,在咨询中提交了问题,他们回复说两个子女的专项附加扣除依然存在,让自己......
  • 使用 Debugger 断点 如果打开了断点调试 就会跳转空白页面
    <!DOCTYPEhtml><html><header><title>test</title></header><body><h1>test</h1></body><script>setInterval(function(){varsta......
  • 国内首款AI音乐生成大模型「天工SkyMusic」并开启免费邀测;SWE-agent 修复GitHub仓库中
    ✨1:天工SkyMusic昆仑万维推出国内首款AI音乐生成大模型「天工SkyMusic」并开启免费邀测天工SkyMusic是由昆仑万维集团开发的一款AI音乐生成工具,它基于先进的「天工3.0」超级大模型构建,代表了目前国内唯一公开可用的AI音乐生成大模型。这款工具专为那些想要借助人工......
  • Apple Watch 运动记录自动停止 bug All In One
    AppleWatch运动记录自动停止bugAllInOneAppleWatchS6运动记录会自动停止bugquestionshttps://discussionschinese.apple.com/thread/253879237?sortBy=besthttps://discussionschinese.apple.com/thread/251948485?sortBy=bestdemosAppleWatchS6骑行记录,......
  • Advanced .Net Debugging 6:程序集加载器
    一、简介这是我的《Advanced.NetDebugging》这个系列的第六篇文章。这篇文章的内容是原书的第二部分的【调试实战】的第四章。这章主要讲的是程序集加载器,比如:CLR加载器简介、简单的程序集加载故障、加载上下文故障、互用性与DllNotFoundException和轻量级代码生成的......
  • MySQL的多层SP中Cursor的m_max_cursor_index相关BUG分析
    源码分析丨MySQL的多层SP中Cursor相关BUG一、问题发现在一次开发中在sp中使用多层cursor的时候想知道每层的m_max_cursor_index值分别是多少,以用来做后续开发。于是做了以下的试验,但是发现第一个level=2那层的m_max_cursor_index的值有点问题。注:本次使用的MySQL数据库版本为......
  • 【Python BUG】ImportError: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `CX
    报错ImportError:/usr/lib/x86_64-linux-gnu/libstdc++.so.6:version`CXXABI_1.3.9‘notfound背景开发的一个python预测程序(算法分析+应用服务),在原本的linux服务器下配置了开发环境,打包后在另一台凝思服务器解压,发现报错。应该是linux系统之间存在差异,动态库缺失......