日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Delphi实现类似Android锁屏的密码锁控件

發(fā)布時(shí)間:2025/3/13 Android 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Delphi实现类似Android锁屏的密码锁控件 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? ? 好久沒寫過博客咯!瞎忙的不得了!整來整去沒整出個(gè)正經(jīng)東西,目前自己實(shí)現(xiàn)的電子病歷已經(jīng)投入使用,功能還不全面,很弱,質(zhì)控以及標(biāo)準(zhǔn)化都還沒去細(xì)整,平時(shí)業(yè)余的時(shí)間一個(gè)人整,還真是沒那么多的時(shí)間與精力去一一的細(xì)化!哎,只能慢慢的來吧!年初整了個(gè)小米手機(jī),功能上還是不錯(cuò)的,不像某些人說的那么垃圾,總之我用的還是很不錯(cuò)的。各種游戲,神馬的跑動起來小意思,流暢狠。今天要整的主題就是手機(jī)上的一個(gè)功能了,直接給搬運(yùn)到Delphi上來。那就是手機(jī)鎖屏之后,開屏的時(shí)候,要求咱們輸入密碼的那個(gè)滑動效果輸入的控件。想想,整在軟件中,用來在客戶離開計(jì)算機(jī),鎖屏的時(shí)候還是蠻不錯(cuò)的一種方式,而且一般的圖形圖像給人的記憶比純粹的數(shù)字文字類的更能讓人印象深刻。所以決定將這個(gè)東西整到PC上來。

? ?Android的那個(gè)鎖屏的效果,用過的人應(yīng)該都知道是個(gè)什么效果,也就是橫豎各3行,排列成九宮格的效果,然后由用戶在上面滑動以此來達(dá)到密碼輸入進(jìn)而進(jìn)行解鎖和加密的效果。那么首先,俺們可以分析一下,他的具體形成思路,實(shí)際上是很簡單的,就是一個(gè)排列,然后根據(jù)滑動產(chǎn)生的內(nèi)容形成密碼來達(dá)到解密的目的,那么最主要的就是這個(gè)密碼和他本身的密碼是如何對應(yīng)解密的,實(shí)際上很簡單,咱們給他排列的九宮格,都固定好位置

123
456
789

就像這樣,排列的給他的位置固定好,然后每一個(gè)格子表示一個(gè)字符或者說字符串,進(jìn)而用戶滑動的時(shí)候,將對應(yīng)的位置序列進(jìn)入到一個(gè)列表中去保存,然后鼠標(biāo)放開的時(shí)候,那么入隊(duì)的選擇位置進(jìn)行組合,那么就是對應(yīng)的密碼了,比如

這樣的輸入就是表示123,如此順序記錄,就可以形成密碼了,然后用戶進(jìn)行滑屏錄入之后和以前的進(jìn)行比較就可以知道密碼是否正確了,當(dāng)然我這個(gè)組合是相當(dāng)簡單的,如果想要整的復(fù)雜,可以給每個(gè)順序位置給定復(fù)雜的字符串,這樣形成的密碼就足夠的復(fù)雜了!給一般人去看,也是看不明白的。

那么分析清楚了,思路也就簡單了,鼠標(biāo)按下的時(shí)候,開始可以滑動形成密碼,鼠標(biāo)按下的第一個(gè)點(diǎn),作為隊(duì)列的第一個(gè),然后再滑過的就順序的一一的記錄到隊(duì)列中,鼠標(biāo)放開的時(shí)候,從隊(duì)列中獲取各個(gè)順序位置,組合形成密碼然后和原密碼比對,判斷密碼是否正確!源碼如下:

