Я был возиться с кинетиками, и я пытался создать инструмент для мыши, который позволяет стирать вещи на одном уровне. Я знаю, что могу сделать белые линии, если мой фон белый, чтобы дать эффект «ластик», но моя проблема в том, что мой фон - это изображение (они не стирают фоновое изображение), поэтому рисование белых линий просто не стирает его. Мне нужно уметь фактически стирать части линии координатами мыши. Есть ли кто, что сделал это или знает, какКак сделать ластик с kineticjs
ответ
«Есть ли кто, что сделал это»
Я боюсь, что не. Линия, которую вы выделили, является объектом. Его просто удалить как целый объект.
Если вы не пользуетесь случаем, как ластик, было бы трудно разделить линию на несколько частей, которые остаются в drawin и той части, которая этого не делает.
Как бы то ни было, если ваша линия представляет собой группу пикселей, которая будет намного проще, но группа пикселей не является строкой.
Да, вы можете рисовать линии свободной руки и использовать ластик в кинетическом режиме.
Однако решение является довольно сложным.
Предпосылка:
Я предполагаю, что во время возни вы научились слушать события мыши и сохранить эти mouseXY для того, чтобы пользователь мог «перетащить-дро» ломаную линию.
Решение:
Решение включает в себя использование пользовательских Kinetic.Shape, который дает вам большую гибкость, чем заранее определенных Kinetic объектов.
A Kinetic.Shape дает вам полный контекст холста для работы.
Вы можете использовать context.moveTo
и несколько context.lineTo
, чтобы позволить пользователю перетаскивать свободные линии.
С полным контекстом вы также можете использовать композитинг.
В частности, вы можете использовать композицию «destination-out», которая заставляет любую новую линию рисовать как ластик.
С «destination-out» ... любые ранее нарисованные линии «стираются» новой строкой.
Схема вашего решения:
- Попросите пользователя перетащить нарисовать ломаную линию на холсте, захватив все отдельные точки, как они тащат.
- Захват, был ли пользователь включен в режиме «рисования» или «стирания» при перетаскивании этой линии.
- Используйте обычную Kinetic.Shape, чтобы нарисовать линию или использовать композицию для стирания строки.
- В режиме «рисования» установите context.globalCompositeOperation = «source-over» и нарисуйте эту строку.
- В режиме «стереть» задайте контекст.globalCompositeOperation = "destination-out" перетаскивает ластик.
Одним из осложнений является то, что контекст Kinetic.Shape дает вам оболочку вокруг истинного контекста холста.
Он ограничивает вас одним context.beginPath, и вы можете использовать только один композитный режим для context.beginPath. Поскольку вам нужно иметь несколько режимов компоновки (рисование против стирания), вам нужно знать, как получить реальный контекстный холст вместо Kinetic.Shapes wrapped context.
Вот как:
var sketchpad = new Kinetic.Shape({
drawFunc: function(context) {
// get a true canvas context, not a "wrapped" context
context=this.getContext()._context;
// save the context state
context.save();
// then you can use multiple beginPath's
// and therefore have multiple composites.
context.beginPath();
context.globalCompositeOperation="source-over";
// draw a polyline using your saved line-points
context.stroke();
context.beginPath();
context.globalCompositeOperation="destination-out";
// draw a polyline which acts like an eraser
context.stroke();
// restore the context state
context.restore();
},
stroke: 'black',
strokeWidth: 4
});
Спасибо за этот ответ! Итак, я должен использовать Shape для рисования и стирания? И вообще не использовать Line? Или я ошибаюсь? – lawls
** Да, используйте один Kinetic.Shape, чтобы нарисовать все линии и стирания. ** Вы должны использовать контент stageMousedown, contentMousemove и contentMouseup для захвата точек линии/стирания, потому что сцена прослушивает все события мыши. ** Да, используйте линии для рисования обеих линий и стираний **, потому что гораздо эффективнее расширить полилинию новыми точками. ** Подсказка: ** use lineCap: «round» & lineJoin: «round» для линий (более гладкие линии) ** Подсказка: ** сделать ластик strokeWidth немного больше, чем ширина нарисованной линии, чтобы пользователь мог больше легко стереть нарисованную линию. – markE
Я знаю, что это очень поздно, но когда я искал резинку я нашел эту ссылку первую и я не нашел хорошее решение, так что я создал новую и ее: How to make an eraser with kineticjs 5.1.0 acting on multi-layer?
- 1. Как сделать KineticJs пользовательскую форму
- 2. Эффект ластик с использованием холста
- 3. KineticJS сделать текст вертикально выровненным
- 4. OpenGL: Как реализовать инструмент «ластик»?
- 5. Сделать объект холста перетаскивания с помощью kineticjs
- 6. Как эмулировать ластик на вид?
- 7. Как использовать ластик в короне?
- 8. Как создать ластик в EaselJS?
- 9. Сделать kineticjs использовать существующий холст
- 10. Как сделать KineticJS шаг холста отзывчивым
- 11. KineticJS Заполнить с рисунком
- 12. Использование AngularJS с KineticJS
- 13. Холст, мой ластик не работает
- 14. Как реализовать ластик для пальцев в Android?
- 15. Как реализовать прозрачный ластик в Flex?
- 16. Линейные узоры с Kineticjs
- 17. Как применить фильтр KineticJS?
- 18. KineticJS как анимировать изображение
- 19. Пример Mindmapping с KineticJS
- 20. globalCompositeOperation с KineticJS
- 21. масштабирование группы с KineticJS
- 22. Как продлить KineticJS формы
- 23. Вращающаяся форма с KineticJS
- 24. Перемещение формы с KineticJS
- 25. Проблемы с производительностью KineticJS
- 26. Timelinelite с KineticJS
- 27. KineticJS с кешем: как это работает?
- 28. KineticJS текст как ссылки?
- 29. Как сделать анимацию чата для работы в KineticJS
- 30. Взаимодействие с формами холста KineticJS
Попробуйте наложить холст поверх документа, а затем нарисуйте его. Он также должен работать, если вы определяете белый как «ничего». –
Я тоже столкнулся с этой проблемой. У кого-нибудь есть решение для этого? – nAkhmedov