我如何使用 onTouchEvent 或任何其他方式在 graphView 上绘制形状?
How can i draw a shape on a graphView using onTouchEvent or any other way?
我正在制作一个应用程序,其中有一个 graphView,其中笛卡尔 X 轴从 -150 到 150 变化,Y 轴值从 0-150 变化,如图所示 below.Now 我想绘制任何形状在这个 graphView 上使用我的 finger.I 的触摸希望我应该在这个 graph.The 上绘制任何形状绘制形状的坐标应该与 X 和 Y 轴值一致而不是像素屏幕坐标(我们使用 MotionEvent()).
我曾尝试使用 onTouchEvent() 来实现此目的,但 MotionEvent() returns 我的屏幕像素坐标均为正值。
我使用的第二种方法是使用 for 循环填充 graphView 的所有可能数据点,如代码 below.I 所示,使用了 setOnDataPointTapListener,当我在 graphView.But 上切换时,我得到了数据点,这里的问题是什么时候我将手指移到屏幕上以绘制 setOnDataPointTapListener() 未被触发。
有什么办法吗?我会非常感谢你的help.Thanks
public class MainActivity extends AppCompatActivity {
GraphView graph;
ArrayList<Point> dataPoints;
private static final String TAG = "MainActivity";
LineGraphSeries<DataPoint> series;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dataPoints = new ArrayList<>();
graph = findViewById(R.id.graphView);
Viewport viewport = graph.getViewport();
graph.getViewport().setXAxisBoundsManual(true);
graph.getViewport().setYAxisBoundsManual(true);
graph.getViewport().setScrollable(true);
graph.getViewport().setScalable(true);
viewport.setMaxX(150);
viewport.setMinX(-150);
viewport.setMaxY(150);
viewport.setMinY(0);
series = new LineGraphSeries<>();
for (int x = -150; x <= 150; x++) {
for (int y = 0; y <= 150; y++) {
DataPoint dataPoint = new DataPoint(x, y);
//100000 is the max datapoints
series.appendData(dataPoint, false, 100000);
}
}
graph.addSeries(series);
series.setOnDataPointTapListener(new OnDataPointTapListener() {
@Override
public void onTap(Series series, DataPointInterface dataPoint) {
Toast.makeText(MainActivity.this, "Datapoints are " + dataPoint.getX();
+ " " + dataPoint.getY(), Toast.LENGTH_LONG).show();
DataPoint dataPoint1 = (DataPoint) dataPoint;
int x = (int) dataPoint1.getX();
int y = (int) dataPoint1.getY();
dataPoints.add(new Point(x, y));
Log.d(TAG, "onTap: " + dataPoints.size());
}
}
});
}
您尝试过使用笛卡尔绘图仪吗?
您还可以在 onTouch() 方法中添加线程。以下代码对我有用:
@Override
public boolean onTouchEvent(final MotionEvent event) {
Thread CoordinatesThread = new Thread(new Runnable() {
@Override
public void run() {
float x = event.getX();
float y = event.getX();
Log.e("coordinates", x + ":" + y);
try {// take a gap for 5000 milisec before displaying new coordinates
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
CoordinatesThread.start();
return true;
}
我正在制作一个应用程序,其中有一个 graphView,其中笛卡尔 X 轴从 -150 到 150 变化,Y 轴值从 0-150 变化,如图所示 below.Now 我想绘制任何形状在这个 graphView 上使用我的 finger.I 的触摸希望我应该在这个 graph.The 上绘制任何形状绘制形状的坐标应该与 X 和 Y 轴值一致而不是像素屏幕坐标(我们使用 MotionEvent()).
我曾尝试使用 onTouchEvent() 来实现此目的,但 MotionEvent() returns 我的屏幕像素坐标均为正值。 我使用的第二种方法是使用 for 循环填充 graphView 的所有可能数据点,如代码 below.I 所示,使用了 setOnDataPointTapListener,当我在 graphView.But 上切换时,我得到了数据点,这里的问题是什么时候我将手指移到屏幕上以绘制 setOnDataPointTapListener() 未被触发。 有什么办法吗?我会非常感谢你的help.Thanks
public class MainActivity extends AppCompatActivity {
GraphView graph;
ArrayList<Point> dataPoints;
private static final String TAG = "MainActivity";
LineGraphSeries<DataPoint> series;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dataPoints = new ArrayList<>();
graph = findViewById(R.id.graphView);
Viewport viewport = graph.getViewport();
graph.getViewport().setXAxisBoundsManual(true);
graph.getViewport().setYAxisBoundsManual(true);
graph.getViewport().setScrollable(true);
graph.getViewport().setScalable(true);
viewport.setMaxX(150);
viewport.setMinX(-150);
viewport.setMaxY(150);
viewport.setMinY(0);
series = new LineGraphSeries<>();
for (int x = -150; x <= 150; x++) {
for (int y = 0; y <= 150; y++) {
DataPoint dataPoint = new DataPoint(x, y);
//100000 is the max datapoints
series.appendData(dataPoint, false, 100000);
}
}
graph.addSeries(series);
series.setOnDataPointTapListener(new OnDataPointTapListener() {
@Override
public void onTap(Series series, DataPointInterface dataPoint) {
Toast.makeText(MainActivity.this, "Datapoints are " + dataPoint.getX();
+ " " + dataPoint.getY(), Toast.LENGTH_LONG).show();
DataPoint dataPoint1 = (DataPoint) dataPoint;
int x = (int) dataPoint1.getX();
int y = (int) dataPoint1.getY();
dataPoints.add(new Point(x, y));
Log.d(TAG, "onTap: " + dataPoints.size());
}
}
});
}
您尝试过使用笛卡尔绘图仪吗?
您还可以在 onTouch() 方法中添加线程。以下代码对我有用:
@Override
public boolean onTouchEvent(final MotionEvent event) {
Thread CoordinatesThread = new Thread(new Runnable() {
@Override
public void run() {
float x = event.getX();
float y = event.getX();
Log.e("coordinates", x + ":" + y);
try {// take a gap for 5000 milisec before displaying new coordinates
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
CoordinatesThread.start();
return true;
}