Получить правильную позицию точки в AndroidPlot

Я пытаюсь получить положение пикселя значений в моем AndroidPlot, но я не могу заставить его работать. Идея состоит в том, чтобы поместить курсор в точную точку, показанную на графике, на определенных условиях. Кто-нибудь из вас сталкивался / решал подобную проблему?

С уважением Jesper

Ответы на вопрос(2)

Я нашел решение. Моим намерением было найти значение для данного пикселя (например, нажав на график, я хотел, чтобы представляющее значение). Итак, после небольшого поиска я нашел вспомогательный класс ValPixConverter. Он предоставляет несколько методов, которые соответствуют моим потребностям. К сожалению, нет документации методов, но я нашел решение:

    private float pixelToValueY(float y) {
    //Parameters: 1=input y-value, 2=minmal y-value that is shown,  3=maximal y-value that is shown, 4=Hight of the view, 5=flip
    return (float) ValPixConverter.pixToVal(y, minXY.y, maxXY.y, mySimpleXYPlot.getHeight(), false);
    }

    private float pixelToValueX(float x) {
    //Parameters: 1=input y-value, 2=minmal y-value that is shown,  3=maximal y-value that is shown, 4=Hight of the view, 5=flip
    return (float) ValPixConverter.pixToVal(x, minXY.x, maxXY.x, mySimpleXYPlot.getWidth(), false);
    }

Тебе нужен просто другой путь. Метод valToPix () сделает это. Это очень похоже на кодекс выше.

Решение Вопроса

Я не знаю, есть ли лучшее встроенное решение, но здесь ручной подход.
Следующий код помещает курсор в координату X, где пользователь коснулся экрана, и соответствующую координату Y первой серии данных графика.

//NOTE about XYPlotZoomPan: when an OnTouchListener is set, zooming is disabled. Subclass to avoid it.
mPlot.setOnTouchListener(new View.OnTouchListener(){
    @Override
    public boolean onTouch(View v, MotionEvent me) {
        float touchX = me.getX();
        float touchY = me.getY();
        XYGraphWidget widget = mPlot.getGraphWidget();
        RectF gridRect = widget.getGridRect();
        if(gridRect.contains(touchX, touchY)){ //Check the touch event is in the grid
            XYSeries xyData = mPlot.getSeriesSet().iterator().next();
            long targetValX = Math.round(widget.getXVal(touchX));
            Log.d(TAG, "Touched at " + touchX + ", " + touchY + ". Target val X: " + targetValX);
            Long targetValY = null; 
            Long prevValX = null;
            if(mPlot.getSeriesSet().size() > 1){
                Log.w(TAG, "More than one series in plot. Using only the first one");
            }
            for(int i = 0; i < xyData.size(); ++i){
                long currValX = xyData.getX(i).longValue();
                long currValY = xyData.getY(i).longValue();
                //Calculate the range value of the closest domain value (assumes xyData is sorted in ascending X order)
                if(currValX >= targetValX){
                    long currDiff = currValX - targetValX; 
                    if(prevValX != null && (targetValX - prevValX) < currDiff){
                        targetValY = xyData.getY(i-1).longValue();
                    }else{
                        targetValY = currValY;
                    }
                    break;
                }
                prevValX = currValX;
            }
            if(targetValY != null){
                long maxValY = mPlot.getCalculatedMaxY().longValue();
                long minValY = mPlot.getCalculatedMinY().longValue();
                float pixelPosY = gridRect.top + ValPixConverter.valToPix(
                        (double)targetValY, (double)minValY, (double)maxValY, (float)gridRect.height(), true);
                widget.setRangeCursorPosition(pixelPosY);
                widget.setDomainCursorPosition(touchX);
                Log.d(TAG, String.format("Domain cursor set at Y %.2f, val %.2f = %d, min-maxValY (%d, %d)",
                        pixelPosY,
                        widget.getRangeCursorVal(), targetValY,
                        minValY, maxValY));
            }else{
                Log.w(TAG, "Couldn't find the closest range to the selected domain coordinate");
            }
            mPlot.invalidate();
        }else{
            Log.d(TAG, "Touched outside the plot grid");
        }

        return false;
    }
});
 22 сент. 2014 г., 08:57
Если вы хотите навести курсор на число, используйтеwidget.setCursorPosition(ValPixConverter.valToPix(targetValX, targetValY, gridRect, xyData.getX(0), xyData.getX(xyData.size()-1), minValY, maxValY);)); вместо 2 звонковwidget.setRangeCursorPosition() а такжеwidget.setDomainCursorPosition()

Ваш ответ на вопрос