自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何在iOS設(shè)備上捕捉用戶簽名

移動開發(fā) iOS
Square Engineering Blog 上有一篇很棒的文章,為 Android 帶來了更流暢的簽名,但我沒有找到任何與 iOS 相關(guān)的介紹。所以,在 iOS 設(shè)備上捕捉用戶簽名的最好方式是什么呢?

Square Engineering Blog 上有一篇很棒的文章,為 Android 帶來了更流暢的簽名,但我沒有找到任何與 iOS 相關(guān)的介紹。所以,在 iOS 設(shè)備上捕捉用戶簽名的***方式是什么呢?

雖然我沒有找到關(guān)于簽名捕捉的文章,但 App Store 上已有一些應(yīng)用很好地實現(xiàn)了簽名捕捉。我的目標(biāo)用戶體驗是達(dá)到 iPad 應(yīng)用 Paper by 53 那樣的效果(它是一個繪圖應(yīng)用,有著漂亮且***響應(yīng)性的筆刷)。

本文所有的代碼都可以在 Github 倉庫 SignatureDemo 里找到。

點點相連

rgegfhrthr652d6469616772616d2d6c696e65732e706e67

最簡單的方式是捕捉用戶的觸摸點并用直線將它們連接在一起。

在 UIView 子類的初始化方法中,創(chuàng)建一個 path ,以及用于捕捉觸摸事件的手勢識別器。

  1. // 創(chuàng)建一個 path 以連接各點 
  2. path = [UIBezierPath bezierPath]; 
  3.   
  4. // 捕捉觸摸 
  5. UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)]; 
  6. pan.maximumNumberOfTouches = pan.minimumNumberOfTouches = 1; 
  7. [self addGestureRecognizer:pan]; 

