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

鴻蒙第三方組件*SwipeCaptcha滑動(dòng)拼圖驗(yàn)證組件

系統(tǒng)
文章由鴻蒙社區(qū)產(chǎn)出,想要了解更多內(nèi)容請(qǐng)前往:51CTO和華為官方戰(zhàn)略合作共建的鴻蒙技術(shù)社區(qū)https://harmonyos.51cto.com

[[387304]]

想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

前言

基于安卓平臺(tái)的滑動(dòng)拼圖驗(yàn)證組件SwipeCaptcha( https://github.com/mcxtzhang/SwipeCaptcha),實(shí)現(xiàn)了其核心功能的鴻蒙化遷移和重構(gòu),代碼已經(jīng)開(kāi)源到(https://gitee.com/isrc_ohos/SwipeCaptcha),歡迎各位下載使用并提出寶貴意見(jiàn)!

背景

在頁(yè)面登錄或者注冊(cè)的時(shí)候,為了確保不是機(jī)器人操作,會(huì)讓用戶手動(dòng)驗(yàn)證。驗(yàn)證方式分為滑動(dòng)拼圖驗(yàn)證和滑動(dòng)驗(yàn)證兩種。本文的SwipeCaptcha組件可以實(shí)現(xiàn)滑動(dòng)拼圖的驗(yàn)證方式,操作簡(jiǎn)單,安全性強(qiáng),被眾多APP使用。

組件效果展示

鴻蒙系統(tǒng)的SwipeCaptcha組件在使用時(shí),有兩個(gè)較為重要的圖片:滑塊和原圖。這兩張圖片被放置與同一水平線上,用戶拖動(dòng)滑塊至原圖處,誤差在一定范圍內(nèi),即可驗(yàn)證成功。每次調(diào)用SwipeCaptcha組件,滑塊和原圖的位置都會(huì)發(fā)生隨機(jī)變化,登錄時(shí)被暴力破解的難度增加,安全性較高。

在SwipeCaptcha組件的驗(yàn)證界面,還有當(dāng)前進(jìn)度值和驗(yàn)證狀態(tài)的描述。當(dāng)前進(jìn)度值表示滑塊在水平方向的滑動(dòng)進(jìn)度,進(jìn)度為100時(shí),表示滑塊滑至最右端。進(jìn)度值下方展示的是當(dāng)前的驗(yàn)證狀態(tài),可分為:“開(kāi)始”、“驗(yàn)證失敗,請(qǐng)重新驗(yàn)證三種狀態(tài)”、“驗(yàn)證成功”。下面依次展示SwipeCaptcha組件拼圖驗(yàn)證失敗和成功的效果圖。

1、驗(yàn)證失敗效果

用戶未將滑塊拖至原圖處,導(dǎo)致滑塊與原圖的位置誤差較大,驗(yàn)證失敗。

圖1 驗(yàn)證失敗效果

2、驗(yàn)證成功效果

用戶拖動(dòng)滑塊至原圖處,誤差在一定范圍內(nèi),驗(yàn)證成功。

圖2 驗(yàn)證成功效果

Sample解析

Sample主要包含以下四個(gè)部分:1)拼圖背景導(dǎo)入手機(jī)。2)裁剪滑塊。3)繪制滑塊。4)驗(yàn)證拼圖是否成功。下面將通過(guò)具體步驟對(duì)上述四個(gè)部分進(jìn)行詳解。 1、數(shù)據(jù)初始化

本步驟包含三個(gè)部分的數(shù)據(jù)設(shè)置:(1)獲取手機(jī)屏幕寬度信息;(2)設(shè)置進(jìn)度值和驗(yàn)證狀態(tài)的初始提示文字,如“當(dāng)前進(jìn)度值”、“請(qǐng)滑動(dòng)滑塊驗(yàn)證”;(3)初始化畫(huà)筆信息,定義畫(huà)筆屬性;

  1. //獲取手機(jī)屏幕寬度displayAttributes.width 
  2. DisplayManager displayManager = DisplayManager.getInstance(); 
  3. Display display = displayManager.getDefaultDisplay(this).get(); 
  4. DisplayAttributes displayAttributes = display.getAttributes(); 
  5. windowWidth = displayAttributes.width; 
  6. // 進(jìn)度值初始化 
  7. text = new Text(this); 
  8. text.setMarginTop(800);// 距離頂端邊界的距離 
  9. text.setText("當(dāng)前進(jìn)度值"+ progress);// 設(shè)定文字 
  10. text.setTextSize(100);// 設(shè)定字號(hào) 
  11. myLayout.addComponent(text);// 添加進(jìn)布局中 
  12. // 驗(yàn)證狀態(tài)初始化 
  13. text2 = new Text(this); 
  14. text2.setMarginTop(1000); 
  15. text2.setText("請(qǐng)滑動(dòng)滑塊驗(yàn)證"); 
  16. text2.setTextSize(100); 
  17. myLayout.addComponent(text2); 
  18. //初始化畫(huà)筆的信息 
  19. mPaint = new Paint(); 
  20. mPaint.setColor(Color.BLACK);//定義顏色 
  21. mPaint.setAntiAlias(true);//定義虛實(shí)線 
  22. mPaint.setStrokeWidth(5f);//定義寬度 
  23. mPaint.setStyle(Paint.Style.STROKE_STYLE);//定義繪圖方式 

