delete:手掌擦

This commit is contained in:
2025-07-23 22:57:16 +08:00
parent 271829f9c1
commit 044df3f09c
5 changed files with 7 additions and 124 deletions
@@ -689,7 +689,6 @@ namespace Ink_Canvas {
private void BoardLassoIcon_Click(object sender, RoutedEventArgs e) {
forceEraser = false;
forcePointEraser = false;
isLastTouchEraser = false;
drawingShapeMode = 0;
inkCanvas.EditingMode = InkCanvasEditingMode.Select;
SetCursorBasedOnEditingMode(inkCanvas);
@@ -1449,7 +1449,6 @@ namespace Ink_Canvas {
bool isAlreadyEraser = inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint;
forceEraser = false;
forcePointEraser = true;
isLastTouchEraser = false;
drawingShapeMode = 0;
// 切换到橡皮擦模式时,确保保存当前图片信息
@@ -1489,7 +1488,6 @@ namespace Ink_Canvas {
bool isAlreadyEraser = inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint;
forceEraser = false;
forcePointEraser = true;
isLastTouchEraser = false;
drawingShapeMode = 0;
// 启用新的高级橡皮擦系统
@@ -322,13 +322,9 @@ namespace Ink_Canvas {
}
private void GridInkCanvasSelectionCover_ManipulationDelta(object sender, ManipulationDeltaEventArgs e) {
// 手掌擦时禁止移动/缩放
if (isLastTouchEraser || inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint)
return;
// 三指及以上禁止缩放
bool disableScale = dec.Count >= 3;
try {
if (dec.Count >= 1) {
bool disableScale = dec.Count >= 3;
var md = e.DeltaManipulation;
var trans = md.Translation; // 获得位移矢量
var rotate = md.Rotation; // 获得旋转角度
@@ -426,7 +422,6 @@ namespace Ink_Canvas {
ExitMultiTouchModeIfNeeded();
forceEraser = false;
forcePointEraser = false;
isLastTouchEraser = false;
drawingShapeMode = 0;
inkCanvas.EditingMode = InkCanvasEditingMode.Select;
SetCursorBasedOnEditingMode(inkCanvas);
@@ -436,7 +431,6 @@ namespace Ink_Canvas {
ExitMultiTouchModeIfNeeded();
forceEraser = false;
forcePointEraser = false;
isLastTouchEraser = false;
drawingShapeMode = 0;
inkCanvas.EditingMode = InkCanvasEditingMode.Select;
inkCanvas.IsManipulationEnabled = true;
@@ -113,7 +113,6 @@ namespace Ink_Canvas {
// 否则只切换到批注模式,不弹出子面板
forceEraser = false;
forcePointEraser = false;
isLastTouchEraser = false;
drawingShapeMode = 0;
penType = 0;
drawingAttributes.IsHighlighter = false;
@@ -379,25 +378,10 @@ namespace Ink_Canvas {
SetCursorBasedOnEditingMode(inkCanvas);
}
// 如果处于手掌擦状态,继续使用相同的橡皮形状
if (isLastTouchEraser && currentPalmEraserShape != null) {
inkCanvas.EraserShape = currentPalmEraserShape;
inkCanvas.EditingMode = InkCanvasEditingMode.EraseByPoint;
return;
}
if (isSingleFingerDragMode) return;
// 处理几何绘制模式
if (drawingShapeMode != 0) {
if (isLastTouchEraser) return;
//EraserContainer.Background = null;
//ImageEraser.Visibility = Visibility.Visible;
// 修复触屏状态下几何绘制功能不可用的问题
// 在几何绘制模式下,即使isWaitUntilNextTouchDown为true,也应该处理触摸移动事件
// 只有当多点触控时才需要等待下一次触摸
if (isWaitUntilNextTouchDown && dec.Count > 1) return;
if (dec.Count > 1) {
isWaitUntilNextTouchDown = true;
try {
inkCanvas.Strokes.Remove(lastTempStroke);
inkCanvas.Strokes.Remove(lastTempStrokeCollection);
@@ -1653,7 +1637,6 @@ namespace Ink_Canvas {
private void EnterShapeDrawingMode(int mode) {
forceEraser = true;
forcePointEraser = false;
isLastTouchEraser = false;
drawingShapeMode = mode;
inkCanvas.EditingMode = InkCanvasEditingMode.None;
SetCursorBasedOnEditingMode(inkCanvas);
+6 -97
View File
@@ -16,7 +16,6 @@ namespace Ink_Canvas {
#region Multi-Touch
private bool isInMultiTouchMode = false;
private InkCanvasEditingMode prePalmEraserEditingMode = InkCanvasEditingMode.Ink;
private List<int> dec = new List<int>();
private bool isSingleFingerDragMode = false;
private Point centerPoint = new Point(0, 0);
@@ -35,16 +34,8 @@ namespace Ink_Canvas {
inkCanvas.Children.Clear();
isInMultiTouchMode = false;
// 退出多指书写模式后,恢复手掌擦功能
// 这里不需要特别操作,因为设置了isInMultiTouchMode = false后,
// 下次触发Main_Grid_TouchDown时会自动判断并启用手掌擦功能
}
else {
// 进入多指书写模式前,如果当前处于手掌擦状态,先关闭手掌擦
if (isLastTouchEraser) {
isLastTouchEraser = false;
currentPalmEraserShape = null;
}
inkCanvas.StylusDown += MainWindow_StylusDown;
inkCanvas.StylusMove += MainWindow_StylusMove;
@@ -69,33 +60,11 @@ namespace Ink_Canvas {
HideSubPanels(); // 书写时自动隐藏二级菜单
}
double boundWidth = e.GetTouchPoint(null).Bounds.Width, eraserMultiplier = 1.0;
if (!Settings.Advanced.EraserBindTouchMultiplier && Settings.Advanced.IsSpecialScreen)
eraserMultiplier = 1 / Settings.Advanced.TouchMultiplier;
if ((Settings.Advanced.TouchMultiplier != 0 || !Settings.Advanced.IsSpecialScreen)) //启用特殊屏幕且触摸倍数为 0 时禁用橡皮
// 修复:只有多指且面积大时才允许手掌擦,单指始终为批注
if (dec != null && dec.Count >= 2 && (Settings.Advanced.TouchMultiplier != 0 || !Settings.Advanced.IsSpecialScreen)
&& boundWidth > BoundsWidth * 2.5) {
if (drawingShapeMode == 0 && forceEraser) return;
currentPalmEraserShape = GetPalmRectangleEraserShape(eraserMultiplier);
inkCanvas.EraserShape = currentPalmEraserShape;
TouchDownPointsList[e.TouchDevice.Id] = InkCanvasEditingMode.EraseByPoint;
isLastTouchEraser = true;
if (inkCanvas.EditingMode != InkCanvasEditingMode.EraseByPoint) {
inkCanvas.EditingMode = InkCanvasEditingMode.EraseByPoint;
}
Trace.WriteLine($"[PalmEraser] 触发手掌擦: TouchId={e.TouchDevice.Id}, boundWidth={boundWidth:F2}, eraserMultiplier={eraserMultiplier:F2}, EraserShape={currentPalmEraserShape?.GetType().Name}, TouchCount={dec.Count}");
}
else {
TouchDownPointsList[e.TouchDevice.Id] = InkCanvasEditingMode.None;
// 修复面积擦时不显示橡皮形状:无论 forcePointEraser 状态,均显示 50x50 橡皮
inkCanvas.EraserShape = new EllipseStylusShape(50, 50);
if (inkCanvas.EditingMode != InkCanvasEditingMode.EraseByPoint) {
inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
}
Trace.WriteLine($"[PalmEraser] 非手掌擦: TouchId={e.TouchDevice.Id}, boundWidth={boundWidth:F2}, eraserMultiplier={eraserMultiplier:F2}, TouchCount={(dec != null ? dec.Count : 0)}");
// 只保留普通橡皮逻辑
TouchDownPointsList[e.TouchDevice.Id] = InkCanvasEditingMode.None;
inkCanvas.EraserShape = new EllipseStylusShape(50, 50);
if (inkCanvas.EditingMode != InkCanvasEditingMode.EraseByPoint) {
inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
}
}
@@ -219,37 +188,6 @@ namespace Ink_Canvas {
private int lastTouchDownTime = 0, lastTouchUpTime = 0;
private Point iniP = new Point(0, 0);
private bool isLastTouchEraser = false;
// 用于记录手掌擦的尺寸和形状
private StylusShape currentPalmEraserShape = null;
/// <summary>
/// 根据用户在设置面板中选择的橡皮大小,生成"手掌橡皮"默认的矩形黑板擦形状。
/// 该形状大小不随触控面积等实时变化,仅受设置的橡皮大小影响。
/// </summary>
/// <param name="multiplier">特殊屏幕触摸倍数修正系数</param>
/// <returns>RectangleStylusShape</returns>
private StylusShape GetPalmRectangleEraserShape(double multiplier = 1.0) {
double k = 1;
switch (Settings.Canvas.EraserSize) {
case 0:
k = 0.5;
break;
case 1:
k = 0.8;
break;
case 3:
k = 1.25;
break;
case 4:
k = 1.5;
break;
}
// 参照圆形橡皮 k*90 的基准,将矩形宽度压缩到 0.6,保持高度一致
double baseLen = k * 90 * multiplier;
return new RectangleStylusShape(baseLen * 0.6, baseLen);
}
private void Main_Grid_TouchDown(object sender, TouchEventArgs e) {
SetCursorBasedOnEditingMode(inkCanvas);
@@ -346,34 +284,6 @@ namespace Ink_Canvas {
dec.Remove(e.TouchDevice.Id);
inkCanvas.Opacity = 1;
// 如果是手掌触发的面积擦抬起,需要确保橡皮擦形状被正确重置
if (isLastTouchEraser && dec.Count == 0) {
isLastTouchEraser = false;
currentPalmEraserShape = null; // 清除保存的手掌擦形状
// 当手掌擦消失时,恢复到之前的编辑模式
if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint) {
// 根据之前的编辑模式模拟点击相应的选项卡
if (prePalmEraserEditingMode == InkCanvasEditingMode.Ink) {
// 模拟点击批注选项卡
PenIcon_Click(null, null);
HideSubPanels("pen", true); // 新增:确保高光切换
} else if (prePalmEraserEditingMode == InkCanvasEditingMode.None ||
prePalmEraserEditingMode == InkCanvasEditingMode.Select) {
// 模拟点击光标选项卡
CursorIcon_Click(null, null);
HideSubPanels("cursor", true); // 新增:确保高光切换
} else {
// 其他编辑模式时恢复之前的模式
inkCanvas.EditingMode = prePalmEraserEditingMode;
if (forcePointEraser) {
// 重新应用当前设置的橡皮擦形状
ApplyCurrentEraserShape();
}
}
}
}
if (dec.Count == 0)
if (lastTouchDownStrokeCollection.Count() != inkCanvas.Strokes.Count() &&
!(drawingShapeMode == 9 && !isFirstTouchCuboid)) {
@@ -391,7 +301,6 @@ namespace Ink_Canvas {
private void Main_Grid_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e) {
if (e.Manipulators.Count() != 0) return;
if (forceEraser) return;
if (inkCanvas.EditingMode != InkCanvasEditingMode.EraseByPoint) {
inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
}
@@ -399,7 +308,7 @@ namespace Ink_Canvas {
private void Main_Grid_ManipulationDelta(object sender, ManipulationDeltaEventArgs e) {
// 手掌擦时禁止移动/缩放
if (isLastTouchEraser || inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint)
if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint)
return;
// 三指及以上禁止缩放
bool disableScale = dec.Count >= 3;