动态改变描边颜色

Posted

技术标签:

【中文标题】动态改变描边颜色【英文标题】:Changing stroke color dynamically 【发布时间】:2011-10-19 05:43:47 【问题描述】:

我正在使用手写笔输入在画布中绘制线条。我想用笔压改变笔触的颜色。所以我用了:

DrawingAttributes dattribute = new DrawingAttributes();
inkcan.EditingMode = InkCanvasEditingMode.Ink;

if (stylusInput.pressureFactor < 0.5)
dattribute.Color = Colors.Red;
else
dattribute.Color = Colors.Blue;

inkcan.DefaultDrawingAttributes = dattribute;

但我发现只有当我抬起笔并将笔重新接触到数位板表面时,颜色才会发生变化。我不知道如何解决这个问题。

任何帮助将不胜感激。

【问题讨论】:

条件是什么方法? 我在 keyup 事件中添加这些代码 你为什么不把它放在钥匙里? 我刚试过按下键,但有同样的问题。只有当我拿起笔并重新引入数位板时,颜色才会改变。它不会随压力动态变化。 【参考方案1】:

看这个问题:InkCanvas Eraser

在 MSDN 中它指出:

如果更改 EraserShape,则在 InkCanvas 上呈现的光标为 在下一次 EditingMode 更改之前不会更新。

您遇到的效果可能是由于当您将笔从画布上拉下并放回时更改了 EditingMode。

如果是这样,您可以按照我在链接答案中的建议切换 EditingMode 属性。

编辑

有一个look at this 3rd 说:

当然,生活从来没有这么简单,所以还有一个 小问题要处理。显然,InkCanvas 使用不同的 最终结果的渲染器与笔画进行时相比 画。根据压力显示透明度,同时 绘图动作仍在进行中,我们需要使用受保护的 名为 DynamicRenderer 的属性,它获取/设置用于 在描边时在绘图上下文上渲染描边 画。此渲染对象必须是 DynamicRenderer 的后代。 您需要做的就是覆盖 OnDraw 方法并更改 使用的刷子。当您为此属性分配新值时, InkCanvas 实际上改变了一个内部的“插件列表”,它被称为 每当使用触控笔输入数据时。

可能是这个。

【讨论】:

我认为你的答案是我的问题的正确答案。我试过你的代码,但它不能正常工作。当我重置 EditingMode 时,它​​不会在画布中显示任何墨水(笔/颜色/绘图)。我需要拿起我的笔,然后它再次显示墨水。我正在使用以下代码: var editMode = inkcan.EditingMode; inkcan.EditingMode = InkCanvasEditingMode.None; inkcan.EditingMode = editMode; @MKS,您是否像这样更改这些行之间的颜色: var editMode = inkcan.EditingMode; inkcan.EditingMode = InkCanvasEditingMode.None; dattribute.Color = 颜色.蓝色; inkcan.EditingMode = editMode; 是的......那些工作正常(压力值),但唯一的问题是颜色不会随压力值而变化。如果我拿起笔并重新引入平板电脑表面,那么它只会起作用。【参考方案2】:

if 条件只计算一次,因此在绘制时没有理由改变颜色。不幸的是,似乎没有“onpressurechanged”事件,因此您可能必须设置一个循环,每 x 毫秒检查一次压力并相应地调整颜色。 由于您不想冻结 UI,您需要在另一个线程中运行它并将颜色更改委托回 UI 线程,或者您可以将压力检查排队到具有“applicationIdle”优先级的窗口调度程序上。这看起来像:

void checkPressure(InkCanvas inkcan)

//return if touch is lifted code here

DrawingAttributes dattribute = new DrawingAttributes();
if (stylusInput.pressureFactor < 0.5)
dattribute.Color = Colors.Red;
else
dattribute.Color = Colors.Blue;
inkcan.DefaultDrawingAttributes = dattribute;
this.Dispatcher.BeginInvoke(new MyPressureDelegate(checkPressure), DispatcherPriority.ApplicationIdle, inkcan);

当然,假设您的 stylusInput 与函数共享范围。否则,您需要将它与对象数组中的画布一起传递。

【讨论】:

我已经有一个名为 updateState() 的方法,当任何类型的触控笔移动时(StylusMove、StylusDown、StylusUp)我都会调用该方法。我将我的代码放在该方法下并检查它是否获得正确的压力值(低于或高于 0.5)。我发现它可以正确显示压力值,但不会改变墨水颜色。

以上是关于动态改变描边颜色的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Skia Sharp 添加矩形并将填充颜色和描边颜色应用于该对象?

用一种颜色作为描边绘制一个多边形,用另一种颜色作为填充?

通过 CSS 更改 svg 的描边颜色

UILabel设置背景色/阴影/描边

怎样设置路径的边框(描边)颜色

photoshop画一个有颜色的矩形?