μ§λ μνΈμμ©μ ꡬννλ©΄μ, μ²μμλ λ§μ°μ€ μ΄λ²€νΈλ₯Ό νμ©ν΄ μ§λ μ΄λκ³Ό νλ/μΆμλ₯Ό ꡬννμ΅λλ€.
νμ§λ§ λͺ¨λ°μΌ νκ²½μ μ§μνκΈ° μν΄ ν°μΉ μ΄λ²€νΈλ₯Ό μΆκ°ν΄μΌ νμ΅λλ€. ν°μΉ μ΄λ²€νΈλ λ§μ°μ€ μ΄λ²€νΈμ κΈ°λ³Έμ μΌλ‘ λΉμ·νμ§λ§, μΌλΆ λμκ³Ό μ²λ¦¬ λ°©μμ΄ λ¬λμ΅λλ€. μμνλ κ²λ³΄λ€ ꡬνν΄μΌ ν λ‘μ§μ΄ λ λ§μκ³ , μ¬λ¬ κ°μ§ λ¬Έμ λ₯Ό ν΄κ²°νλ©° λ§μ κ³ λ―Όμ νκ² λμ΅λλ€.
μ΄λ² ν¬μ€ν μμλ λ§μ°μ€ μ΄λ²€νΈλ‘ ꡬνλ μ§λ μνΈμμ©μ ν°μΉ μ΄λ²€νΈλ‘ νμ₯ν κ³Όμ μ μμ±ν΄λ³΄λ €κ³ ν©λλ€.
μ κ° μμ ν΄μΌνλ μ£Όμ κΈ°μ μ μλ 3κ°μ§λ‘ μ 리ν μ μμμ΅λλ€.
μ΄μ ν¬μ€ν μμ μμ±ν κ²μ²λΌ, λ§μ°μ€ μ΄λ²€νΈλ‘ μ§λ μ΄λ/μ€μ ꡬνν΄ λ μν©μ΄μμ΅λλ€.
λͺ¨λ°μΌμ΄ μλ λμλ λ§μ°μ€ μ΄λ²€νΈλ‘, λͺ¨λ°μΌλ‘ μ μνμ λμλ ν°μΉ μ΄λ²€νΈλ‘ λͺ¨λ λμν μ μκ² ν°μΉ μ΄λ²€νΈλ₯Ό ꡬνν΄μ£Όμ΄μΌ νμ΅λλ€.
μ°Έκ³ λ‘ κΈ°μ‘΄ λ§μ°μ€ μ΄λ²€νΈλ μλμ κ°μ΄ ꡬνλμμ΅λλ€!
λ§μ°μ€ μ΄λ²€νΈλ 1κ°μ ν¬μΈν°λ§ λ€λ£¨λ©΄ λκ³ , λ§μ°μ€μ μ΄λ, ν΄λ¦, ν μ΄λ²€νΈκ° λͺ νν ꡬλΆλκΈ° λλ¬Έμ μλμ μΌλ‘ κ°λ¨νμ΅λλ€.
λ§μ°μ€ μ΄λ²€νΈμ λ€λ₯΄κ² ν°μΉ μ΄λ²€νΈλ₯Ό ꡬννλ €λ©΄ λ§μ°μ€μ λ€λ₯Έ μ κ·Όμ΄ νμνκ³ , λ§μ°μ€ μ΄λ²€νΈμμ μ°¨μ΄λ₯Ό μμ±ν΄λ³΄μλ©΄ μλμ κ°μ΄ μ 리ν μ μμμ΅λλ€.
e.touches.length
)μ λ°λΌ λ‘μ§μ λΆκΈ° μ²λ¦¬ν΄μΌ νμ΅λλ€.κ·Έλμ μ λ ν°μΉ μ΄λ²€νΈλ₯Ό μΆκ°νκΈ° μν΄ μλμ κ°μ κ³Όμ μ κ±°μ³€μ΅λλ€.
ν°μΉ λμμ onTouchStart
, onTouchMove
, onTouchEnd
μ΄λ²€νΈλ‘ μ²λ¦¬ν μ μμ΅λλ€. μ΄λ₯Ό ν΅ν΄ ν°μΉ μμ, μμ§μ, μ’
λ£ μ νμν μνλ₯Ό μ
λ°μ΄νΈνλλ‘ κΈ°λ³Έ ꡬ쑰λ₯Ό μμ±νμ΅λλ€.
κ·Έλλ λ§μ°μ€λ³΄λ€ λ€νμΈ κ²μ, mouseMove μ΄λ²€νΈμμλ ν΄λ¦ν μνλ‘ μμ§μ΄λ κ²μΈμ§, κ·Έλ₯ ν΄λ¦λ§νκ³ λλλ κ²μΈμ§ λ±μ λΆλ₯ν΄μ£Όλ μμ μ΄ μ΄λ €μ λλ°,
ν°μΉ μ΄λ²€νΈλ μ μ΄μ ν°μΉλ₯Ό ν μνλ‘ μμ§μ΄λ μ΄λ²€νΈκ° touchMoveλ‘ μ‘΄μ¬νκΈ° λλ¬Έμ, ν°μΉλ μνλ‘ μμ§μ΄κ³ μλ 건μ§λ₯Ό λΆλ¦¬νλ λ‘μ§μ΄ νμμλ€λ μ₯μ μ΄ μμμ΅λλ€.
(κ°μΈμ μΌλ‘ λ§μ°μ€ μ΄λν λ μ΄ λ‘μ§ μ§λκ² κ°μ₯ μ΄λ ΅κ³ μ λ΅μ΄ μμλλ°, ν°μΉλ κ·Έλ¬μ§ μμλ λμ΄μ λ무 μ’μμ΅λλ€β¦..γ γ γ ,,,)
const handleTouchStart = (e: React.TouchEvent) => {
if (e.touches.length === 2) {
// λ μκ°λ½ ν°μΉ μμ
} else if (e.touches.length === 1) {
// ν μκ°λ½ ν°μΉ μμ
}
};
const handleTouchMove = (e: React.TouchEvent) => {
if (e.touches.length === 2) {
// λ μκ°λ½μΌλ‘ νλ/μΆμ
} else if (e.touches.length === 1) {
// ν μκ°λ½μΌλ‘ μ§λ μ΄λ
}
};
const handleTouchEnd = (e: React.TouchEvent) => {
// ν°μΉ μ’
λ£ μ μν μ΄κΈ°ν
};
λ¬Έμ :
ν΄κ²° λ°©λ²:
onTouchStart
) μμΉλ₯Ό μ μ₯ν λ€, ν°μΉκ° μμ§μ΄λ λμ(onTouchMove
)μ μ’νμ λΉκ΅ν΄ μ΄λ 거리λ₯Ό κ³μ°νμ΅λλ€.const handleTouchStart = (e: React.TouchEvent) => {
if (e.touches.length === 1) {
const rect = canvasRef.current?.getBoundingClientRect();
if (!rect) return;
setDragStartPos({
x: e.touches[0].clientX - rect.left,
y: e.touches[0].clientY - rect.top,
});
setIsTouching(true);
}
};
const handleTouchMove = (e: React.TouchEvent) => {
if (isTouching && e.touches.length === 1) {
const rect = canvasRef.current?.getBoundingClientRect();
if (!rect) return;
const newX = e.touches[0].clientX - rect.left;
const newY = e.touches[0].clientY - rect.top;
const deltaX = dragStartPos.x - newX;
const deltaY = dragStartPos.y - newY;
map?.panBy(new naver.maps.Point(deltaX, deltaY));
setDragStartPos({ x: newX, y: newY });
}
};
λ¬Έμ :
ν΄κ²° λ°©λ²:
zoomOrigin
)μΌλ‘ μ€μ .const handleTouchStart = (e: React.TouchEvent) => {
if (e.touches.length === 2) {
const distance = Math.sqrt(
Math.pow(e.touches[0].clientX - e.touches[1].clientX, 2) +
Math.pow(e.touches[0].clientY - e.touches[1].clientY, 2),
);
setTouchStartDistance(distance);
const centerX = (e.touches[0].clientX + e.touches[1].clientX) / 2;
const centerY = (e.touches[0].clientY + e.touches[1].clientY) / 2;
const mapCenter = map?.getProjection().fromContainerPixelToLatLng(
new naver.maps.Point(centerX, centerY),
);
setTouchCenter(mapCenter);
}
};
const handleTouchMove = (e: React.TouchEvent) => {
if (e.touches.length === 2 && touchStartDistance) {
const newDistance = Math.sqrt(
Math.pow(e.touches[0].clientX - e.touches[1].clientX, 2) +
Math.pow(e.touches[0].clientY - e.touches[1].clientY, 2),
);
const zoomChange = (newDistance - touchStartDistance) / 30; // λΉμ¨ μ‘°μ
const currentZoom = map?.getZoom() ?? 10;
map?.setOptions({ zoomOrigin: touchCenter });
map?.setZoom(currentZoom + zoomChange);
setTouchStartDistance(newDistance);
}
};
μ€ λΉμ¨ κ³μ°μμ 거리 μ°¨μ΄μ λ°λΌ μ€ λ³νλμ μ§μ λ°μνλλ νλ/μΆμκ° λ무 λ―Όκ°νκ² λ°μνμ΅λλ€. μ΄λ₯Ό ν΄κ²°νκΈ° μν΄ μ€μΌμΌλ§ λΉμ¨μ μ‘°μ νμ¬ μ€ λ³νλμ μ μ ν μ νν΄μ£Όκ³ μμ΅λλ€.
λ€λ§,,,, κ·Έ μκ³κ°μ΄ μλ²½νμ§ μκΈ°μ μμ§λ κ°μ ν΄μΌνλ λΆλΆ μ€ νλμ λλ€β¦β¦γ γ γ
λ μκ°λ½μ μ€μ¬μ κΈ°μ€μΌλ‘ μ€μ μ μ©νμ§λ§, μ€μ¬ μ’νκ° μλͺ» κ³μ°λμ΄ νλ©΄ λ°μΌλ‘ λ²μ΄λλ λ¬Έμ κ° μμμ΅λλ€.
μ΄λ₯Ό ν΄κ²°νκΈ° μν΄ μ§λ μ’ν λ³ν(fromContainerPixelToLatLng
)μ ν΅ν΄ μ νν μ€μ¬μ μ€μ ν΄μ£Όμμ΅λλ€.
ν°μΉ μ΄λ²€νΈλ λ§μ°μ€ μ΄λ²€νΈμ κΈ°λ³Έ μλ¦¬κ° λΉμ·νμ§λ§, λ©ν° ν¬μΈν°λ₯Ό μ²λ¦¬ν΄μΌ νλ€λ μ κ³Ό ν°μΉ λμμ μλλ₯Ό νμ ν΄μΌ νλ€λ μ μμ μΆκ°μ μΈ κ³ λ―Όμ΄ νμνμ΅λλ€.
νΉν λ μκ°λ½ μ€μ μ€μ¬μ μ νν κ³μ°νκ³ , λμμ μμ°μ€λ¬μμ μ μ§νλ κ²μ΄ κ°μ₯ ν° λμ κ³Όμ μμ΅λλ€.
λ§μ°μ€μμλ ν΄λ¦ν μνλ‘ μ΄λνλ κ²μ μΆμ νλκ² μ½μ§ μμλ€λ©΄, μ€νλ € ν°μΉμ΄λ²€νΈλ μ΄λμ΄ μλλΌ μ€μ μΌλ§λ ν μ§μ λν΄ μ νλ κ²μ΄ μ½μ§ μμλ κ² κ°μ΅λλ€.
νμ§λ§ κ²°λ‘ μ μΌλ‘ μλμ κ°μ΄ ꡬννκ³ , ν°μΉ μ΄λ²€νΈκ° μ λμνλ κ²λ νμΈν μ μμμ΅λλ€ γ
γ
(λ§μ½ μ΄λ―Έμ§κ° λ©μΆ°μλ€λ©΄, μ΄λ―Έμ§μμ μ€λ₯Έμͺ½ λ§μ°μ€ ν΄λ¦ ν μ νμμ μ΄λ―Έμ§ μ΄κΈ°λ‘ λ€μ΄κ°μ£ΌμΈμ... 벨λ‘κ·Έκ° gifλ₯Ό μ§μνμ§ μλκ°λ΄μ....)
(μ΄ λ μ§μ§ λ무 λΏλ―ν΄μ λ μκ°λ μ€ μμμ΄μ;; λ λ°μν λ¬Έμ λ λͺ¨λ₯Έμ±β¦)