MPAndroidChart 修改柱状图高亮效果

2023-11-12

MPAndroidChart 默认的选中高亮效果如下:

在这里插入图片描述
只是颜色加深,然后设计想要实现下面这种效果:

在这里插入图片描述
类似阴影效果,且显示的宽度需要增加。

一、MPAndroidChart 是否支持

查看该框架对外的接口,发现下面两个方法:

 BarDataSet set1 = new BarDataSet(yValues, "");
 set1.setHighLightColor(ContextCompat.getColor(this, R.color.black));
 set1.setHighLightAlpha(40);

只能修改高亮颜色和透明度,没有办法修改宽度和高度,无法达到我们想要的效果。
没有办法,只能先查看源码是如何实现,然后尝试去修改了。

二、查看源码实现

setHighLightAlpha() 方法入手:

//BarDataSet.java
    public void setHighLightAlpha(int alpha) {
        mHighLightAlpha = alpha;
    }

    @Override
    public int getHighLightAlpha() {
        return mHighLightAlpha;
    }

查看 getHighLightAlpha() 方法在哪里调用:

//BarChartRenderer.java
    @Override
    public void drawHighlighted(Canvas c, Highlight[] indices) {

        BarData barData = mChart.getBarData();

        for (Highlight high : indices) {

            IBarDataSet set = barData.getDataSetByIndex(high.getDataSetIndex());
            ......
            prepareBarHighlight(e.getX(), y1, y2, barData.getBarWidth() / 2f, trans);

            setHighlightDrawPos(high, mBarRect);
            //原来高亮背景就是绘制了一个矩形
            c.drawRect(mBarRect, mHighlightPaint);
        }
    }

从源码中可以看出,点击效果就是通过点击位置,重新绘制一个矩形。
所以重点就是 mBarRect 的赋值。

//BarChartRenderer.java
    protected void prepareBarHighlight(float x, float y1, float y2, float barWidthHalf, Transformer trans) {

        float left = x - barWidthHalf;
        float right = x + barWidthHalf;
        float top = y1;
        float bottom = y2;

        mBarRect.set(left, top, right, bottom);

        trans.rectToPixelPhase(mBarRect, mAnimator.getPhaseY());
    }

可以看到只要复写该方法,修改参数,就可以修改高亮矩形框的宽高。

三、代码实现

3.1 重写 BarChartRenderer 类

查看源码,可以发现 BarChartRenderer 的初始化位置,且支持自定义:

//BarChart.java
    @Override
    protected void init() {
        super.init();
		//初始化地方
        mRenderer = new BarChartRenderer(this, mAnimator, mViewPortHandler);

        setHighlighter(new BarHighlighter(this));

        getXAxis().setSpaceMin(0.5f);
        getXAxis().setSpaceMax(0.5f);
    }
    //支持开发者自定义
    public void setRenderer(DataRenderer renderer) {

        if (renderer != null)
            mRenderer = renderer;
    }

自定义 BarChartRenderer

public class TestBarChartRenderer extends BarChartRenderer {

  private Transformer transformer;

  public TestBarChartRenderer(
      BarDataProvider chart,
      ChartAnimator animator,
      ViewPortHandler viewPortHandler) {
    super(chart, animator, viewPortHandler);
  }

  @Override
  protected void prepareBarHighlight(float x, float y1, float y2, float barWidthHalf,
      Transformer trans) {
    transformer = trans;
    //修改高亮效果的高度和宽度,getYChartMax获取的就是表格的最大值
    super.prepareBarHighlight(x, mChart.getYChartMax(), y2, barWidthHalf + 0.2f, trans);
  }

}

//设置自定义Renderer
barChart.setRenderer(
        new TestBarChartRenderer(barChart, barChart.getAnimator(), barChart.getViewPortHandler()));
//点击整条数据高亮
barChart.setHighlightFullBarEnabled(true);


上面修改后虽然效果实现了,但是会导致一个问题,点击数据后,所有的数据的标记视图都在同一高度:

在这里插入图片描述
在这里插入图片描述
查看源码发现:

