Не масштабированный слой взаимодействия на Konva / Canvas

#javascript #css #canvas #konvajs

Вопрос:

Я пишу простой редактор изображений в React Konva. Я сгенерировал <Stage width={500} height={500}> , но в меньших видовых экранах я пытаюсь масштабировать лист холста с помощью CSS.

Например:

 const Component = () => (
    <Div>
        <Stage {...size}> ... </Stage>
    </Div>
)

const Div = styled.div`
  canvas {
    max-width: 100% !important;
    height: auto !important;
  }
  .konvajs-content {
    width: initial !important;
    height: initial !important;
  }
`;

 

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

Пример: https://youtu.be/ulu_ot5f9Xg

Я не могу масштабировать холст с помощью окна просмотра. Другие функции используют этот холст и ожидают большого разрешения.

Ответ №1:

Вы не должны масштабировать сцену Konva с помощью CSS и не должны изменять стиль ее внутренних элементов. Это может нарушить алгоритм обнаружения попаданий, а также значительно снизить производительность вашего приложения.

Вместо этого вам следует просто прочитать размер элемента DOM контейнера и применить этот размер к сцене. При необходимости вы можете использовать scaleX и scaleY для сцены, чтобы настроить содержимое.

Для демонстрации посмотрите здесь: https://konvajs.org/docs/sandbox/Responsive_Canvas.html#Do-you-need-responsive-adaptive-canvas-for-you-desktop-and-mobile-applications

Комментарии:

1. спасибо вам за ваш ответ! Мне нужно сохранить результат холста в файл в высоком разрешении. Как я могу сделать это в мобильном разрешении, если я получу небольшой холст (например, 360 пикселей)?

2. При экспорте сцены в изображение вы можете контролировать качество и разрешение результата. Видишь konvajs.org/docs/data_and_serialization/…