天天看點

【WPF】擷取電磁筆的壓感

WPF 不僅支援觸控,也支援筆的輸入,比如現在比較高大上的電磁筆。便宜的闆子一般不配備電磁筆,而是配電容筆,雖然也号稱XXX級壓感,但是效果自然不可與電磁筆相比。

UIElement 類規範了UI元素的基本輪廓,在該類公開的事件中,大凡以 Stylus 開頭的事件,都與書寫筆有關。這裡大夥伴要注意一點,當筆尖按下螢幕時會發生 StylusDown 事件,但是,此時我們還不能夠得到筆的壓力值。

緊随其後就會發生 StylusMove 事件。筆按下後就會馬上引上這個事件,而且,隻要筆在螢幕上移動就會不斷引發這個事件,前提是你在移動筆尖時不能離開螢幕。如果筆尖提起,會發生 StylusUp 事件;筆尖提起後,處于懸空狀态,隻要筆還在感應範圍内,移動筆尖會發生 StylusInAirMove 事件。注意差別,筆尖按下時移動發生的是 StylusMove 事件,而懸空後移動會發生 StylusInAirMove 事件。

筆輸入的資料由 StylusPoint 結構來封裝,其中,X和Y相信你也猜到,就是筆尖的坐标,這點與滑鼠事件相似。不過,筆輸入的資料還帶有一個 PressureFactor 字段,對,重點就是它了,它表示筆的壓力。

不管你的筆是 256 級壓感,還是 1024 級 2048 級壓感,PressureFactor 字段值始終在 0 和 1 之間,它是個浮點數值,數字越小,表示壓力越小;反之表示壓力越大。

好了,經過老周上面一堆廢話,估計你也已經知道這活怎麼幹了。下面,還是老規矩,學習不幹活是不行的,是以,我們得動手,才能弄懂。

 首先,在視窗上放一個矩形。

<Grid Background="Transparent">
        <Rectangle Fill="Red" Name="rect" />
    </Grid>      

把這個矩形的填充顔色設為紅色,待會兒咱們感應電磁筆的壓力,動态調整矩形的透明度。壓力越大,矩形越紅,比那些網紅還要紅。

接着,處理相關事件。

<Rectangle Fill="Red" Name="rect"
                   StylusMove="OnStyluesMove"/>      

然後編寫處理代碼。

private void OnStyluesMove(object sender, StylusEventArgs e)
        {
            var pts = e.GetStylusPoints(null);
            foreach (var p in pts)
            {
                rect.Opacity = p.PressureFactor;
            }
        }      

因為筆尖在螢幕上移動時,可能一次會産生N個坐标,是以,GetStylusPoints方法傳回一個點的集合,這個方法在調用時,需要傳遞一個元素引用,用來作為參照對象,即,所擷取的坐标是相對于這個對象。此處用 null 表示擷取到的點是相對于根,如視窗。

由于筆尖的一次移動可能産生多個點,這裡我順便 foreach 了一下,其實,眼睛看到的最後一輪設定的值。因而你完全可以去掉這個 foreach ,在點集合中,隻取出一個點出來就行了(最後一個點)。我姑且保留 foreach ,大夥兒可以下載下傳源碼後,自行玩耍。

巧合的是,Opacity 屬性的值範圍是 0 到 1,PressureFactor 的值範圍也是 0 到 1,是以,直接指派就完事了,不用轉化計算。

最後運作程式,然後拿電磁筆狠狠地紮幾下視窗,你就能看到壓感的變化了。效果請參考下面的高清無碼無水印動圖。

【WPF】擷取電磁筆的壓感

好,今天就聊到這裡,see you。

示例源代碼下載下傳位址

繼續閱讀