前言
在上一篇直播APP常用動畫效果中介紹了各種常用的動畫效果,但是在直播APP中還有一種特別常用的禮物——手繪禮物。
這篇就是介紹如何實現這一個好玩的禮物。
正文
手繪禮物:簡單來說,就是觀眾可以通過手指在屏幕繪制形狀、文字等形成特殊的禮物,主播收到后除了鉆石獎勵,還會顯示觀眾繪制的禮物。
手繪禮物的實現,大致分為以下幾個部分:
1、繪制準備;
2、手繪記錄;
3、消息傳輸;
4、解析并顯示;
效果展示:
繪制準備
1、繪制區域
繪制區域指的是禮物的可繪制區域,需要監聽手勢。
但是該區域可能存在其他手勢,比如說上下滑手勢切換直播間、左右滑手勢切換UI顯示,需要解決沖突問題:
添加上下滑手勢和左右滑手勢的delegate,在UIGestureRecognizerDelegate
的實現中,根據當前繪制區域是否顯示判斷是否接受手勢;
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch;
為了保證在不同手機上,繪制區域不超過屏幕范圍與繪制的方便,規定繪制區域為正方形,并且長度為屏幕的寬度,中心與屏幕正中心對齊。
圖案選擇:繪制的圖案有多個,根據是否需要混合多個圖案,選擇對應的數據結構存儲點數據。
2、手繪記錄
手繪的記錄可以通過UIResponder的方法來實現:
由touchBegan開始,記錄touchMove的位置,touchEnd結束;
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;
注意,為了避免兩個圖案過于貼近,需要添加距離判斷:
根據當前點位置和上一個點的位置,判斷兩個點的距離是否大于最小間隔;
最終把合法的位置和當前選擇的圖案編號,轉換為本地點數據結構存入數組中。
3、消息傳輸
消息傳輸首先要和安卓端協商好數據格式,把本地點數據結構轉為json串或者字節流,再放入房間消息中;
規定的數據格式包括以下信息:
square_size
:?繪制正方形大小;
point_count
:繪制點的數量;
point_data
:點的位置信息;
point_type
:點的圖案類型;
為了縮小消息體積,點的位置信息截取小數點后1、2位;
把點數據按照指定的格式進行轉換后,就可以打包成房間消息,進行消息傳輸。
4、解析并顯示
顯示的要求是與繪制效果一致,不變形與視頻的相對位置不變;
上一步已經規定好的數據格式,當收到數據時按照對應格式進行轉換,得到正方形大小、點位置、圖案和數量信息,傳給顯示類。
為了縮短手繪圖案的顯示時間,繪制的點信息里面并沒有時間;
顯示的時候,按照繪制的先后順序,在固定的時間間隔進行顯示。
注意,顯示區域與屏幕中心對齊,同時顯示區域也是長為屏幕寬度的正方形,點位置信息需要做一次轉換,得到當前屏幕的坐標。
總結
總結需求的要點:操作簡單,繪制預覽與顯示結果一致。
之前就說過要做這個功能,一開始覺得挺麻煩,分析完需求后發現挺簡單的;從提出需求、分析要點、實現和測試,耗時極短。
感覺和寫這篇介紹的時間差不多。