//BarChartRenderer.java
    @Override
    public void drawHighlighted(Canvas c, Highlight[] indices) {

        BarData barData = mChart.getBarData();

        for (Highlight high : indices) {

            IBarDataSet set = barData.getDataSetByIndex(high.getDataSetIndex());
            ......
            prepareBarHighlight(e.getX(), y1, y2, barData.getBarWidth() / 2f, trans);
			//修改高亮数据
            setHighlightDrawPos(high, mBarRect);
            //原来高亮背景就是绘制了一个矩形
            c.drawRect(mBarRect, mHighlightPaint);
        }
    }

 protected void setHighlightDrawPos(Highlight high, RectF bar) {
 		//这个位置会影响标记视图的显示位置
        high.setDraw(bar.centerX(), bar.top);
    }

所以在 prepareBarHighlight() 方法中修改完数据后,需要在 setHighlightDrawPos() 方法中还原真实的数据。最终代码如下:

public class TestBarChartRenderer extends BarChartRenderer {

  private Transformer transformer;

  public TestBarChartRenderer(
      BarDataProvider chart,
      ChartAnimator animator,
      ViewPortHandler viewPortHandler) {
    super(chart, animator, viewPortHandler);
  }

  @Override
  protected void prepareBarHighlight(float x, float y1, float y2, float barWidthHalf,
      Transformer trans) {
    transformer = trans;
    //修改高亮背景的高度和宽度
    super.prepareBarHighlight(x, mChart.getYChartMax(), y2, barWidthHalf + 0.2f, trans);
  }

  @Override
  protected void setHighlightDrawPos(Highlight high, RectF bar) {
    if (transformer != null) {
      //还原真实的点击数据
      float barWidthHalf = mChart.getBarData().getBarWidth() / 2f;
      float x = high.getX();
      RectF rectF = new RectF();
      rectF.set(x - barWidthHalf, high.getY(), x + barWidthHalf, 0f);

      transformer.rectToPixelPhase(rectF, mAnimator.getPhaseY());

      super.setHighlightDrawPos(high, rectF);

    } else {
      super.setHighlightDrawPos(high, bar);
    }
  }
}

