У меня есть компонент скраббера, который я взял из Интернета, и мне очень нравится его функциональность, но он не работает на мобильных устройствах. Я попробовал сделать это с помощью функции onclick, но это не совсем удобно для пользователя. Любая помощь приветствуется, спасибо!
Я немного скорректировал некоторые вещи, чтобы их можно было повторно использовать как функцию карты для отображения нескольких.
import { useEffect, useRef } from "react";
const Crabber = ({ urlVoor, urlAchter, description }) => {
const canvasRef = useRef(null);
useEffect(() => {
let canvas = canvasRef.current;
let context = canvas.getContext("2d");
let brushRadius = (canvas.width / 100) * 5;
if (brushRadius < 50) {
brushRadius = 50;
}
let img = new Image();
img.onload = function () {
context.drawImage(img, 0, 0, canvas.width, canvas.height);
};
img.src = urlVoor;
function detectLeftButton(event) {
if ("buttons" in event) {
return event.buttons === 1;
} else if ("which" in event) {
return event.which === 1;
} else {
return event.button === 1;
}
}
function getBrushPos(xRef, yRef) {
var canvasRect = canvas.getBoundingClientRect();
return {
x: Math.floor(
((xRef - canvasRect.left) / (canvasRect.right - canvasRect.left)) *
canvas.width
),
y: Math.floor(
((yRef - canvasRect.top) / (canvasRect.bottom - canvasRect.top)) *
canvas.height
),
};
}
function drawDot(mouseX, mouseY) {
context.beginPath();
context.arc(mouseX, mouseY, brushRadius, 0, 2 * Math.PI, true);
context.fillStyle = "#000";
context.globalCompositeOperation = "destination-out";
context.fill();
}
canvas.addEventListener(
"mousemove",
function (e) {
var brushPos = getBrushPos(e.clientX, e.clientY);
var leftBut = detectLeftButton(e);
if (leftBut == 1) {
drawDot(brushPos.x, brushPos.y);
}
},
false
);
canvas.addEventListener(
"touchmove",
function (e) {
e.preventDefault();
var touch = e.targetTouches[0];
if (touch) {
var brushPos = getBrushPos(touch.pageX, touch.pageY);
drawDot(brushPos.x, brushPos.y);
}
},
false
);
}, []);
return (
{description}
);
};
export default Crabber;
Подробнее здесь: https://stackoverflow.com/questions/783 ... e-friendly
Проблема с тем, чтобы сделать этот скретч-компонент удобным для мобильных устройств. ⇐ CSS
Разбираемся в CSS
1713821817
Anonymous
У меня есть компонент скраббера, который я взял из Интернета, и мне очень нравится его функциональность, но он не работает на мобильных устройствах. Я попробовал сделать это с помощью функции onclick, но это не совсем удобно для пользователя. Любая помощь приветствуется, спасибо!
Я немного скорректировал некоторые вещи, чтобы их можно было повторно использовать как функцию карты для отображения нескольких.
import { useEffect, useRef } from "react";
const Crabber = ({ urlVoor, urlAchter, description }) => {
const canvasRef = useRef(null);
useEffect(() => {
let canvas = canvasRef.current;
let context = canvas.getContext("2d");
let brushRadius = (canvas.width / 100) * 5;
if (brushRadius < 50) {
brushRadius = 50;
}
let img = new Image();
img.onload = function () {
context.drawImage(img, 0, 0, canvas.width, canvas.height);
};
img.src = urlVoor;
function detectLeftButton(event) {
if ("buttons" in event) {
return event.buttons === 1;
} else if ("which" in event) {
return event.which === 1;
} else {
return event.button === 1;
}
}
function getBrushPos(xRef, yRef) {
var canvasRect = canvas.getBoundingClientRect();
return {
x: Math.floor(
((xRef - canvasRect.left) / (canvasRect.right - canvasRect.left)) *
canvas.width
),
y: Math.floor(
((yRef - canvasRect.top) / (canvasRect.bottom - canvasRect.top)) *
canvas.height
),
};
}
function drawDot(mouseX, mouseY) {
context.beginPath();
context.arc(mouseX, mouseY, brushRadius, 0, 2 * Math.PI, true);
context.fillStyle = "#000";
context.globalCompositeOperation = "destination-out";
context.fill();
}
canvas.addEventListener(
"mousemove",
function (e) {
var brushPos = getBrushPos(e.clientX, e.clientY);
var leftBut = detectLeftButton(e);
if (leftBut == 1) {
drawDot(brushPos.x, brushPos.y);
}
},
false
);
canvas.addEventListener(
"touchmove",
function (e) {
e.preventDefault();
var touch = e.targetTouches[0];
if (touch) {
var brushPos = getBrushPos(touch.pageX, touch.pageY);
drawDot(brushPos.x, brushPos.y);
}
},
false
);
}, []);
return (
{description}
);
};
export default Crabber;
Подробнее здесь: [url]https://stackoverflow.com/questions/78368978/problem-making-this-scratch-component-mobile-friendly[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия