动态改变描边颜色
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)。我发现它可以正确显示压力值,但不会改变墨水颜色。以上是关于动态改变描边颜色的主要内容,如果未能解决你的问题,请参考以下文章