{Delphi實(shí)現(xiàn)的類似Android鼠標(biāo)鎖屏效果的控件作者:不得閑2012-7-23 } unit AndroidLockControl;interface uses Windows,Classes,SysUtils,Graphics,Controls;typeTDxLockItem = classprivater: TRect;IsEnter: Boolean;IsChecked: Boolean;Value: AnsiChar;FRadio: TPoint;publicconstructor Create;end;TInPutPwdEvent = procedure(Sender: TObject;InputPwd: string) of object;TDxAndroidLock = class(TGraphicControl)privateFItemSpace: Integer;FRowCount: Integer;FColCount: Integer;FItemRaidio: Integer;Items: TList;FUseNum: Boolean;FPassword: string;IsDown: Boolean;LastInItem: TDxLockItem;PwdItems: TList;FOnInputPwd: TInPutPwdEvent;procedure SetItemSpace(const Value: Integer);procedure SetItemRaidio(const Value: Integer);procedure SetUseNum(const Value: Boolean);protectedprocedure paint;override;procedure MouseDown(Button: TMouseButton; Shift: TShiftState;X, Y: Integer); override;procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;procedure MouseUp(Button: TMouseButton; Shift: TShiftState;X, Y: Integer); override;procedure CalcItemRects;publicconstructor Create(AOwner: TComponent);override;destructor Destroy;override;property Password: string read FPassword write FPassWord;publishedproperty ItemSpace: Integer read FItemSpace write SetItemSpace default 10;property OnInputPwd: TInPutPwdEvent read FOnInputPwd write FOnInputPwd;property ItemRaidio: Integer read FItemRaidio write SetItemRaidio default 20;property UseNum: Boolean read FUseNum write SetUseNum;end; implementation uses pngimage; {$R LockRc.RES} varPngIn,PngOut: TPngImage; { TDxAndroidLock }procedure TDxAndroidLock.CalcItemRects; vari,j: Integer;p: TPoint;r: TRect;item: TDxLockItem; beginp.Y := FItemRaidio;for i := 1 to 3 dobeginp.X := FItemRaidio;r.Left := p.X - FItemRaidio;r.Top := p.Y - FItemRaidio;r.Right := p.x + FItemRaidio;r.Bottom := p.Y + FItemRaidio;for j := 1 to 3 dobeginitem := Items[3*(i-1)+j - 1];item.Value := AnsiChar(3*(i-1)+j+48);item.FRadio := p;item.r := r;p.X := p.X + FItemRaidio * 2 + FItemSpace;r.Left := p.X - FItemRaidio;r.Right := p.X + FItemRaidio;end;p.Y := p.Y + FItemRaidio * 2 + FItemSpace;end; end;constructor TDxAndroidLock.create(AOwner: TComponent); vari: Integer; begininherited;LastInItem := nil;PwdItems := TList.Create;FPassWord := '';Items := TList.Create;FItemSpace := 10;FRowCount := 3;FColCount := 3;FItemRaidio := 20;Width := FItemRaidio * 2 * 3 + FItemSpace * 2;Height := FItemRaidio * 2 * 3 + FItemSpace * 2;for i := 0 to 8 dobeginItems.Add(TDxLockItem.Create);end;CalcItemRects; end;destructor TDxAndroidLock.Destroy; beginwhile Items.Count > 0 dobeginTDxLockItem(Items[Items.Count - 1]).Free;Items.Delete(Items.Count - 1);end;PwdItems.Free;inherited; end;procedure TDxAndroidLock.MouseDown(Button: TMouseButton; Shift: TShiftState; X,Y: Integer); beginIsDown := Button = mbLeft;if IsDown thenbeginif LastInItem <> nil thenbeginLastInItem.IsChecked := IsDown;PwdItems.Add(LastInItem);end;Invalidate;end; end;procedure TDxAndroidLock.MouseMove(Shift: TShiftState; X, Y: Integer); vari: Integer;p: TPoint;OldInItem,Item: TDxLockItem; beginOldInItem := LastInItem;p := Point(x,y);LastInItem := nil;for i := 0 to items.Count - 1 dobeginitem := Items[i];if PtInRect(Item.r,p) thenbeginLastInItem := Item;LastInItem.IsEnter := True;LastInItem.IsChecked := IsDown;Break;end;end;if LastInItem <> OldInItem thenbeginif OldInItem <> nil thenOldInItem.IsEnter := False;if IsDown thenbeginif LastInItem <> nil thenbeginPwdItems.Add(LastInItem);end;Invalidate;end;end; end;procedure TDxAndroidLock.MouseUp(Button: TMouseButton; Shift: TShiftState; X,Y: Integer); vari: Integer;item: TDxLockItem;Np: string; beginIsDown := False;for i := 0 to items.Count - 1 dobeginitem := Items[i];item.IsChecked := False;end;for i := 0 to PwdItems.Count - 1 doNp := Np + TDxLockItem(PwdItems[i]).Value;PwdItems.Clear;Invalidate;if Assigned(FOnInputPwd) thenFOnInputPwd(self,Np); end;procedure DrawLineArrow(canvas: TCanvas; p1, p2: TPoint); constl = 6; //箭頭長度w = 4; //箭頭寬度 varslope, angle: Double;points: array[0..2] of TPoint;Xl,b: Single; begincanvas.Brush.Color := canvas.Pen.Color;canvas.Brush.Style := bsSolid;canvas.MoveTo(p1.X,p1.Y);canvas.LineTo(p2.X,p2.Y);if (p2.Y <> p1.Y) and (P2.X <> p1.X) thenbeginxl := (P2.Y - p1.Y) / (P2.X - p1.X);b := p2.Y - xl * p2.X;p2.X := (p2.X - p1.X) div 2 + p1.X;p2.Y := Trunc(p2.X * xl + b);endelse if p2.Y = p1.Y thenp2.X := (p2.X - p1.X) div 2 + p1.Xelse P2.Y := (p2.Y - p1.Y) div 2 + p1.Y; //畫箭頭points[0] := Point(p2.x, p2.y);//箭頭頂點(diǎn)if (p2.x - p1.x = 0) thenbegin //垂直if (p2.y - p1.y > 0) then slope := -1 else slope := 1;points[1] := Point(p2.x - w, p2.y + Trunc(l * slope));points[2] := Point(p2.x + w, p2.y + Trunc(l * slope));end elsebegin //傾斜slope := (p2.y - p1.y) / (p2.x - p1.x);angle := ArcTan(slope);if (p2.x - p1.x > 0) then angle := angle - PI;points[1] := Point(p2.x + trunc(l * cos(angle) - w * sin(angle)),p2.y + trunc(l * sin(angle) + w * cos(angle)));points[2] := Point(p2.x + Trunc(l * cos(angle) + w * sin(angle)),p2.y + Trunc(l * sin(angle) - w * cos(angle)));end;canvas.Polygon(points); end;procedure TDxAndroidLock.paint; vari: Integer;item,item1: TDxLockItem;r: TRect; beginif not IsDown thenbeginfor i := 0 to Items.Count - 1 dobeginitem := items[i];r.Left := item.FRadio.X - 5;r.Right := item.FRadio.X + 5;r.Top := item.FRadio.Y - 5;r.Bottom := item.FRadio.Y + 5;Canvas.Draw(r.Left,r.Top,pngIn);end;endelsebegin//繪制指向線條Canvas.Pen.Width := 2;Canvas.Pen.Color := clGreen;for i := 0 to PwdItems.Count - 2 dobeginitem := PwdItems[i];item1 := PwdItems[i + 1];Canvas.MoveTo(item.FRadio.X,item.FRadio.Y);Canvas.LineTo(item1.FRadio.X,item1.FRadio.Y);DrawLineArrow(Canvas,item.FRadio,item1.FRadio);end;for i := 0 to Items.Count - 1 dobeginitem := items[i];if item.IsChecked thenbeginCanvas.Draw(item.r.Left,item.r.Top,pngOut);end;r.Left := item.FRadio.X - 5;r.Right := item.FRadio.X + 5;r.Top := item.FRadio.Y - 5;r.Bottom := item.FRadio.Y + 5;Canvas.Draw(r.Left,r.Top,pngIn);end;end; end;procedure TDxAndroidLock.SetItemRaidio(const Value: Integer); beginFItemRaidio := Value; end;procedure TDxAndroidLock.SetItemSpace(const Value: Integer); beginFItemSpace := Value; end;procedure TDxAndroidLock.SetUseNum(const Value: Boolean); beginFUseNum := Value; end;{ TDxLockItem }constructor TDxLockItem.Create; beginr := Rect(0,0,0,0);IsEnter := False; end;initializationPngIn := TPngImage.Create;PngIn.LoadFromResourceName(Hinstance,'InnerGra');PngOut := TPngImage.Create;PngOut.LoadFromResourceName(Hinstance,'Outer');finalizationPngIn.Free;PngOut.Free; end.

