我想在触摸图表区域的位置显示垂直光标。与此行关联的文本视图将显示该栏的值,其中的点的y轴值。当我将手指向左移动同时保持我的手指向下[左移或右移]时,此垂直光标将相应地移动并且文本视图也会跟随,但是在显示y轴值时移动时的新位置。
我看到GraphicalView有一个touchlistener,我可以注册以获得回调 - 但我从此以后如何使用它是无能为力的。我可以设法将touchevent与某种gesturelistener联系起来。但是,如何绘制叠加在当前图表顶部的垂直光标线?
我遇到的其他问题是,在onTuuch中返回true时我无法获取mChart.getCurrentSeriesAndPoint()的值; ,总是返回Null,但如果我将返回值更改为False,我可以获取值,但我无法再次访问该值。
这是我的代码
mChart.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_CANCEL) {
dataset.removeSeries(dataset.getSeriesCount()-1);
multiRenderer.removeSeriesRenderer(GraficaCuatro);
}
if (event.getAction() == MotionEvent.ACTION_DOWN) {
multiRenderer.setPanEnabled(false);
multiRenderer.setZoomEnabled(false);
SeriesSelection seriesSelection = mChart.getCurrentSeriesAndPoint();
if(seriesSelection != null)
{
Toast.makeText(
getActivity().getBaseContext(),"Hola",
Toast.LENGTH_SHORT).show();
}
XYSeries Line = new XYSeries("");
Line.add(event.getX()/1.5,minValue);
Line.add(event.getX()/1.5,maxValue);
dataset.addSeries(Line);
multiRenderer.addSeriesRenderer(GraficaCuatro);
}
if (event.getAction() == MotionEvent.ACTION_MOVE) {
dataset.removeSeries(dataset.getSeriesCount()-1);
multiRenderer.removeSeriesRenderer(GraficaCuatro);
XYSeries Line = new XYSeries("");
Line.add(event.getX()/1.5,minValue);
Line.add(event.getX()/1.5,maxValue);
dataset.addSeries(Line);
multiRenderer.addSeriesRenderer(GraficaCuatro);
}
if (event.getAction() == MotionEvent.ACTION_UP) {
dataset.removeSeries(dataset.getSeriesCount()-1);
multiRenderer.removeSeriesRenderer(GraficaCuatro);
}
mChart.repaint();
return true;
}
});
我想要的确如此。
dwef http://s2.subirimagenes.com/imagen/previo/thump_82994131.png 我需要帮助!
编辑:当我返回True时,这是我的onTouch代码;在onTouch中,来自toRealPoint()的值;并且SeriesSelection不正确,如果我将true更改为false,我可以获得实际值。请帮忙
mChart.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
SeriesSelection seriesSelection = mChart.getCurrentSeriesAndPoint();
double[]values = mChart.toRealPoint(0);
if(seriesSelection != null)
{
if (event.getAction() == MotionEvent.ACTION_CANCEL) {
dataset.removeSeries(dataset.getSeriesCount()-1);
multiRenderer.removeSeriesRenderer(GraficaCuatro);
}
if (event.getAction() == MotionEvent.ACTION_DOWN) {
XYSeries Line = new XYSeries("");
Line.add(seriesSelection.getXValue(),minValue);
Line.add(seriesSelection.getXValue(),maxValue);
dataset.addSeries(Line);
multiRenderer.addSeriesRenderer(GraficaCuatro);
}
if (event.getAction() == MotionEvent.ACTION_MOVE) {
dataset.removeSeries(dataset.getSeriesCount()-1);
multiRenderer.removeSeriesRenderer(GraficaCuatro);
XYSeries Line = new XYSeries("");
Line.add(seriesSelection.getXValue(),minValue);
Line.add(seriesSelection.getXValue(),maxValue);
dataset.addSeries(Line);
multiRenderer.addSeriesRenderer(GraficaCuatro);
}
if (event.getAction() == MotionEvent.ACTION_UP) {
dataset.removeSeries(dataset.getSeriesCount()-1);
multiRenderer.removeSeriesRenderer(GraficaCuatro);
}
}
mChart.repaint();
return true;
}
});
答案 0 :(得分:1)
为了绘制垂直光标,您必须添加一系列额外的垂直点添加到图表中。
chart.getCurrentSeriesAndPoint()
将返回与您在可选缓冲区下触摸屏幕的点最接近的内容。因此,您需要触摸靠近现有点的屏幕,例如它会返回一些东西。但是,您可以将可选缓冲区设置为您想要的任何值:
renderer.setSelectableBuffer(100);
要在图表上收听触摸事件,请按以下方式注册:
chartView.setOnClickListener(...);
对于某些工作代码,请查看官方的AChartEngine演示,this部分将为您提供帮助。
更新:另一个选项必须自己处理触摸并搜索系列以找到最近的点。您可以使用chartView.toRealPoint()
从屏幕点检索实际数据点。
答案 1 :(得分:0)
我用这个
mChart = (GraphicalView) ChartFactory.getLineChartView(getActivity().getBaseContext(), dataset, multiRenderer);
mChart.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
MotionEvent motionEvent = MotionEvent.obtain(
event.getDownTime(),
event.getEventTime(),
MotionEvent.ACTION_DOWN,
event.getX(),
event.getY(),
event.getMetaState()
);
mChart.onTouchEvent(motionEvent);
double[]values = mChart.toRealPoint(0);
for(int i = 0; i < dataset.getSeriesCount(); i++)
{
try
{
if((int)values[0] < dataset.getSeriesAt(i).getItemCount())
{
//float value = (float) dataset.getSeriesAt(i).getY((int)values[0]);
//Log.d("", "");
}
}
catch (Exception e) {
// TODO: handle exception
}
}
if (event.getAction() == MotionEvent.ACTION_CANCEL) {
dataset.removeSeries(dataset.getSeriesCount()-1);
multiRenderer.removeSeriesRenderer(GraficaCuatro);
}
if (event.getAction() == MotionEvent.ACTION_DOWN) {
XYSeries Line = new XYSeries("");
Line.add(values[0],minValue);
Line.add(values[0],maxValue);
dataset.addSeries(Line);
multiRenderer.addSeriesRenderer(GraficaCuatro);
}
if (event.getAction() == MotionEvent.ACTION_MOVE) {
dataset.removeSeries(dataset.getSeriesCount()-1);
multiRenderer.removeSeriesRenderer(GraficaCuatro);
XYSeries Line = new XYSeries("");
Line.add(values[0],minValue);
Line.add(values[0],maxValue);
dataset.addSeries(Line);
multiRenderer.addSeriesRenderer(GraficaCuatro);
}
if (event.getAction() == MotionEvent.ACTION_UP) {
dataset.removeSeries(dataset.getSeriesCount()-1);
multiRenderer.removeSeriesRenderer(GraficaCuatro);
}
mChart.repaint();
return true;
}
});