柱状图的实现可以参考:
MPAndroidChart实现堆叠柱状图
MPAndroidChart 自定义 MarkerView

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MPAndroidChart 修改柱状图高亮效果 的相关文章

  • 如何获取之前的碎片?

    为了在我的应用程序中重用某些片段 我需要知道哪个片段是返回堆栈上的第二个片段 为了做到这一点 我正在使用getFragmentManager getFragments 显示以下错误 但有效 FragmentManager getFragme
  • onBeaconServiceConnect 未调用

    和以前一样 我使用 Android Beacon 库 它已经工作了 我可以通过 BLE 低功耗蓝牙找到信标 但是现在 更新到最新版本的库后 现在方法onBeaconServiceConnect 不再跑了 请告诉我我需要做什么才能让它发挥作用
  • 使用 google Directions API 的地图视图绘制方向 - 解码折线

    我正在尝试使用 Google 方向 API 在我的地图视图上显示方向 但我在从 JSON 响应获取数据时遇到困难 我可以获得 级别 和 点 字符串 但无法弄清楚如何将它们解码为地图上的点 任何帮助将非常感激 我有一个类可以为您解码它们 添加
  • Manifest Merger工具:替换失败

    我正在使用一个使用自己的 android theme 的库 因此在构建时收到以下错误 错误 55 9 任务 contacit processDebugManifest 执行失败 清单合并失败 AndroidManifest xml 中的属性
  • 带有一、二和三个按钮的 Android 警报对话框

    我不经常发出警报 但每次发出警报时 我都会花一些时间来阅读文档 https developer android com guide topics ui dialogs html并弄清楚如何去做 由于我现在不得不这样做几次 所以我将在下面写一
  • 带操作按钮的颤动本地通知

    我在我的 flutter 项目中尝试了 flutter 本地通知插件 它在简单通知上工作正常 但我需要带有操作按钮的通知功能 请帮助我或建议我实现此功能 不幸的是 flutter local notifications 插件尚不支持操作按钮
  • 如何在React Native Android中获取响应头?

    您好 我想在获取 POST 请求后获取响应标头 我尝试调试看看里面有什么response with console log response 我可以从以下位置获取响应机构responseData但我不知道如何获取标题 我想同时获得标题和正文
  • 如何在android线性布局上获得阴影? [复制]

    这个问题在这里已经有答案了 可能的重复 如何在android中为View设置阴影 https stackoverflow com questions 4406524 how to set shadow to a view in androi
  • Android Studio:未找到 Gradle DSL 方法:“classpath()”

    首先 我已阅读所有其他解决方案帖子以及有关迁移到 1 0 的官方文档 到目前为止 还没有任何效果 Error Error 23 0 Gradle DSL method not found classpath Possible causes
  • 菜单在片段的 onCreateOptionsMenu 处多次膨胀调用

    我使用 Fragments 当我切换到嵌套 Fragment 时 它实现了public void onCreateOptionsMenu Menu menu MenuInflater inflater 当我到达该嵌套片段时 我的菜单会多次膨
  • 在旋转时从错误的资源文件夹中提取可绘制对象

    在这里拉我的头发 因此 我正在使用一个具有多种类型的可绘制对象的应用程序 并且它们的结构如下 res Portrait resources drawable mdpi drawable hdpi drawable xhdpi Landsca
  • Android:滚动 Horizo​​ntalScrollView 时如何禁用 ScrollView 的垂直滚动?

    我正在开发一个带有带有 ScrollView 的 Activity 的 Android 应用程序 其中包含 Horizo ntalScrollView 等内容 当我触摸 Horizo ntalScrollView 时 我想禁用外部 Scro
  • HERE 地图:更改路线已行驶部分的颜色

    导航时可以改变路线的颜色吗 具体来说 我希望路线中已行驶的部分的颜色与即将行驶的部分的颜色不同 现在都是同一个颜色 将 MapRoute 对象的 TravelColor 变量设置为透明对我来说很有效 mapRoute color Resou
  • 按钮 - 单击时更改背景颜色

    我的活动中有 8 个按钮 我正在寻找的是 按钮具有默认背景 单击按钮时 背景颜色应更改为其他颜色 这部分非常简单 但是 当我单击任何其他按钮时 第一个按钮的背景颜色应该变回默认颜色 我知道这将使用 选择器状态 来完成 但我不太确定如何实现它
  • 如何在android asynctask中使用inputstream作为参数?

    我正在制作一个 Android 应用程序来跟踪股票详细信息 我将通过 csv 雅虎财经 检索数据 据我所知 在android 4 0中 网络连接无法在主线程上完成 因此 我将使用 asynctask 来建立连接 但是 我在参数方面遇到了一些
  • 模块中的类无法加载

    我正在开发一个 2D Unity android 游戏 其中我最近添加了 Firebase Beta SDK 但添加后FirebaseAnalytics unitypackage我面临的错误是 无法加载模块中的类 当我删除文件夹时Fireb
  • 错误:无法创建新会话,因为找不到需要 HttpClient、InputStream 和 long 的“createSession”

    我正在尝试自动化 Android 混合应用程序 但出现以下错误 1 线程 main org openqa selenium WebDriverException中出现异常 无法创建新会话 因为未找到需要 HttpClient InputSt
  • Android 中循环事件的星期几和时间选择器

    我想创建一个控件 允许用户在我的 Android 活动中选择一周中的某一天 星期一 和一天中的某个时间 下午 1 00 找不到任何关于此的好帖子 好吧 我想我已经明白了 我只是不喜欢这个解决方案 因为我在一周中的某一天使用的微调器与时间选择
  • javafx android 中的文本字段和组合框问题

    我在简单的 javafx android 应用程序中遇到问题 问题是我使用 gradle javafxmobile plugin 在 netbeans ide 中构建了非常简单的应用程序 其中包含一些文本字段和组合框 我在 android
  • Android 材料芯片组件崩溃应用程序。无法膨胀 xml

    Tried Chip来自两个支持库的组件 com google android support design 28 0 0 rc01和材料 com google android material material 1 0 0 rc01 堆栈

