Как я могу нарисовать фигуру в GraphView, используя onTouchEvent или любым другим способом? - PullRequest
0 голосов
/ 16 апреля 2020

Я создаю приложение, в котором у меня есть graphView, где декартова ось X изменяется от -150 до 150, а значения оси Y варьируются от 0 до 150, как показано ниже. Теперь я хочу нарисовать любые фигуры поверх этого graphView, используя прикосновение моего пальца. Я хочу, чтобы я нарисовал любую фигуру на этом графике. Координаты нарисованной фигуры должны соответствовать значениям оси X и Y, а не координатам пикселей (которые мы получаем с помощью MotionEvent ()). .

My app screen

Я пытался добиться этого с помощью onTouchEvent (), но там MotionEvent () возвращает мне пиксельные координаты экрана, которые все являются положительными , Второй подход, который я использовал, - это заполнение всех возможных точек данных в графе GraphView, использующих циклы for, как показано в коде ниже. Я использовал setOnDataPointTapListener, где я касаюсь DataPoints, когда я вкладываю курсор над graphView. Но проблема здесь в том, когда я двигаю пальцем над экраном для рисования setOnDataPointTapListener () не срабатывает. Есть ли способ сделать это? Я буду очень благодарен за вашу помощь. Спасибо

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());
            }
        }
    });
}

1 Ответ

1 голос
/ 16 апреля 2020

Пробовали ли вы использовать декартовой плоттер.

https://github.com/ederdoski/SimpleCartesianPlotter?utm_source=android-arsenal.com&utm_medium=referral&utm_campaign=7223

Вы также можете добавить нить в метод 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...