2、背景圖片繪制

用手機(jī)屏幕的寬度除以背景圖片的寬度,得到背景圖片的縮放比例,當(dāng)該圖片顯示在手機(jī)中,按照此比例縮放可與屏幕同寬。該比例用于背景圖片適配不同型號(hào)的手機(jī)屏幕。

  1. //背景圖片的縮放比例 
  2. float ratio = (float) windowWidth/(float) img.getImageInfo().size.width; 
  3. //背景圖片繪制 
  4. Component image = new Component(this); 
  5. Component.DrawTask drawTask = new Component.DrawTask() { 
  6.     @Override 
  7.     public void onDraw(Component component, Canvas canvas) { 
  8.         //按照比例進(jìn)行縮放 
  9.         canvas.scale(ratio , ratio); 
  10.         //繪圖 
  11.         canvas.drawPixelMapHolder(pixelMapHolder, 0, 0, new Paint()); 
  12.     } 
  13. }; 
  14. image.addDrawTask(drawTask); 
  15. myLayout.addComponent(image); 

3. 確定滑塊和原圖的位置

圖3 滑塊和原圖的位置示意

puzzleWidth為滑塊或者原圖的寬度;top為隨機(jī)數(shù)值,表示滑塊或者原圖的上邊距離背景圖片上邊的距離;puzzel2left也為隨機(jī)數(shù)值,表示原圖左邊距離背景圖片左邊的距離。有了以上三個(gè)變量可以確定組件中滑塊和原圖的初始位置和大小(滑塊初始時(shí)位于屏幕的最左側(cè))。下面介紹上述屬性是如何計(jì)算出來(lái)的。

  1. //puzzleWidth 為屏幕寬度的1/6 
  2. puzzleWidth = windowWidth/6; 
  3.  
  4. //top為圖片縮放后高度與摳圖高度之差再乘以隨機(jī)數(shù) 
  5. top = (float) Math.random()*(img.getImageInfo().size.height*ratio - puzzleWidth); 
  6.  
  7. //原圖位置一定在滑塊位置右面 
  8. //屏幕寬度減去兩個(gè)拼圖寬度 *隨機(jī)數(shù),后向右平移一個(gè)滑塊的長(zhǎng)度 
  9. puzzel2left = ((windowWidth -puzzleWidth*2) * (float)Math.random()) + puzzleWidth; 

4. 獲取滑塊

本步驟需要根據(jù)原圖的位置,解碼出一個(gè)圖片作為滑塊。首先設(shè)置滑塊的形狀為矩形,依據(jù)上述的puzzel2left、puzzleWidth屬性,確定矩形所在區(qū)域,依據(jù)縮放比例,將矩形區(qū)域映射為原比例圖像,并對(duì)此圖像進(jìn)行解碼,得到滑塊圖像數(shù)據(jù)。

  1. PixelMap puzzlePixelMap = 
  2.  getPuzzlePixelMap(this , ResourceTable.Media_longa , new Rect((int)(puzzel2left/ratio), (int) (top/ratio), (int) (puzzleWidth/ratio) , (int) (puzzleWidth/ratio))); 
  3. PixelMapHolder pixelMapHolder1 = new PixelMapHolder(puzzlePixelMap); 

5.繪制滑塊

滑塊通過(guò)畫(huà)筆來(lái)繪制,其位置應(yīng)該根據(jù)滑動(dòng)進(jìn)度條的進(jìn)度來(lái)移動(dòng),并且要對(duì)不同手機(jī)屏幕的進(jìn)行適配。同時(shí),為了和用戶友好的交互,我們還需要為滑塊繪制一個(gè)邊框,告知用戶這個(gè)邊框所在就是滑塊(原圖也需要繪制邊框,原理相同)。繪制滑塊和邊框的代碼如下:

  1. //繪制滑塊 
  2. Component.DrawTask puzzelDrawTask = new Component.DrawTask() { 
  3.     @Override 
  4.     public void onDraw(Component component, Canvas canvas) { 
  5.         Paint paint = new Paint(); 
  6. //移動(dòng)小滑塊拼圖 
  7.         canvas.translate(slider.getProgress()*displayAttributes.width /100 , top); 
  8. //進(jìn)行適當(dāng)比例縮放 
  9.         canvas.scale(ratio , ratio); 
  10.         canvas.drawPixelMapHolder(pixelMapHolder1 , 0 , 0 , paint); 
  11.  
  12.     } 
  13. }; 
  14. //繪制滑塊邊框 
  15. Component puzzleFrame = new Component(this); 
  16. Component.DrawTask drawTask2 = new Component.DrawTask() { 
  17.     @Override 
  18.     public void onDraw(Component component, Canvas canvas) { 
  19.         //方框左側(cè)位置 
  20.         float left = slider.getProgress()*windowWidth /100; 
  21.         //繪制邊框的左邊 
  22.         canvas.drawLine(new Point(left , top), 
  23.                 new Point(lefttop + puzzleWidth), mPaint); 
  24.         //繪制邊框的上邊 
  25.         canvas.drawLine(new Point(lefttop), 
  26.                 new Point(left + puzzleWidth, top), mPaint); 
  27.         //繪制邊框的右邊 
  28.         canvas.drawLine(new Point(left + puzzleWidth, top), 
  29.                 new Point(left + puzzleWidth, top + puzzleWidth), mPaint); 
  30.         //繪制邊框的下邊 
  31.         canvas.drawLine(new Point(lefttop + puzzleWidth), 
  32.                 new Point(left + puzzleWidth, top + puzzleWidth), mPaint); 
  33.     } 
  34. }; 