随机推荐

  • 二分查找 binarySearch

    二分查找 binarySearch 基本概念 时间复杂度和空间复杂度 如何取mid Level 1 一般实现 迭代法 递归法 Level 2 First or Last Position of Target Last Position of
  • ue4 VR测量

    1 在tick函数里面构建测量需要的射线 2 在控制器书写测量函数
  • 数据结构和算法的基本概念, 算法复杂度,时间,空间复杂度

    目录 概念 大O时间复杂度表示法 看几个例子 加法规则 乘法规则 例子 算法时间复杂度计算规则 常见算法时间复杂度 O 1 O 1
  • Spring注解@ComponentScan自定义扫描类

    注 ComponentScan是用在配置类上的 配置类用 Configuration标记 Filter定义扫描规则 FilterType ANNOTATION 按照注解 FilterType ASSIGNABLE TYPE 按照给定的类型
  • 串的模式匹配算法(超详细)

    串的模式匹配 1 简单的模式匹配算法 2 KMP算法 3 KMP算法改进 4 时间复杂度比较 1 简单的模式匹配算法 思想 将主串中所有长度为m的子串依次与模式串对比 直到找到一个完全匹配的子串或所有子串都不匹配为止 具体代码展示 1 串的
  • 电机磁链和反电动势系数辨识

    电机磁链和反电势系数关系 电机磁链和反电动势系数辨识 电机dq坐标系下电压方程 u d
  • mysql数据库备份还原及表空间和用户创建

    mysql数据库备份还原 1 本地机器copy文件到一台机器 scp path 路径 file 文件 10 10 10 10 对方机器ip paht 路径 file 文件 如果对方机器ssh的端口不是默认 需要添加端口 scp Pport
  • AD15如何在PCB界面锁定选中元件

    1 进入PCB界面 右下角 PCB PCB Inspector 2 选中你想要锁定的元件 inspector 出现属性 3 将Locked勾选 此时的元件固定在PCB上 无法进行拖动和属性修改
  • 在MATLAB中生成矩阵的三种方法

    在MATLAB中生成矩阵的三种方法 1 直接输入法 2 外部文件读入法 3 特殊矩阵函数生成法 1 直接输入法 1 矩阵所有元素必须在 内 2 矩阵中同行元素以逗号 或空格分隔 3 矩阵中行与行之间用分号 或回车分隔 4 矩阵元素可以是表达
  • SpringBoot如何快速简化部署

    针对于一些不清楚创建Maven项目和创建SpringBoot项目到底什么区别 本文通过创建Maven项目来构建SpringBoot项目 来方便理解两个创建方式的关系 目录 1 创建Maven工程 打jar包 2 导入spring boot相
  • Web自动化测试,页面多样化操作?

    目录 1 页面截图操作 1 1截取当前页面 1 2 1driver save screenshot filename full path 1 2 2driver get screenshot as file 完整的路径 文件名 1 2 3d
  • css 绘制直角梯形 和 平行四边形

    div div div div
  • mysql在order by中使用判断排序

    select u uName u userId u level u regTime from t user u where u status 1 and u level 1 or u level 2 order by case when u
  • 宝塔在线登录不成功的解决办法

    像上述的错误一样 宝塔外网地址打不开的情况 解决方法如下 首先登录腾讯云 找到宝塔 然后点击登录输入命令 su root 切换用户 密码如果忘记的话点击重置密码 然后在执行上述指令 输入密码就可以 进入宝塔了 输入bt命令 获得你的宝塔列表
  • Vue高德地图自定义信息窗内绑定点击事件

    因为信息窗肯定是在生成标记后点击触发的事件 所以在 methods 中直接定义点击生成标记事件 不过多赘述 本文主要解决点击标记弹出的信息窗内的点击事件绑定问题 这是高德官方文档中 自定义窗口数据的添加方式 看起来太麻烦且不好对代码进行操作
  • centos安装rocketmq

    1 下载 https github com apache rocketmq releases 2 环境 jdk1 8 0 211 maven3 6 3 3 安装 gt tar xf rocketmq all 4 7 1 tar gz gt
  • 【Spring中@Autowired和@Resource注解的区别?】

    一 背景 Spring中 Autowired和 Resource注解的区别 Spring框架想必大家都知道吧 那么Spring中 Autowired和 Resource注解的区别你知道吗 如果不知道也不要紧 我们就一起来学习一起吧 二 Au
  • linux库文件安装报错:arm-none-linux-gnueabi-ranlib: command not found

    交叉编译glog 再安装时报以下错误 libtool install arm none linux gnueabi ranlib usr local lib libglog a libtool line 1734 arm none linu
  • xshell SSH 连接出现 outgoing encryption ,或者no matching host key algorithm found错误的解决...

    首先看看xshell的使用版本 如果是xshell 4 提示的信息为 no matching host key algorithm found 如果是xshell 5 提示的是 outgoing encryption算法不支持的情况 值得注
  • MPAndroidChart 修改柱状图高亮效果

    MPAndroidChart 默认的选中高亮效果如下 只是颜色加深 然后设计想要实现下面这种效果 类似阴影效果 且显示的宽度需要增加 一 MPAndroidChart 是否支持 查看该框架对外的接口 发现下面两个方法 BarDataSet