成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何在iOS設備上捕捉用戶簽名

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

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

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

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

點點相連

rgegfhrthr652d6469616772616d2d6c696e65732e706e67

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

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

  1. // 創建一個 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

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

2012 年的 Apple 開發者大會有一個 session 叫做 創建高級手勢識別器,它用了一點數學來解決此問題。

二次貝塞爾曲線

trhrehrthrtr616472617469632e706e67

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

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

  1. CGPoint previousPoint; 

并創建一個函數來計算兩點的中間點:

  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

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

可變的線寬

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

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

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

sdfvs676c652d73747269702e706e67

下面是使用二次貝塞爾曲線,并根據速度調節筆畫粗細而創造出的一個具有視覺吸引力且非常自然的簽名。

regrer6f70656e676c2e706e67

原文出處: JASON HARWIG   

譯文出處: nixzhu(@nixzhu)

責任編輯:閆佳明 來源: github
相關推薦

2022-09-13 08:40:24

AndroidLinux

2016-08-16 08:26:19

Linuxsignalsigaction

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驅動程序命令

2021-06-02 09:36:49

物聯網惡意軟件IoT

2019-02-28 09:30:04

Ubuntusudo命令

2021-09-27 07:57:15

MEAT安全工具安全取證

2017-01-11 16:41:16

Linux設備文件文件系統

2011-01-19 11:17:20

2021-08-27 11:03:57

Azure公有云云原生

2021-01-18 08:00:00

Linux虛擬機磁盤

2019-01-07 09:50:06

Linuxtarball命令

2019-07-12 16:28:32

MacKubernetes

2019-08-02 15:30:42

UbuntuMongoDB命令

2019-11-26 09:20:47

LinuxJava

2021-07-25 10:34:17

FedoraPodmanLinux

2019-07-23 09:10:41

MacOSKibana開源
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 婷婷国产一区二区三区 | 一本岛道一二三不卡区 | 久久久精品一区 | 免费在线成人 | 久久久999精品 | 亚洲成人一区 | 91精品久久久久久久 | 欧美中文字幕一区二区三区 | 国产日韩欧美在线 | 中文字幕精品一区二区三区在线 | 国产在线小视频 | 久久激情av | 欧美日一区 | www亚洲精品 | 亚洲国产精品日韩av不卡在线 | 日韩在线观看网站 | 亚洲精品天堂 | 日韩av资源站| 在线一区视频 | 精品国产乱码一区二区三 | 九九精品视频在线 | 华丽的挑战在线观看 | 亚洲一区导航 | 国产免费又色又爽又黄在线观看 | 亚洲一区国产精品 | 国产精品1区2区3区 欧美 中文字幕 | 在线a视频| 久久新 | 国产精品久久一区 | 日本在线视频一区二区 | 成人av播放 | 亚洲欧美自拍偷拍视频 | 国产精品欧美大片 | 7777精品伊人久久精品影视 | 在线视频日韩 | 黄网站在线播放 | 婷婷色网 | 色婷婷av久久久久久久 | 日韩一级 | 久久综合爱 | 国产激情网 |