運(yùn)行之后的效果就是

轉(zhuǎn)載于:https://www.cnblogs.com/DxSoft/archive/2012/07/23/2604941.html

總結(jié)

以上是生活随笔為你收集整理的Delphi实现类似Android锁屏的密码锁控件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 麻豆av在线 | 国产日本一区二区 | 极品探花在线观看 | 亚洲理论片在线观看 | 欧美高清成人 | 精品少妇久久久久久888优播 | 国精产品一区一区三区有限公司杨 | 夜夜摸夜夜操 | 亚洲第一色站 | 欧美日韩性生活 | 久久瑟瑟| 三上悠亚激情av一区二区三区 | 动漫精品一区二区三区 | 成人三级晚上看 | 国产精品成人一区 | 午夜视频福利在线观看 | 一区二区三区网 | 国产一区二区免费在线观看 | 免费看黄色av | 精品国产九九 | 在线免费色 | 久久久久亚洲国产 | 久久夜夜夜 | 三级黄色生活片 | 激情婷婷综合 | 色秀av| www.伊人.com | 1024在线视频 | 久久亚洲美女 | 色综合免费视频 | 天天做天天爱天天爽综合网 | 久久高清国产 | 亚洲影院一区二区三区 | 久久h| 中文字幕精品三区 | 国产男女av | 国产精品xxxxx | 在线看的av网站 | 日本va欧美va精品发布 | 亚洲永久av | www插插插无码免费视频网站 | 国产一区二区三区在线免费观看 | 蜜臀久久精品久久久用户群体 | 亚洲精品黄色 | 日日碰狠狠添天天爽 | 福利视频在线导航 | 成人午夜免费在线 | 日韩欧美综合一区 | 国产一级片免费 | 国产麻豆乱码精品一区二区三区 | 一区二区日韩精品 | 91在线一区二区三区 | 久久66热这里只有精品 | 欧美黄网站在线观看 | 国产综合在线播放 | 性工作者十日谈 | 成年人在线免费 | 日韩精品一区二区三区在线视频 | 久久黄色小说 | 免费人成又黄又爽又色 | 日韩免费小视频 | 婷婷狠狠干 | 亚洲国产欧美一区二区三区深喉 | 五月激情婷婷综合 | 欧美一区二区视频在线 | 一区免费| 涩涩视频网站 | 插插插干干干 | 在线不卡免费视频 | 婷婷综合久久 | 麻豆精品国产精华精华液好用吗 | 国产黄色一级片视频 | 欧美123 | av福利在线看 | 狠狠操欧美 | 亚洲尹人 | 狠狠人妻久久久久久综合麻豆 | 成人91看片 | youjizz麻豆| 久久国产电影 | 日韩在线精品强乱中文字幕 | 免费日本在线 | 久一在线视频 | 夜夜躁日日躁狠狠久久av | 可以免费看的av网站 | 久久艹av | 日本午夜电影网站 | 麻豆传媒在线 | 黄色av网址大全 | 免费视频精品 | 久久蜜臀精品av | 视频在线观看一区 | 91麻豆精品国产理伦片在线观看 | 一区二区三区免费播放 | 在线视频免费播放 | 亚洲小说区图片区都市 | 韩国三级bd高清中字2021 | 亚洲欧美国产精品久久久久久久 | 国产成人高清在线 |