【HTML5初探之繪制圖像(上)】看我canvas元素引領下一代web頁面

弧度一塊可能有誤,需要再研究

導航

【初探HTML5之使用新標簽布局】用html5布局我的博客頁!

【HTML5初探之form標簽】解放表單驗證、增加文件上傳、集成拖放

【HTML5初探之繪制圖像(上)】看我canvas元素引領下一代web頁面

【HTML5初探之繪制圖像(下)】看我canvas元素引領下一代web頁面

【HTML5初探之多媒體元素】視頻播放HTML5、Flash誰才是王道?

【HTML5初探之本地存儲】如果沒有數據庫。。。

【HTML5初探之離線應用】如何打造零請求、無流量的網站?

【HTML5初探之通信API】跨域門檻不再高、數據推送不是夢

【HTML5初探之Web Workers】網頁也能多線程

【HTML5初探之Geolocation API】讓我們來回去地理信息

?

前言

最近小弟夠活躍了,主要是思想上發生了改變,有了明確的目的性,整個人有干勁多了。

但是,其實小弟寫的東西很亂,至少最近這些東西很亂就是了,因為我是邊看書邊寫博客,就當讀書筆記似的,希望各位包涵。

HTML5前端初探是一個系列,我會從頭到尾學習HTML5與CSS3形成兩個系列“HTML5初探”、“CSS3初探”,

然后再做第二次學習,將第一次沒有弄懂的全部搞懂,將一些需要擴展的做擴展。

號外:學到這一章,書莫名其妙的變成了彩色的了喲

八卦一下

呵呵,這里小弟八卦一下,小弟一直在關注”失業的程序員“一文的大哥,拋開創業故事、創業經歷不說,對于其中學姐、博主、卞工之間的故事非常感興趣。

學姐絕對是女神般的存在,這種學姐誰不喜歡呢?所以說不好是三角戀哦,但是,當我看到最近的一期卞工相親,我發現我錯了,我真的大錯特錯!!!

卞工相親要帶上博主,而最后居然很詭異的向博主說出他已心有所屬!!!然后在回想之前死心塌地的跟著博主出來創業,再到后面時時刻刻關注博主和學姐的發展,

甚至主動和學姐聯系(關心之間關系),我一直認為卞工會不會也是”尊敬“學姐呢?但是新的一期結束后,我的出了結論:絕對不是!!!

其實卞工自始至終愛的都只是一個人......此處省略三千字

  

呵呵,希望博主不要見怪,他的故事非常精彩,又出的慢,小弟等不及這里小小調侃一下,萬望海涵。?

初識canvas元素

HTML5新增了一個元素canvas,用于繪圖使用,其實它的表現和div比較接近(其實他應該屬于inline-block),而提供了許多接口,從而輕易的繪制矩形框、園三角形等

PS:關于HTML5新增元素

經過最近兩天的學習,和以前對HTML5的認知,我認為HTML5其實還是HTML4,兩者之間沒多大的區別,無非是增加了點新東西。
我認為HTML5為我們帶來的真正意義是:我們可以用javascript做更多的事情了;我們可以用javascript實現更好的產品了。 比如HTML5就解決了我們頭疼的跨域問題、實時通信API、與現在的canvas 之所以HTML5叫HTML5,我認為他是劃時代的,比如他讓我們用網頁開發游戲變成可能;比如他讓電腦桌面只剩IE不在是傳說(過于夸張)

  

繪制矩形框

直入正題,我們來繪制一個矩形框看看,這里提供一個顏色選擇器用于方便的選擇顏色,PS:現在不用jquery編程感覺真麻煩。。。

?問題:定義樣式與定義height與width

