请问怎么获取MPAndroidCharts 折线图每个点的真实位置,要相对于屏幕的

yumazaki 2016-03-10 11:55:18
请问怎么获取MPAndroidCharts 折线图每个点的真实位置,要相对于屏幕的
...全文
338 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
丰子 2017-07-11
  • 打赏
  • 举报
回复
View textView = null;
  View textView2 = null;
  int trendCircleWidth = 0;// 曲线图中显示的标记圆点宽度,用于计算位置

  @Override
  public void onValueSelected(Entry entry, Highlight h) {
    setTextPoint(entry, h);
  }

  private void setTextPoint(Entry e, Highlight h) {

    // 曲线条数小于2条,则不进行下面的操作
    if (lineChart.getData().getDataSets().size() < 1) {
      return;
    }

    // 初始化圆点宽
    if (trendCircleWidth == 0) {
      trendCircleWidth = getResources().getDimensionPixelSize(R.dimen.lbw_layout_margin_8);
    }

    // 声明两个圆点,动态添加
    if (textView == null || textView2 == null) {
      textView = LayoutInflater.from(this).inflate(R.layout.lbw_text_rate, null);
      textView2 = LayoutInflater.from(this).inflate(R.layout.lbw_text_rate_2, null);
    }

    // 获取选中点的x轴坐标
    float value = e.getX();

    // 获取横坐标相交的两个点所在的列表
    List<Entry> list2 = lineChart.getData().getDataSets().get(1).getEntriesForXValue(value);
    List<Entry> list = lineChart.getData().getDataSets().get(0).getEntriesForXValue(value);

    // 先移除圆点视图
    lineChart.removeView(textView);
    lineChart.removeView(textView2);

    // 添加圆点视图
    lineChart.addView(textView);
    lineChart.addView(textView2);

    // 获取显示圆点所在布局的高度,chart添加视图的时候,
    // 是全屏的view,无法设定图片位置,因此需要知道布局大小,
    // 然后再减去布局的一半大小,即可设置位置
    int th = textView.getHeight();
    int th2 = textView2.getHeight();

    for (int i = 0; i < list.size(); i++) {
      Entry entry = list.get(i);// 第一个点
      Entry entry2 = list2.get(i);// 第二个点
      MPPointD pixels = null;
      MPPointD pixels2 = null;

      // 获取两条线与竖线的相交点位置
      if (e == entry) {
        // 当前选中的点等于竖线与第一条线相交点时,第二个点的位置就为第二条线的相交点位置
        pixels = lineChart.getTransformer(
                lineChart.getData().getDataSets().get(1).getAxisDependency()).
                getPixelForValues(e.getX(), e.getY());

        pixels2 = lineChart.getTransformer(
                lineChart.getData().getDataSets().get(0).getAxisDependency()).
                getPixelForValues(entry2.getX(), entry2.getY());

      } else {

        pixels = lineChart.getTransformer(
                lineChart.getData().getDataSets().get(1).getAxisDependency()).
                getPixelForValues(entry.getX(), entry.getY());

        pixels2 = lineChart.getTransformer(
                lineChart.getData().getDataSets().get(0).getAxisDependency()).
                getPixelForValues(e.getX(), e.getY());

      }

      // 设置圆点位置
      textView.setX((float) pixels.x - trendCircleWidth / 2);
      textView.setY((float) pixels.y - th / 2);

      textView2.setX((float) pixels2.x - trendCircleWidth / 2);
      textView2.setY((float) pixels2.y - th2 / 2);

      // 当基准线过了屏幕中间,markerview显示切换
      if (pixels.x < screenWidth / 2 - 50) {
        markerViewCustom.setStartXY(1, 1);
      }else{
        markerViewCustom.setStartXY(0, 0);
      }
      markerViewCustom.invalidate();

      lineChart.invalidate();
    }
  }
我是通过实现OnChartValueSelectedListener这个接口,获取选中点的两根曲线位置,代码比较粗糙,仅供参考

80,351

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