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 修改柱状图高亮效果 的相关文章

随机推荐

  • 二分查找 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