?一來就遇到了問題,我這里先來截個圖:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title></title><script type="text/javascript">function draw() {//獲取canvas對象var canvas =  document.getElementById('canvas');if (canvas == null) {return false;}var context = canvas.getContext('2d');context.fillStyle = '#99d9ea';context.fillRect(0, 0, 300, 200); //填充畫布結束context.strokeStyle = 'red';context.fillStyle = 'gray';context.lineWidth = 1;context.fillRect(10, 10, 100, 100);context.strokeRect(10, 10, 100, 100);context.clearRect(20, 20, 20, 20);}</script>
</head>
<body><canvas id="canvas" width=300 height="200" style="border: 1px solid black; width: 300px; height: 200px;"></canvas><br /><button οnclick="draw();">繪制矩形</button><input type="color" />
</body>
</html>

  各位情況canvas元素,圖一位設置width與height的情況,圖二十用style指定的情況:

可以看到,對于canvas來說,還是老老實實定義高寬的好,別去傻乎乎的用樣式了,當然這個問題需要實際研究才能得出最終結論。

好了,現在我們再來看看繪制矩形這個方法:

PS:其實,使用該方法這么麻煩,完全可以將該函數封裝下下,使用便會簡單許多
1、使用getElementById方法獲取繪制對象
2、取得上下文getContext('2d'),這都是固定的寫法
3、指定填充的顏色fillStyle和繪制的顏色strokeStyle,即里面的顏色和邊框的顏色
4、指定線寬linewidth
5、填充/繪制 fillRect/strokeRect 參數為 x,y,width,height
6、若是要使其中一塊透明,使用clearRect

至此,繪制矩形框便暫時告一段落。

繪制圓形

現在我們來繪制圓形,這個說起繪制圓形,其實我原來用js好像寫過一個,這里也貼出來看看:

我是純js畫的圓
 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 2 <html xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4     <title></title>
 5     <style type="text/css">
 6         div
 7         {
 8             position: absolute;
 9             width: 1px;
10             height: 1px;
11             line-height: 1px;
12         }
13     </style>
14     <script src="http://www.cnblogs.com/jquery-1.7.1.js" type="text/javascript"></script>
15     <script type="text/javascript">
16         //x2 + y2 = r2;
17         $(document).ready(function () {
18             //先畫x,y
19             var box = $('#box');
20             var NUM = 200;
21             var R = NUM / 2;
22             var RR = R * R;
23             for (var i = 0; i <= NUM; i = i + 6) {
24                 //var divX = $('<div style="left:' + i + 'px;top:' + R + 'px;">*</div>')
25                 // var divY = $('<div style="top:' + i + 'px;left:' + R + 'px;">*</div>')
26 
27                 var ti = i;
28                 //sqrt(x)
29                 if (ti > R) {
30                     ti = ti - R;
31                     var ty = Math.sqrt((RR - ti * ti));
32                     var y = $('<div style="left:' + (R - ty) + 'px;top:' + i + 'px;">*</div>')
33                     var y1 = $('<div style="left:' + (R + ty) + 'px;top:' + i + 'px;">*</div>')
34                     box.append(y);
35                     box.append(y1);
36                 } else if (ti < R) {
37                     ti = R - ti;
38                     var ty = Math.sqrt((RR - ti * ti));
39                     var y = $('<div style="left:' + (R - ty) + 'px;top:' + i + 'px;">*</div>')
40                     var y1 = $('<div style="left:' + (R + ty) + 'px;top:' + i + 'px;">*</div>')
41                     box.append(y);
42                     box.append(y1);
43                 }
44                 //box.append(divX);
45                 //box.append(divY);
46             }
47 
48             for (var i = 0; i <= NUM; i = i + 6) {
49                 //var divX = $('<div style="left:' + i + 'px;top:' + R + 'px;">*</div>')
50                 // var divY = $('<div style="top:' + i + 'px;left:' + R + 'px;">*</div>')
51                 var ti = i;
52                 //sqrt(x)
53                 if (ti > R) {
54                     ti = ti - R;
55                     var ty = Math.sqrt((RR - ti * ti));
56                     var y = $('<div style="top:' + (R - ty) + 'px;left:' + i + 'px;">*</div>')
57                     var y1 = $('<div style="top:' + (R + ty) + 'px;left:' + i + 'px;">*</div>')
58                     box.append(y);
59                     box.append(y1);
60                 } else if (ti < R) {
61                     ti = R - ti;
62                     var ty = Math.sqrt((RR - ti * ti));
63                     var y = $('<div style="top:' + (R - ty) + 'px;left:' + i + 'px;">*</div>')
64                     var y1 = $('<div style="top:' + (R + ty) + 'px;left:' + i + 'px;">*</div>')
65                     box.append(y);
66                     box.append(y1);
67                 }
68             }
69         });
70     
71     </script>
72 </head>
73 <body>
74     <div id="box" style="width: 504px; height: 504px; position: relative; top: 20px;
75         left: 300px; border: 0px solid black;">
76     </div>
77 </body>
78 </html>

話說,他還是比較圓的說。。。

進入正題

說起畫圓、正弦圖等肯定會經過一定計算的,所以稍稍復雜點:

① 創建路徑

② 創建圖形路徑

③ 路徑創建完成后關閉路徑

④ 設定繪制樣式調用方法繪制之

我是一個圓
 1 <!DOCTYPE html>
 2 <html xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4     <title></title>
 5     <script type="text/javascript">
 6         function draw() {
 7             //獲取canvas對象
 8             var canvas = document.getElementById('canvas');
 9             if (canvas == null) {
10                 return false;
11             }
12             var context = canvas.getContext('2d');
13             context.fillStyle = '#99d9ea';
14             context.fillRect(0, 0, 300, 200); //填充畫布結束
15             for (var i = 0; i < 5; i++) {
16                 context.beginPath();
17                 context.arc(i * 25, i * 25, i * 10, 0, Math.PI * 2, true);
18                 context.closePath();
19                 context.strokeStyle = 'red';
20                 context.fill();
21             }
22         }
23     </script>
24 </head>
25 <body>
26     <canvas id="canvas" width="300" height="200" >
27     </canvas>
28     <br />
29     <button onclick="draw();">
30         繪制圓</button>
31     <input type="color" />
32 </body>
33 </html>

我們來看看繪制圓過程中其它地方都沒有問題,但是創建圓路徑這塊值得考慮:

arc方法參數很多,依次是:
x
y
半徑
開始弧度(我們一般喜歡角度,所以要轉換)
結束弧度
順時針或者逆時針true為順時針
其它都好說,主要這個開始角度和結束角度我們來研究下,因為開始我沒搞懂,但后來我發現他其實很簡單了。。。 就是開始的角度和結束的角度嘛,和我們高中學的知識一樣的,只不過單位換算Math.PI/180為一度。。。。
反正還是沒說清楚,對了,記得我們高中畫圓的除了圓規和一個計量三角形角度的半圓直尺了嗎,我要說的角度就是那個。。。太坑爹了!
好像最右邊是0度,垂直是90度,水平是180度,既然如此,我們再來看看

 

正時針逆時針
 1 <!DOCTYPE html>
 2 <html xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4     <title></title>
 5     <script type="text/javascript">
 6         function draw() {
 7             //獲取canvas對象
 8             var canvas = document.getElementById('canvas');
 9             if (canvas == null) {
10                 return false;
11             }
12             var context = canvas.getContext('2d');
13             context.fillStyle = '#99d9ea';
14             context.fillRect(0, 0, 400, 300); //填充畫布結束
15 
16             context.beginPath();
17             context.arc(80, 80, 50, 0, 180 * Math.PI / 180, true);
18             context.closePath();
19             context.fillStyle = 'gray';
20             context.fill();
21 
22             context.beginPath();
23             context.arc(180, 180, 50, 0, 180 * Math.PI / 180, false);
24             context.closePath();
25             context.fillStyle = 'gray';
26             context.fill();
27 
28 
29         }
30     </script>
31 </head>
32 <body>
33     <canvas id="canvas" width="400" height="300">
34     </canvas>
35     <br />
36     <button onclick="draw();">
37         繪制圓</button>
38     <input type="color" />
39 </body>
40 </html>

我們發現正時針與逆時針還是有所不同的,

1  context.arc(180, 180, 50, 90 * Math.PI / 180, 290 * Math.PI / 180, true);

原諒我這里居然思考了半個小時,我甚至搜索了高中的資料。。。。

于是我好像明白了點什么。。。。。。

moveTo與lineTo

現上實驗結果:

兩次moveto
 1 <!DOCTYPE html>
 2 <html xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4     <title></title>
 5     <script type="text/javascript">
 6         function draw() {
 7             //獲取canvas對象
 8             var canvas = document.getElementById('canvas');
 9             if (canvas == null) {
10                 return false;
11             }
12             var context = canvas.getContext('2d');
13             context.fillStyle = '#99d9ea';
14             context.fillRect(0, 0, 300, 200); //填充畫布結束
15 
16             context.beginPath();
17             context.fillStyle = 'gray';
18             context.strokeStyle = 'black';
19 
20             context.moveTo(10, 10);
21             context.lineTo(150, 150);
22 
23             context.moveTo(10, 10);
24             context.lineTo(10, 150);
25 
26             context.closePath();
27             context.fill();
28             context.stroke();
29 
30         }
31     </script>
32 </head>
33 <body>
34     <canvas id="canvas" width="300" height="200">
35     </canvas>
36     <br />
37     <button onclick="draw();">
38         繪制</button>
39     <input type="color" />
40 </body>
41 </html>
一次moveto
 1 <!DOCTYPE html>
 2 <html xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4     <title></title>
 5     <script type="text/javascript">
 6         function draw() {
 7             //獲取canvas對象
 8             var canvas = document.getElementById('canvas');
 9             if (canvas == null) {
10                 return false;
11             }
12             var context = canvas.getContext('2d');
13             context.fillStyle = '#99d9ea';
14             context.fillRect(0, 0, 300, 200); //填充畫布結束
15 
16             context.beginPath();
17             context.fillStyle = 'gray';
18             context.strokeStyle = 'black';
19 
20             context.moveTo(10, 10);
21             context.lineTo(150, 150);
22 
23 //            context.moveTo(10, 10);
24             context.lineTo(10, 150);
25 
26             context.closePath();
27             context.fill();
28             context.stroke();
29 
30         }
31     </script>
32 </head>
33 <body>
34     <canvas id="canvas" width="300" height="200">
35     </canvas>
36     <br />
37     <button onclick="draw();">
38         繪制</button>
39     <input type="color" />
40 </body>
41 </html>
三次moveto
 1 <!DOCTYPE html>
 2 <html xmlns="http://www.w3.org/1999/xhtml">
 3 <head>
 4     <title></title>
 5     <script type="text/javascript">
 6         function draw() {
 7             //獲取canvas對象
 8             var canvas = document.getElementById('canvas');
 9             if (canvas == null) {
10                 return false;
11             }
12             var context = canvas.getContext('2d');
13             context.fillStyle = '#99d9ea';
14             context.fillRect(0, 0, 300, 200); //填充畫布結束
15 
16             context.beginPath();
17             context.fillStyle = 'gray';
18             context.strokeStyle = 'black';
19 
20             context.moveTo(10, 10);
21             context.lineTo(150, 150);
22 
23             context.moveTo(10, 10);
24             context.lineTo(10, 150);
25 
26             context.moveTo(10, 150);
27             context.lineTo(150, 150);
28 
29             context.closePath();
30             context.fill();
31             context.stroke();
32 
33         }
34     </script>
35 </head>
36 <body>
37     <canvas id="canvas" width="300" height="200">
38     </canvas>
39     <br />
40     <button onclick="draw();">
41         繪制</button>
42     <input type="color" />
43 </body>
44 </html>

以上代碼幾乎一樣,但是他產生的結果卻不同:

我認為,使用moveto后相當于新開一起點,之前的一筆勾銷,
若是只使用lineto的話,他會將幾個點連成線,若是可以組成圖形便會擁有中間色彩

  

?結語

?這章內容還比較多,我今天大概到極限了,換個時間再將他結束。?

轉載于:https://www.cnblogs.com/yexiaochai/archive/2013/04/17/3027220.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/259844.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259844.shtml
英文地址,請注明出處:http://en.pswp.cn/news/259844.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

或運算

邏輯或 ||int i, j, k;i 0x15;j 0x41;k i || j;反匯編代碼如下:MOV DWORD PTR SS:[EBP-4], 15MOV DWORD PTR SS:[EBP-C], 41CMP DWORD PTR SS:[EBP-4], 0JNZ SHORT asm_OR.00401029CMP DWORD PTR SS:[EBP-C], 0JNZ SHORT asm_OR.00401029MOV DWORD PTR SS:[EBP-10], 0JMP SH…

構造方法的調用順序和成員變量的初始化時機以及動態綁定

構造方法的調用順序&#xff1a;子類構造器中&#xff0c;JVM會自動的先調用父類的構造方法&#xff0c;然后再執行子類構造方法。在JVM自動調用父類構造方法的時候&#xff0c;會完成父類中擁有的成員變量的值的初始化操作&#xff0c;此時子類的成員變量并未初始化&#xff0…

Python interview_python

https://github.com/taizilongxu/interview_python 1 Python的函數參數傳遞 strings, tuples, 和numbers是不可更改的對象&#xff0c;而list,dict等則是可以修改的對象 2 Python中的元類(metaclass) 3 staticmethod和classmethod python 三個方法&#xff0c;靜態方法&#xf…

突然不能 ip訪問服務器文件夾,用友U8 工作站連接不到服務器,ping IP及服務器名都正常,訪問服務器共享文件夾也正常...

用友U8 U8存貨采購入庫單存貨現存量與存貨核算中的明細帳數量不符用友U8 U8存貨采購入庫單存貨現存量與存貨核算中的明細帳數量不符問題原因:錯誤原因見下面解決方案中的分析。解決方法:在查詢存貨明細帳和現存量09倉庫存貨510241數量為123&#xff0c;但在添采購入庫單紅字時卻…

rocketmq 消息 自定義_RocketMQ消息軌跡-設計篇

RocketMQ 消息軌跡主要包含兩篇文章&#xff1a;設計篇與源碼分析篇&#xff0c;本節將詳細介紹RocketMQ消息軌跡-設計相關。RocketMQ消息軌跡&#xff0c;主要跟蹤消息發送、消息消費的軌跡&#xff0c;即詳細記錄消息各個處理環節的日志&#xff0c;從設計上至少需要解決如下…

再次獻給那些心軟的人!!!

上次那篇日志朋友看了評論說&#xff1a;別太悲觀……為那些壞人成為壞人才是最不值得的&#xff01;而且好人說要當壞人就只是說說而已&#xff0c;真碰到啥事&#xff0c;依舊會傻傻的幫……沒錯&#xff0c;我還是傻傻的幫了&#xff0c;最初會表現出一點不樂意&#xff0c;…

手機做服務器性能咋樣,服務器性能不足 怎樣才能逼出最強狀態

而且&#xff0c;服務器的節能不僅僅意味著節省了電費&#xff0c;其后續的散熱降溫等工作都可以得到更好的節約。同時&#xff0c;服務器的在長時間工作的情況下&#xff0c;保持較低溫度有利于降低其承載負荷&#xff0c;最大限度發揮其能力&#xff0c;保障服務器工作運行的…

ASP.NET跨頁面傳值技巧總結

1. 使用QueryString變量 QueryString是一種非常簡單的傳值方式&#xff0c;他可以將傳送的值顯示在瀏覽器的地址欄中。如果是傳遞一個或多個安全性要求不高或是結構簡單的數值時&#xff0c;可以使用這個方法。但是對于傳遞數組或對象的話&#xff0c;就不能用這個方法了。下面…

RTMP協議中文翻譯(首發)(轉)

Adobe公司的實時消息傳輸協議 摘要 此備忘錄描述了 Adobe公司的實時消息傳輸協議(RTMP)&#xff0c;此協議從屬于應用層&#xff0c;被設計用來在適合的傳輸協議&#xff08;如TCP&#xff09;上復用和打包多媒體傳輸流&#xff08;如音頻、視頻和互動內容&#xff09;。 目錄 …

關卡 動畫 藍圖 運行_UE4入門之路(基礎藍圖篇):藍圖的制作

藍圖系統簡介藍圖系統是UE4中十分有代表性的一個特點&#xff0c;所謂藍圖就是一種可視化的腳本。該系統非常靈活且非常強大&#xff0c;因為它為設計人員提供了一般僅供程序員使用的所有概念及工具。 程序員能夠很方便的創建一個基礎系統&#xff0c;并交給策劃進一步在藍圖中…

overfitting(過度擬合)的概念

來自&#xff1a;http://blog.csdn.net/fengzhe0411/article/details/7165549 最近幾天在看模式識別方面的資料&#xff0c;多次遇到“overfitting”這個概念&#xff0c;最終覺得以下解釋比較容易接受&#xff0c;就拿出來分享下。 overfittingt是這樣一種現象&#xff1a;一個…

虛擬串口服務器zenetmanager,Avocent服務器/串口管理 KVM

MergePoint Unity交換機在單個設備中結合了 KVM over IP和串行控制臺管理技術。這項獨特的結合為IT管理員提供了用于訪問和控制服務器、網絡設備及其他數據中心和分支辦公室設備的完整遠程管理解決方案。MergePoint Unity交換機直接與物理KVM、USB和串行端口進行安全的遠程帶外…

KAFKA分布式消息系統

Kafka[1]是linkedin用于日志處理的分布式消息隊列&#xff0c;linkedin的日志數據容量大&#xff0c;但對可靠性要求不高&#xff0c;其日志數據主要包括用戶行為&#xff08;登錄、瀏覽、點擊、分享、喜歡&#xff09;以及系統運行日志&#xff08;CPU、內存、磁盤、網絡、系統…

jar打包 剔除第三方依賴以及它的依賴_面試官:為什么Spring Boot的jar可以直接運行?...

來源&#xff1a;Gormats Notesfangjian0423.github.io/2017/05/31/springboot-executable-jar/Spring Boot Loader抽象的一些類JarLauncher的執行過程關于自定義的類加載器LaunchedURLClassLoaderSpring Boot Loader的作用SpringBoot提供了一個插件spring-boot-maven-plugin用…

CQRS架構圖

2019獨角獸企業重金招聘Python工程師標準>>> 轉載于:https://my.oschina.net/darkness/blog/814243

SQLite中不支持的sql語法

今天很自然的在寫Sql語句的時候用了Top&#xff0c;一開始沒發現問題&#xff0c;因為我從數據庫讀出的值正好是0&#xff0c;而我習慣變量定義的時候也都賦值0&#xff0c;可是到我不要0的時候我就發現問題了。后來才知道&#xff0c;可愛的小sqlite竟然有不支持的sql語法。 看…

Analyzer普通用戶登錄不了[從網絡訪問此計算機]

問題&#xff1a; 最近客戶諾奇反映說Analyzer普通用戶登錄不了&#xff0c;但是發現管理員又可以登錄&#xff0c;幾經周折發現原來是系統的本地安全策略設置了不讓遠程使用本地賬戶密碼登錄系統導致。解決方案&#xff1a; 修改本地安全策略的“從遠程訪問此計算機”中的用戶…

金蝶系統服務器要求,金蝶服務器安裝及其相關要求.doc

K/3WISE創新管理平臺 V12.2標準部署環境說明目錄1. 多語言部署規則21.1 客戶端多語言部署規則21.2 中間層多語言部署規則31.3 數據庫多語言部署規則31.4 人力資源、管理門戶、CRM多語言部署規則41.5 Citrix遠程接入多語言部署規則42. 多語言部署架構圖52.1 簡體中間層52.2 繁體…

源碼 移植_FreeModbus移植總結

modbus是一項工業上經常用到的通訊協議&#xff0c;而freemodbus是一款開源的從機協議棧。關于它的移植網上已經有了很多的文章&#xff0c;但是大多都只是針對其中部分問題的表述。本文將會把自己在移植freemodbus過程中遇到的問題以及freemodbus的源碼分析盡量表述清楚。&…

expect腳本的簡單應用

expect是一個用來處理交互的命令。借助于expect我們可以把交互過程寫在一個腳本上&#xff0c;使之自動化完成。expect最核心的四個命令&#xff1a;send:用于向進程發送字符串 except:從進程接收字符串 spawn:打開一個新的進程 interact&#xff1a;保持交互的狀態首先一個簡單…