80,351
社区成员
发帖
与我相关
我的任务
分享
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这个接口,获取选中点的两根曲线位置,代码比较粗糙,仅供参考