Рисование элементов на Canvas для разных диагоналей смартфонов

У меня есть Активити на котором, в зависимости от введенных параметров, рисуется график. Опорные точки этого графика можно двигать. Вот примерно так это выглядит:

введите сюда описание изображения

Не будем вдаваться в подробности что это и для чего, перейдем сразу к сути

Верхняя часть экрана - это ConstraintLayout, который я создаю в xml-файле. Я закидываю его на мою основную вьюшку:

    LinearLayout mainLayer;
View layer1;
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //setContentView(new DrawView(this));

        mainLayer = (LinearLayout) findViewById(R.id.master);
        LayoutInflater inflater = getLayoutInflater();
        layer1 = inflater.inflate(R.layout.layer1, null);

        mainLayer.addView(layer1);

Затем я, по нажатию на кнопку, на вьюшку добавляю рисунок. Этот рисунок рисуется в классе:

    class DrawView extends View {
Paint p;
public DrawView(Context context) {
    super(context);

    //задаем перо для рисования
    p = new Paint(Paint.ANTI_ALIAS_FLAG);
    p2 = new Paint(p);
    p2.setStrokeWidth(4);
    p2.setColor(Color.BLACK);
    p2.setPathEffect(new DashPathEffect(new float[]{30, 10}, 0));
}
public void onDraw(Canvas canvas) {
//Пример того как я рисую вот эту черную штуку справа
    canvas.drawLine(1150, height / 2 + 100, 1150, 20, p3);
            canvas.drawLine(1150, 20, 1320, 20, p3);
            canvas.drawLine(1320, 20, 1320, height / 2 - 30, p3);
            canvas.drawLine(1320, height / 2 - 30, 1360, height / 2 - 30, p3);
            canvas.drawLine(1150, yC, 1260, yC, p3 );
}

//Двигаю точки
@Override
public boolean onTouchEvent(MotionEvent event) {
    float X = event.getX();
    float Y = event.getY();

    switch (event.getAction()) {

        case MotionEvent.ACTION_DOWN:
            //Если попал в пределы точки, то можно двигать
            break;

        case MotionEvent.ACTION_MOVE:
            // запрещаем двигать другие точки и перерисовываем нажатую

        case MotionEvent.ACTION_UP:
            break;
    }
    return true;
}}

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

Подобная проблема не только с самим рисованием, но и, например, с пером, размер которого для устройства с меньшей диагональю является большим, когда для данного устройства он идеален.

Вопрос: Как мне сделать так, чтобы данный рисунок у меня полностью влезал как на устройство с размерами 2160х1440 пикселей, так и на устройство с меньшим размером?

У меня два, возможно, глупых предположения:

1) Поместить все это в некий "контейнер", который будет принимать размер экрана, но проблема в том, что я рисую по пикселям! Значит надо рисовать другим образом, а как именно? Пока я не смог найти решение

2) Производить расчет... Ну то есть каким-то образом расчитывать положение рисунка в зависимости от размера экрана. Грубо говоря, если экран 2000х1000 пикселей, то рисунок будет в положении х:400 y:200, если экран уменьшается, то и координаты тоже уменьшаются. Но тоже способ так себе...


Ответы (0 шт):