Androidplot рисует круг с заданной точкой и радиусом

Я использую androidplot с прикрепленным PanZoom:

PanZoom.attach(plot);

Поэтому я могу увеличивать и уменьшать масштаб, как следует.

Далее я хочу нарисовать круг в заданной точке. Прямо сейчас я использую ширину обводки, чтобы установить размер круга. Но когда я увеличиваю и уменьшаю масштаб, размер круга остается прежним, хотя он должен масштабироваться в соответствии с уровнем масштабирования. Итак, представьте, что я бесконечно увеличиваю масштаб, круг должен при определенном уровне масштабирования покрывать весь экран.

Но это не так. Как я могу этого добиться? Я думал об увеличении ширины обводки круга в соответствии с уровнем масштабирования, но я не смог ни получить уровень масштабирования, ни получить уровни домена слева и справа от графика.

РЕДАКТИРОВАТЬ: В папке xml я создаю файл, например. круг.xml:

<?xml version="1.0" encoding="utf-8"?>
<config
fillPaint.color="#00000000"
linePaint.color="#00000000"
linePaint.strokeWidth="0dp"
pointLabelFormatter.textPaint.color="#FFFFFF"
vertexPaint.color="#371cd1d4"
vertexPaint.strokeWidth="20dp"/>

и в джаве

    sigmaLabelFormatter = new LineAndPointFormatter();
    sigmaLabelFormatter.setPointLabelFormatter(new PointLabelFormatter());
    sigmaLabelFormatter.configure(activity.getApplicationContext(), R.xml.circle);
    sigmaLabelFormatter.setPointLabelFormatter(null);

person Johan    schedule 02.01.2017    source источник
comment
Какой у вас код для создания круга?   -  person Danieboy    schedule 02.01.2017


Ответы (2)


Масштаб влияет только на отрисовку данных XYSeries; если вы рисуете прямо на холсте, он будет нарисован именно там, где вы укажете на холсте, независимо от панорамирования/масштабирования.

Одна вещь, которую вы можете сделать, это сделать серию, представляющую ваш круг, и нарисовать круг там. Это заставит круг реагировать как на панорамирование, так и на масштабирование. Сложная часть будет заключаться в том, чтобы выбрать достаточное количество точек, чтобы круг выглядел гладким при максимальном поддерживаемом уровне масштабирования.

person Nick    schedule 02.01.2017
comment
Привет, я очень доволен PanZoom и так далее, единственное, круг остается того же размера в пикселях. Но когда я увеличиваю масштаб, я хотел бы, чтобы круг становился больше и наоборот. Я понимаю вашу точку зрения о представлении круга в виде точек. Единственная проблема в том, что круг динамический, поэтому он сильно меняется. Вы можете ясно увидеть мою проблему, если запустите пример приложения androidplot. Я хотел бы, чтобы пузырьки в примере с пузырьковой диаграммой меняли свой размер в зависимости от уровня масштабирования... - person Johan; 02.01.2017
comment
ах, я думал, что вы просто рисуете круги на холсте ... не знал, что вы используете серию пузырьков. то, что вы хотите сделать, возможно - я обновлю свой ответ, как только найду место, где я могу написать код: p - person Nick; 03.01.2017
comment
Сегодня у меня была возможность немного поиграть с этим, и я быстро столкнулся с осложнением; поскольку домен/диапазон часто являются полностью независимыми типами масштабов/значений и могут масштабироваться независимо друг от друга, нет простого способа масштабировать размер пузырька исключительно на основе масштабирования, не ограничивая масштабирование пузырька событиями масштабирования на одной оси или добавляя дополнительные свойства к ряд, определяющий своего рода масштабный коэффициент для каждой оси. Знаете ли вы, какой из этих подходов лучше всего подходит для вашего варианта использования? - person Nick; 04.01.2017
comment
Привет, Ник, какой тип зума ты используешь? Я использую следующее: panzoom = PanZoom.attach(plot); panzoom.setZoom(PanZoom.Zoom.SCALE); - person Johan; 24.01.2017

Я нашел решение своей проблемы, так как мне наконец удалось:

чтобы получить уровни домена на левой и правой стороне графика.

или, если быть более точным, чтобы получить ширину графика.

Так как размеры участка указаны в метрах, я делаю расчет следующим образом:

private float calculateDP(float px){        
  return px / (densityDpi / densityDefault);
}

private float pixelsPerMeter(float value){
    float w = plot.getGraph().getWidgetDimensions().canvasRect.width();
    float w2 = plot.getBounds().getWidth().floatValue();
    return value * (w / w2);
}

private void init(Activity activity){
    densityDpi = activity.getResources().getDisplayMetrics().densityDpi;
    densityDefault = android.util.DisplayMetrics.DENSITY_DEFAULT;
}

private void onCreate(){
// ... lots of stuff
labelFormatter.getVertexPaint().setStrokeWidth(calculateDP(pixelsPerMeter(2)));
}

Может кому поможет...

person Johan    schedule 12.01.2017