捕捉 pan 手勢的觸摸點,并通過連線將其放入 bézier path 里:

  1. - (void)pan:(UIPanGestureRecognizer *)pan { 
  2.     CGPoint currentPoint = [pan locationInView:self]; 
  3.   
  4.     if (pan.state == UIGestureRecognizerStateBegan) { 
  5.         [path moveToPoint:currentPoint]; 
  6.     } else if (pan.state == UIGestureRecognizerStateChanged) 
  7.         [path addLineToPoint:currentPoint]; 
  8.   
  9.     [self setNeedsDisplay]; 

畫出 path:

  1. - (void)drawRect:(CGRect)rect 
  2.     [[UIColor blackColor] setStroke]; 
  3.     [path stroke]; 

sdvgrhgrthrth2d6c65747465722d6a2e706e67

上圖是用這種技術(shù)畫出的字母 “J” ,它也揭示了一些問題:在較慢的速度下, iOS 可以捕捉到足夠多的觸摸點,因此看起來較平滑,但稍快的移動就會導(dǎo)致觸摸點之間較大的間距,簽名看起來就是一些直線段相連。

2012 年的 Apple 開發(fā)者大會有一個 session 叫做 創(chuàng)建高級手勢識別器,它用了一點數(shù)學(xué)來解決此問題。

二次貝塞爾曲線

trhrehrthrtr616472617469632e706e67

作為用線段連接各觸摸點的代替,我們改用二次貝塞爾曲線來連接這些點,使用前述的 WWDC session 上討論的技術(shù)(定位到 42 分 15 秒)。用二次貝塞爾曲線來連接觸摸點,使用觸摸點作為控制點以及中間點作為起點和終點。

添加二次曲線到之前的代碼里要求存儲前一個觸摸點,所以要添加一個實例變量:

  1. CGPoint previousPoint; 

并創(chuàng)建一個函數(shù)來計算兩點的中間點:

  1. static CGPoint midpoint(CGPoint p0, CGPoint p1) { 
  2.     return (CGPoint) { 
  3.         (p0.x + p1.x) / 2.0, 
  4.         (p0.y + p1.y) / 2.0 
  5.     }; 

再更新 pan 手勢處理器,用二次曲線替換直線:

  1. - (void)pan:(UIPanGestureRecognizer *)pan { 
  2.     CGPoint currentPoint = [pan locationInView:self]; 
  3.     CGPoint midPoint = midpoint(previousPoint, currentPoint); 
  4.   
  5.     if (pan.state == UIGestureRecognizerStateBegan) { 
  6.         [path moveToPoint:currentPoint]; 
  7.     } else if (pan.state == UIGestureRecognizerStateChanged) { 
  8.         [path addQuadCurveToPoint:midPoint controlPoint:previousPoint]; 
  9.     } 
  10.   
  11.     previousPoint = currentPoint; 
  12.   
  13.     [self setNeedsDisplay]; 
  14.  
  15. grefbd6a2d7175616472617469632e706e67 

grefbd6a2d7175616472617469632e706e67

并沒有改寫太多代碼,但我們已經(jīng)看到了巨大的不同。觸摸點不再可見,但對于捕捉簽名來說,它依然有些乏味。每個曲線都是同樣的寬度,這不符合實際用鋼筆簽名的感覺。

可變的線寬

基于觸摸速度,寬度可變,這樣就能創(chuàng)建出更加自然的筆畫。 UIPanGestureRecognizer 已經(jīng)包含有一個叫做 velocityInView: 的方法,它用一個 CGPoint 返回當(dāng)前觸摸的速度。

為了渲染出一個可變寬度的筆畫,我切換到 OpenGL ES 和一個能轉(zhuǎn)換筆畫為三角形(具體說來,是三角帶(triangle strip))的叫做鑲嵌(tesselation)的技術(shù)(OpenGL 支持畫線,但 iOS 不支持平滑過渡的可變寬度)。沿曲線的二次分點同樣需要被計算,但這超出了本文討論的范疇。還請看看 Github 上的源代碼了解細(xì)節(jié)吧。

給定兩個點,計算出一個垂直的向量,它的大小設(shè)置為當(dāng)前厚度的一半?;?GL_TRIANGLE_STRIP 的自然特性,只需要兩個點就能用兩個三角形去創(chuàng)建下一個矩形。

sdfvs676c652d73747269702e706e67

下面是使用二次貝塞爾曲線,并根據(jù)速度調(diào)節(jié)筆畫粗細(xì)而創(chuàng)造出的一個具有視覺吸引力且非常自然的簽名。

regrer6f70656e676c2e706e67

原文出處: JASON HARWIG   

譯文出處: nixzhu(@nixzhu)

責(zé)任編輯:閆佳明 來源: github
相關(guān)推薦

2016-08-16 08:26:19

Linuxsignalsigaction

2022-09-13 08:40:24

AndroidLinux

2018-07-20 14:20:24

Linux用戶組管理員

2012-04-16 17:15:12

iOS 5定制用戶界面

2018-05-10 15:05:41

Linux用戶日期命令

2022-11-01 15:49:52

2018-11-26 08:45:29

Linux驅(qū)動程序命令

2021-06-02 09:36:49

物聯(lián)網(wǎng)惡意軟件IoT

2019-02-28 09:30:04

Ubuntusudo命令

2021-09-27 07:57:15

MEAT安全工具安全取證

2017-01-11 16:41:16

Linux設(shè)備文件文件系統(tǒng)

2021-08-27 11:03:57

Azure公有云云原生

2020-03-23 17:58:29

LinuxSSH

2019-07-12 16:28:32

MacKubernetes

2019-01-07 09:50:06

Linuxtarball命令

2019-11-26 16:58:51

Linuxpkgsrc

2021-07-25 10:34:17

FedoraPodmanLinux

2019-07-23 09:10:41

MacOSKibana開源

2019-08-02 15:30:42

UbuntuMongoDB命令

2019-11-26 09:20:47

LinuxJava
點贊
收藏

51CTO技術(shù)棧公眾號