6. 進(jìn)度條滑動(dòng)更新

為進(jìn)度條設(shè)置監(jiān)聽(tīng),拖動(dòng)進(jìn)度條會(huì)引起三處更新:(1)滑塊位置和滑塊邊框位置的更新;(2)進(jìn)度值的更新;(3)驗(yàn)證狀態(tài)的更新。在驗(yàn)證狀態(tài)的更新中,需要對(duì)用戶拖動(dòng)進(jìn)度條結(jié)束時(shí)的驗(yàn)證狀態(tài)進(jìn)行判斷,滑塊和原圖的位置差距是否在誤差范圍內(nèi),如果在范圍內(nèi),則顯示驗(yàn)證成功,如果不在誤差范圍內(nèi),則顯示驗(yàn)證失敗,提示需要重新驗(yàn)證。

  1. //設(shè)置進(jìn)度條監(jiān)聽(tīng) 
  2. slider.setValueChangedListener(new Slider.ValueChangedListener() { 
  3.     @Override 
  4. //拖動(dòng)進(jìn)度條引起的更新 
  5. public void onProgressUpdated(Slider slider, int i, boolean b) { 
  6.     //滑塊的位置更新 
  7.     puzzle.invalidate(); 
  8.     //滑塊邊框位置的更新 
  9.     puzzleFrame.invalidate(); 
  10.     //進(jìn)度值更新 
  11. text.setText("當(dāng)前進(jìn)度值 : " + slider.getProgress()); 
  12.     } 
  13.  
  14. //當(dāng)用戶開(kāi)始滑動(dòng)進(jìn)度條時(shí),驗(yàn)證狀態(tài)變?yōu)?ldquo;開(kāi)始”字樣。 
  15. public void onTouchStart(Slider slider) { 
  16.     //開(kāi)始拖動(dòng)的方法 
  17.     text2.setText("開(kāi)始"); 
  18.  //判斷滑塊左側(cè)邊的位置和原圖的左側(cè)邊的位置是否在誤差內(nèi) 
  19. public void onTouchEnd(Slider slider) { 
  20.         if(((slider.getProgress()*windowWidth /100)<(puzzel2left + puzzleWidth/10))&&((slider.getProgress()*windowWidth /100)>(puzzel2left - puzzleWidth/10))) 
  21.     { 
  22.         text2.setText("驗(yàn)證成功"); 
  23.     }else { 
  24.         text2.setText("驗(yàn)證失敗,請(qǐng)重新驗(yàn)證"); 
  25.         slider.setProgressValue(10); 
  26.     } 

項(xiàng)目貢獻(xiàn)人

趙柏屹 鄭森文 朱偉 陳美汝 張馨心

想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

 

責(zé)任編輯:jianghua 來(lái)源: 鴻蒙社區(qū)
相關(guān)推薦

2021-10-19 10:04:51

鴻蒙HarmonyOS應(yīng)用

2021-11-17 15:37:43

鴻蒙HarmonyOS應(yīng)用

2021-03-03 09:42:26

鴻蒙HarmonyOS圖片裁剪

2021-08-30 17:55:58

鴻蒙HarmonyOS應(yīng)用

2021-03-10 15:03:40

鴻蒙HarmonyOS應(yīng)用

2021-04-29 14:32:24

鴻蒙HarmonyOS應(yīng)用

2021-03-24 09:30:49

鴻蒙HarmonyOS應(yīng)用

2017-12-11 15:53:56

2021-08-26 16:07:46

鴻蒙HarmonyOS應(yīng)用

2021-08-03 10:07:41

鴻蒙HarmonyOS應(yīng)用

2021-03-01 14:00:11

鴻蒙HarmonyOS應(yīng)用

2021-04-08 14:57:52

鴻蒙HarmonyOS應(yīng)用

2021-04-20 15:06:42

鴻蒙HarmonyOS應(yīng)用

2021-07-06 18:21:31

鴻蒙HarmonyOS應(yīng)用

2021-08-05 15:06:30

鴻蒙HarmonyOS應(yīng)用

2024-04-03 12:57:29

2021-04-15 17:47:38

鴻蒙HarmonyOS應(yīng)用

2021-07-20 15:20:40

鴻蒙HarmonyOS應(yīng)用

2021-08-10 15:23:08

鴻蒙HarmonyOS應(yīng)用

2021-06-29 09:28:16

鴻蒙HarmonyOS應(yīng)用
點(diǎn)贊
收藏

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