zoukankan      html  css  js  c++  java
  • 使用Win2D在UWP程序中2D绘图(二)

    绘制API

    首先还是看一下前文的的示例:

        args.DrawingSession.DrawEllipse(155, 115, 80, 30, Colors.Black, 3);
        args.DrawingSession.DrawText("Hello, world!", 100, 100, Colors.Yellow);

    它使用了DrawingSesion下发绘制命令,和WPF中的DrawingContext差不多,就是一个绘制上下文。它主要的命令分为如下两种:DrawXXX和FillXXX。DrawXXX只是绘制图像,而FillXXX只填充图像,这里和WPF那种绘制和填充在一个API里的方式稍稍有点不同。

    由于API并不多,这里列举了一下,基本上看着就知道怎么用了。

    • DrawCircle
    • DrawCachedGeometry
    • DrawEllipse
    • DrawGeometry
    • DrawImage
    • DrawInk
    • DrawLine
    • DrawRectangle
    • DrawRoundedRectangle
    • DrawText。
    • DrawTextLayout

     

    • FillCircle
    • FillEllipse
    • FillGeometry
    • FillRectangle
    • FillRoundedRectangle

    它的API还比较简单,基本上看着就知道怎么用,不过其中的DrawImage能传入一个IcanvasImage类型,而这个类型并不仅仅是图片,包括下面介绍的CanvasCommandList和Effect都是这种类型,使用的时候需要熟悉一下。

     

    2D转换

    2D绘图的过程中往往还伴随着一些平移,旋转等2D转换的操作,DrawingSession中提供了一个Transform属性可以传入一个3*2矩阵实现2D转换。

        var ds = args.DrawingSession;

        ds.Transform = Matrix3x2.CreateTranslation(new Vector2(200, 100));
        ds.DrawText("A", 0, 0, Colors.White);

        ds.Transform *= Matrix3x2.CreateRotation(12, new Vector2(200,80));
        ds.DrawText("B", 0, 0, Colors.White);

    CanvasCommandList

    CanvasCommandList可以缓存一组绘制命令,然后统一绘制。它可以用于分块绘制,也可以用于减少重复绘制。

        var renderTarget = new CanvasCommandList(sender);
        using (var clds = renderTarget.CreateDrawingSession())
        {
            clds.DrawEllipse(155, 115, 80, 30, Colors.Black, 3);
            clds.DrawText("Hello, world!", 100, 100, Colors.Yellow);
        }

        args.DrawingSession.DrawImage(renderTarget);

    滤镜效果

    Win2D的一个比较给力的特性就是支持滤镜特效,用它可以非常方便的实现常用的模糊、阴影等效果,这里以高斯模糊为例修改下上面的效果。

        var cmdList = new CanvasCommandList(sender);
        using (var clds = cmdList.CreateDrawingSession())
        {
            clds.DrawEllipse(155, 115, 80, 30, Colors.Black, 3);
            clds.DrawText("Hello, world!", 100, 100, Colors.Yellow);
        }

        var effect = new GaussianBlurEffect();
        effect.Source = cmdList;

        args.DrawingSession.DrawImage(effect);

    系统还内置了许多常用的滤镜效果,它们都以Effect结尾,放在Microsoft.Graphics.Canvas.Effects名字空间下。

     

    绘制事件

    除了前面用到的绘制的时候触发绘制操作的Draw事件外,还有一个比较常用的事件CreateResource,它在最开始加载控件的时候触发,往往用于初始化各种资源。

    另外再来看看Draw事件的触发条件,它基本上和WPF的OnRender差不多,也就是说,一般在初次加载时会触发,改变窗口大小的时候会触发,拖动窗口时不会触发。如果要在后台控制其重绘也比较简单,但用其Invalidate方法即可。

     

     

  • 相关阅读:
    RFC3489 STUN之客户端所处环境探测流程与部分属性含义说明
    视频直播中用户连麦技术模型与特点分析
    基于网络流量统计与反馈实现边缘机房间媒体流流量调度的一种思路
    基于Flash与window平台本地程序通信实现媒体流发布
    基于Flash ActionScript 实现RTMP发布与播放媒本流
    DirectShow音频采集声音不连续问题分析与解决办法经验总结
    一种高性能与高可用的流媒体系统之媒体流状态管理方法
    复用TCP连接提升流媒体服务器之间流量转发效率
    基于块流协议保证音频优先发送
    LibRTMP优化之调整输出块大小
  • 原文地址:https://www.cnblogs.com/TianFang/p/4738042.html
Copyright © 2011-2022 走看看