delete:手掌擦
This commit is contained in:
@@ -689,7 +689,6 @@ namespace Ink_Canvas {
|
|||||||
private void BoardLassoIcon_Click(object sender, RoutedEventArgs e) {
|
private void BoardLassoIcon_Click(object sender, RoutedEventArgs e) {
|
||||||
forceEraser = false;
|
forceEraser = false;
|
||||||
forcePointEraser = false;
|
forcePointEraser = false;
|
||||||
isLastTouchEraser = false;
|
|
||||||
drawingShapeMode = 0;
|
drawingShapeMode = 0;
|
||||||
inkCanvas.EditingMode = InkCanvasEditingMode.Select;
|
inkCanvas.EditingMode = InkCanvasEditingMode.Select;
|
||||||
SetCursorBasedOnEditingMode(inkCanvas);
|
SetCursorBasedOnEditingMode(inkCanvas);
|
||||||
|
|||||||
@@ -1449,7 +1449,6 @@ namespace Ink_Canvas {
|
|||||||
bool isAlreadyEraser = inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint;
|
bool isAlreadyEraser = inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint;
|
||||||
forceEraser = false;
|
forceEraser = false;
|
||||||
forcePointEraser = true;
|
forcePointEraser = true;
|
||||||
isLastTouchEraser = false;
|
|
||||||
drawingShapeMode = 0;
|
drawingShapeMode = 0;
|
||||||
|
|
||||||
// 切换到橡皮擦模式时,确保保存当前图片信息
|
// 切换到橡皮擦模式时,确保保存当前图片信息
|
||||||
@@ -1489,7 +1488,6 @@ namespace Ink_Canvas {
|
|||||||
bool isAlreadyEraser = inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint;
|
bool isAlreadyEraser = inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint;
|
||||||
forceEraser = false;
|
forceEraser = false;
|
||||||
forcePointEraser = true;
|
forcePointEraser = true;
|
||||||
isLastTouchEraser = false;
|
|
||||||
drawingShapeMode = 0;
|
drawingShapeMode = 0;
|
||||||
|
|
||||||
// 启用新的高级橡皮擦系统
|
// 启用新的高级橡皮擦系统
|
||||||
|
|||||||
@@ -322,13 +322,9 @@ namespace Ink_Canvas {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void GridInkCanvasSelectionCover_ManipulationDelta(object sender, ManipulationDeltaEventArgs e) {
|
private void GridInkCanvasSelectionCover_ManipulationDelta(object sender, ManipulationDeltaEventArgs e) {
|
||||||
// 手掌擦时禁止移动/缩放
|
|
||||||
if (isLastTouchEraser || inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint)
|
|
||||||
return;
|
|
||||||
// 三指及以上禁止缩放
|
|
||||||
bool disableScale = dec.Count >= 3;
|
|
||||||
try {
|
try {
|
||||||
if (dec.Count >= 1) {
|
if (dec.Count >= 1) {
|
||||||
|
bool disableScale = dec.Count >= 3;
|
||||||
var md = e.DeltaManipulation;
|
var md = e.DeltaManipulation;
|
||||||
var trans = md.Translation; // 获得位移矢量
|
var trans = md.Translation; // 获得位移矢量
|
||||||
var rotate = md.Rotation; // 获得旋转角度
|
var rotate = md.Rotation; // 获得旋转角度
|
||||||
@@ -426,7 +422,6 @@ namespace Ink_Canvas {
|
|||||||
ExitMultiTouchModeIfNeeded();
|
ExitMultiTouchModeIfNeeded();
|
||||||
forceEraser = false;
|
forceEraser = false;
|
||||||
forcePointEraser = false;
|
forcePointEraser = false;
|
||||||
isLastTouchEraser = false;
|
|
||||||
drawingShapeMode = 0;
|
drawingShapeMode = 0;
|
||||||
inkCanvas.EditingMode = InkCanvasEditingMode.Select;
|
inkCanvas.EditingMode = InkCanvasEditingMode.Select;
|
||||||
SetCursorBasedOnEditingMode(inkCanvas);
|
SetCursorBasedOnEditingMode(inkCanvas);
|
||||||
@@ -436,7 +431,6 @@ namespace Ink_Canvas {
|
|||||||
ExitMultiTouchModeIfNeeded();
|
ExitMultiTouchModeIfNeeded();
|
||||||
forceEraser = false;
|
forceEraser = false;
|
||||||
forcePointEraser = false;
|
forcePointEraser = false;
|
||||||
isLastTouchEraser = false;
|
|
||||||
drawingShapeMode = 0;
|
drawingShapeMode = 0;
|
||||||
inkCanvas.EditingMode = InkCanvasEditingMode.Select;
|
inkCanvas.EditingMode = InkCanvasEditingMode.Select;
|
||||||
inkCanvas.IsManipulationEnabled = true;
|
inkCanvas.IsManipulationEnabled = true;
|
||||||
|
|||||||
@@ -113,7 +113,6 @@ namespace Ink_Canvas {
|
|||||||
// 否则只切换到批注模式,不弹出子面板
|
// 否则只切换到批注模式,不弹出子面板
|
||||||
forceEraser = false;
|
forceEraser = false;
|
||||||
forcePointEraser = false;
|
forcePointEraser = false;
|
||||||
isLastTouchEraser = false;
|
|
||||||
drawingShapeMode = 0;
|
drawingShapeMode = 0;
|
||||||
penType = 0;
|
penType = 0;
|
||||||
drawingAttributes.IsHighlighter = false;
|
drawingAttributes.IsHighlighter = false;
|
||||||
@@ -379,25 +378,10 @@ namespace Ink_Canvas {
|
|||||||
SetCursorBasedOnEditingMode(inkCanvas);
|
SetCursorBasedOnEditingMode(inkCanvas);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 如果处于手掌擦状态,继续使用相同的橡皮形状
|
|
||||||
if (isLastTouchEraser && currentPalmEraserShape != null) {
|
|
||||||
inkCanvas.EraserShape = currentPalmEraserShape;
|
|
||||||
inkCanvas.EditingMode = InkCanvasEditingMode.EraseByPoint;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (isSingleFingerDragMode) return;
|
|
||||||
|
|
||||||
// 处理几何绘制模式
|
// 处理几何绘制模式
|
||||||
if (drawingShapeMode != 0) {
|
if (drawingShapeMode != 0) {
|
||||||
if (isLastTouchEraser) return;
|
|
||||||
//EraserContainer.Background = null;
|
|
||||||
//ImageEraser.Visibility = Visibility.Visible;
|
|
||||||
// 修复触屏状态下几何绘制功能不可用的问题
|
|
||||||
// 在几何绘制模式下,即使isWaitUntilNextTouchDown为true,也应该处理触摸移动事件
|
|
||||||
// 只有当多点触控时才需要等待下一次触摸
|
|
||||||
if (isWaitUntilNextTouchDown && dec.Count > 1) return;
|
if (isWaitUntilNextTouchDown && dec.Count > 1) return;
|
||||||
if (dec.Count > 1) {
|
if (dec.Count > 1) {
|
||||||
isWaitUntilNextTouchDown = true;
|
|
||||||
try {
|
try {
|
||||||
inkCanvas.Strokes.Remove(lastTempStroke);
|
inkCanvas.Strokes.Remove(lastTempStroke);
|
||||||
inkCanvas.Strokes.Remove(lastTempStrokeCollection);
|
inkCanvas.Strokes.Remove(lastTempStrokeCollection);
|
||||||
@@ -1653,7 +1637,6 @@ namespace Ink_Canvas {
|
|||||||
private void EnterShapeDrawingMode(int mode) {
|
private void EnterShapeDrawingMode(int mode) {
|
||||||
forceEraser = true;
|
forceEraser = true;
|
||||||
forcePointEraser = false;
|
forcePointEraser = false;
|
||||||
isLastTouchEraser = false;
|
|
||||||
drawingShapeMode = mode;
|
drawingShapeMode = mode;
|
||||||
inkCanvas.EditingMode = InkCanvasEditingMode.None;
|
inkCanvas.EditingMode = InkCanvasEditingMode.None;
|
||||||
SetCursorBasedOnEditingMode(inkCanvas);
|
SetCursorBasedOnEditingMode(inkCanvas);
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ namespace Ink_Canvas {
|
|||||||
#region Multi-Touch
|
#region Multi-Touch
|
||||||
|
|
||||||
private bool isInMultiTouchMode = false;
|
private bool isInMultiTouchMode = false;
|
||||||
private InkCanvasEditingMode prePalmEraserEditingMode = InkCanvasEditingMode.Ink;
|
|
||||||
private List<int> dec = new List<int>();
|
private List<int> dec = new List<int>();
|
||||||
private bool isSingleFingerDragMode = false;
|
private bool isSingleFingerDragMode = false;
|
||||||
private Point centerPoint = new Point(0, 0);
|
private Point centerPoint = new Point(0, 0);
|
||||||
@@ -35,16 +34,8 @@ namespace Ink_Canvas {
|
|||||||
inkCanvas.Children.Clear();
|
inkCanvas.Children.Clear();
|
||||||
isInMultiTouchMode = false;
|
isInMultiTouchMode = false;
|
||||||
|
|
||||||
// 退出多指书写模式后,恢复手掌擦功能
|
|
||||||
// 这里不需要特别操作,因为设置了isInMultiTouchMode = false后,
|
|
||||||
// 下次触发Main_Grid_TouchDown时会自动判断并启用手掌擦功能
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// 进入多指书写模式前,如果当前处于手掌擦状态,先关闭手掌擦
|
|
||||||
if (isLastTouchEraser) {
|
|
||||||
isLastTouchEraser = false;
|
|
||||||
currentPalmEraserShape = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
inkCanvas.StylusDown += MainWindow_StylusDown;
|
inkCanvas.StylusDown += MainWindow_StylusDown;
|
||||||
inkCanvas.StylusMove += MainWindow_StylusMove;
|
inkCanvas.StylusMove += MainWindow_StylusMove;
|
||||||
@@ -69,33 +60,11 @@ namespace Ink_Canvas {
|
|||||||
HideSubPanels(); // 书写时自动隐藏二级菜单
|
HideSubPanels(); // 书写时自动隐藏二级菜单
|
||||||
}
|
}
|
||||||
|
|
||||||
double boundWidth = e.GetTouchPoint(null).Bounds.Width, eraserMultiplier = 1.0;
|
// 只保留普通橡皮逻辑
|
||||||
if (!Settings.Advanced.EraserBindTouchMultiplier && Settings.Advanced.IsSpecialScreen)
|
TouchDownPointsList[e.TouchDevice.Id] = InkCanvasEditingMode.None;
|
||||||
eraserMultiplier = 1 / Settings.Advanced.TouchMultiplier;
|
inkCanvas.EraserShape = new EllipseStylusShape(50, 50);
|
||||||
if ((Settings.Advanced.TouchMultiplier != 0 || !Settings.Advanced.IsSpecialScreen)) //启用特殊屏幕且触摸倍数为 0 时禁用橡皮
|
if (inkCanvas.EditingMode != InkCanvasEditingMode.EraseByPoint) {
|
||||||
|
inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
|
||||||
|
|
||||||
// 修复:只有多指且面积大时才允许手掌擦,单指始终为批注
|
|
||||||
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)}");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -219,37 +188,6 @@ namespace Ink_Canvas {
|
|||||||
private int lastTouchDownTime = 0, lastTouchUpTime = 0;
|
private int lastTouchDownTime = 0, lastTouchUpTime = 0;
|
||||||
|
|
||||||
private Point iniP = new Point(0, 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) {
|
private void Main_Grid_TouchDown(object sender, TouchEventArgs e) {
|
||||||
SetCursorBasedOnEditingMode(inkCanvas);
|
SetCursorBasedOnEditingMode(inkCanvas);
|
||||||
@@ -346,34 +284,6 @@ namespace Ink_Canvas {
|
|||||||
dec.Remove(e.TouchDevice.Id);
|
dec.Remove(e.TouchDevice.Id);
|
||||||
inkCanvas.Opacity = 1;
|
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 (dec.Count == 0)
|
||||||
if (lastTouchDownStrokeCollection.Count() != inkCanvas.Strokes.Count() &&
|
if (lastTouchDownStrokeCollection.Count() != inkCanvas.Strokes.Count() &&
|
||||||
!(drawingShapeMode == 9 && !isFirstTouchCuboid)) {
|
!(drawingShapeMode == 9 && !isFirstTouchCuboid)) {
|
||||||
@@ -391,7 +301,6 @@ namespace Ink_Canvas {
|
|||||||
|
|
||||||
private void Main_Grid_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e) {
|
private void Main_Grid_ManipulationCompleted(object sender, ManipulationCompletedEventArgs e) {
|
||||||
if (e.Manipulators.Count() != 0) return;
|
if (e.Manipulators.Count() != 0) return;
|
||||||
if (forceEraser) return;
|
|
||||||
if (inkCanvas.EditingMode != InkCanvasEditingMode.EraseByPoint) {
|
if (inkCanvas.EditingMode != InkCanvasEditingMode.EraseByPoint) {
|
||||||
inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
|
inkCanvas.EditingMode = InkCanvasEditingMode.Ink;
|
||||||
}
|
}
|
||||||
@@ -399,7 +308,7 @@ namespace Ink_Canvas {
|
|||||||
|
|
||||||
private void Main_Grid_ManipulationDelta(object sender, ManipulationDeltaEventArgs e) {
|
private void Main_Grid_ManipulationDelta(object sender, ManipulationDeltaEventArgs e) {
|
||||||
// 手掌擦时禁止移动/缩放
|
// 手掌擦时禁止移动/缩放
|
||||||
if (isLastTouchEraser || inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint)
|
if (inkCanvas.EditingMode == InkCanvasEditingMode.EraseByPoint)
|
||||||
return;
|
return;
|
||||||
// 三指及以上禁止缩放
|
// 三指及以上禁止缩放
|
||||||
bool disableScale = dec.Count >= 3;
|
bool disableScale = dec.Count >= 3;
|
||||||
|
|||||||
Reference in New Issue
Block a user