女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

鴻蒙系統中制作demo特效組件

OpenHarmony技術社區 ? 來源:鴻蒙技術社區 ? 作者:木棉花潘穎琳 ? 2021-11-01 14:37 ? 次閱讀

之前看到“粒子消散”的特效組件,于是就產生想法(自己也弄個特效組件應該挺有意思的)。

這個煙花特效可以添加到游戲勝利的界面中,可能還有其他應用場景哈哈。這也算是我做的第一個組件原創 demo 啦!

有三種模式可以選擇,一種是圖案只有五角星,一種是圖案只有三角形,還有一種是圖案既有五角星又有三角星。顏色有 10 種,還有背景音樂(自己 DIY 的煙花音效)!話不多說,開整!

創建一個空白的工程

DevEco Studio 下載安裝成功后,打開 DevEco Studio,點擊左上角的 File,點擊 New,再選擇 New Project,選擇 Empty Ability。

然后點擊 Next,給項目命名 Framework,選擇設備類型 Phone,選擇語言類型 JS 最后點擊 Finish。

代碼刪除的部分如下:

在 entry>src>main>js>default>pages.index>index.hml 文件里把以下代碼刪掉:
class="title">
{{$t('strings.hello')}}{{title}}

在 entry>src>main>js>default>pages.index>index.js 文件里把以下代碼刪掉:

title:""
onInit(){
this.title=this.$t('strings.world');
}

在 entry>src>main>js>default>pages.index>index.css 文件里把 container 部分以下的代碼刪掉。

布局設計

①index.hml

該組件是畫布組件,畫布的大小是整個屏幕,而按鈕是顯示畫布上方的,所以要添加個棧組件,依次放入畫布組件和按鈕組件。

代碼如下,注意這里畫布組件添加了觸摸事件 touchstartfunc,下文會講解這步。

class="stack">
class="canvas"ref="canvas"@touchstart='touchstartfunc'>
"button"class="STAR"value="五角星"onclick="click_star"/>
"button"class="TRIANGLE"value="三角形"onclick="click_triangle"/>
"button"class="MIX"value="混合"onclick="click_mix"/>

②index.css

給畫布組件和按鈕組件設置屬性,代碼如下:

.canvas{
width:100%;
height:100%;
background-color:black;
}
.STAR{
width:80px;
height:38px;
font-size:20px;
background-color:blue;
border-color:blue;
text-color:aquamarine;
top:660px;
left:40px;
}
.TRIANGLE{
width:80px;
height:38px;
font-size:20px;
background-color:blue;
border-color:blue;
text-color:aquamarine;
top:660px;
left:150px;
}
.MIX{
width:80px;
height:38px;
font-size:20px;
background-color:blue;
border-color:blue;
text-color:aquamarine;
top:660px;
left:260px;
}

此時打開模擬器,你就能得到上面效果圖左 1 圖,接下來做功能實現部分。

繪制圖案

①五角星

函數 draw_star 傳的參數分別是煙花釋放的圓心坐標,圖案的顏色,圖案移動的斜率,圖案是否填充顏色。

定義的變量中,x 和 y 是圖案中心的坐標,根據時間推移(會設定定時器,下文會講)move_times 增加,圖案會沿著傳進來的斜率方向作直線移動,以達到煙花綻放的效果。

變量 a-h 都是為了便于繪制五角星的圖案而設的公式參數值,全局變量 r_star 是五角星的邊長,最后根據公式去繪制單個五角星圖案。

index.js:先在 export default 上方定義變量。

varctx;
varmove_times=1;
varr_star=5;
varr_triangle=14;

然后在 export default 下方添加代碼:

onShow(){
ctx=this.$refs.canvas.getContext('2d');
},

draw_Star(x_1,y_1,color,x_2,y_2,fill){
letx=x_1+move_times*x_2;
lety=y_1+move_times*y_2;
leta=r_star*Math.sin(Math.PI/10);
letb=r_star*Math.cos(Math.PI/10);
letc=(r_star+a)*Math.tan(Math.PI/10);
letd=(r_star+a)*Math.tan(Math.PI/5)-c;
lete=r_star*Math.sin(Math.PI/5);
letf=r_star*Math.cos(Math.PI/5);
letg=(r_star+2*a)*Math.cos(2*Math.PI/5);
leth=(r_star+2*a)*Math.sin(2*Math.PI/5);

ctx.lineWidth=1;
ctx.beginPath();
ctx.moveTo(x-r_star-a,y-c);
ctx.lineTo(x-a,y-c);
ctx.lineTo(x,y-b-c);
ctx.lineTo(x+a,y-c);
ctx.lineTo(x+a+r_star,y-c);
ctx.lineTo(x+a+r_star-f,y+e-c);
ctx.lineTo(x+a+g,y+h-c);
ctx.lineTo(x,y+d);
ctx.lineTo(x-a-g,y+h-c);
ctx.lineTo(x-a-r_star+f,y+e-c);
ctx.closePath();
ctx.stroke();
move_times=move_times+1;
},

②三角星

同樣, draw_triangle 是繪制單個三角形并沿設定斜率移動的函數,函數的參數類型及作用與五角星的一致。

全局變量 r_triangle 為三角形的邊長,代碼如下:

draw_Triangle(x_1,y_1,color,x_2,y_2,fill){
letx=x_1+move_times*x_2;
lety=y_1+move_times*y_2;
ctx.lineWidth=1;
ctx.beginPath();
ctx.moveTo(x-r_triangle/2,y+Math.sqrt(3)*r_triangle/6);
ctx.lineTo(x,y-Math.sqrt(3)*r_triangle/3);
ctx.lineTo(x+r_triangle/2,y+Math.sqrt(3)*r_triangle/6);
ctx.closePath();
ctx.stroke();

move_times=move_times+1;
},

③圖案的美化

設置了 10 種顏色的顏色字典,通過繪制圖案函數 draw 中的參數 color 去控制顏色(黑色是作保護作用),顏色可通過單獨設置數字 1-10 來選擇,也可以通過隨機數(1~10)去隨機變化顏色。

顏色填充也是如此,1 為不填充,2 為填充,也可隨機產生 1 或 2 來隨機變化是否填充顏色。

vardrawcolors=[0,1,2,3,4,5,6,7,8,9,10];
constCOLORS={
"0":'black',
"1":"#FF2E10",
"2":"#FB8D15",
"3":"#F4ED1C",
"4":"#C5F31D",
"5":"#51F11F",
"6":"#18F8F8",
"7":"#1166FF",
"8":"#9833DD",
"9":"#FC14EB",
"10":"#C64A6A"
}

draw 函數中,在 ctx.lineWidth 下方,在 ctx.beginPath 上方添加代碼:

ctx.strokeStyle=COLORS[drawcolors[color].toString()];

在 ctx.stroke 下方添加代碼:

if(fill==2){
ctx.fillStyle=COLORS[drawcolors[color].toString()];
ctx.fill();
};

draw 開頭的函數是繪制單個圖案,接下來的 Draw 函數是繪制 8 個或 10 個圖案圍成圓形向外同速率擴展的圖像,run 開頭的函數是被循環的函數。

繪制煙花

①煙花的布局

綻放的煙花的形狀是一個圓形,火花為單個圖案。我設計了兩種煙花綻放數量,一種是一個圓中有 8 個圖案的,一種是一個圓中有 10 個圖案的。

它們的斜率都通過數學公式定義好了(如下的全局變量所示),單個圖案沿斜率方向每次移動的距離為全局變量 R 的數值。

varR=0.25;
vars=R*Math.cos(Math.PI/5);
vart=R*Math.sin(Math.PI/5);
varv=R*Math.cos(Math.PI/2.5);
varw=R*Math.sin(Math.PI/2.5);

Draw_Star_8(click_x,click_y){
this.draw_Star(click_x,click_y,1,-R,0,Math.floor(Math.random()*2+1));
this.draw_Star(click_x,click_y,2,-R/Math.sqrt(2),-R/Math.sqrt(2),Math.floor(Math.random()*2+1));
this.draw_Star(click_x,click_y,3,0,-R,Math.floor(Math.random()*2+1));
this.draw_Star(click_x,click_y,4,R/Math.sqrt(2),-R/Math.sqrt(2),Math.floor(Math.random()*2+1));
this.draw_Star(click_x,click_y,5,R,0,Math.floor(Math.random()*2+1));
this.draw_Star(click_x,click_y,6,R/Math.sqrt(2),R/Math.sqrt(2),Math.floor(Math.random()*2+1));
this.draw_Star(click_x,click_y,7,0,R,Math.floor(Math.random()*2+1));
this.draw_Star(click_x,click_y,8,-R/Math.sqrt(2),R/Math.sqrt(2),Math.floor(Math.random()*2+1));
},

Draw_Star_10(click_x,click_y,fill){
this.draw_Star(click_x,click_y,Math.floor(Math.random()*10+1),-R,0,fill);
this.draw_Star(click_x,click_y,Math.floor(Math.random()*10+1),-s,-t,fill);
this.draw_Star(click_x,click_y,Math.floor(Math.random()*10+1),-v,-w,fill);
this.draw_Star(click_x,click_y,Math.floor(Math.random()*10+1),v,-w,fill);
this.draw_Star(click_x,click_y,Math.floor(Math.random()*10+1),s,-t,fill);
this.draw_Star(click_x,click_y,Math.floor(Math.random()*10+1),R,0,fill);
this.draw_Star(click_x,click_y,Math.floor(Math.random()*10+1),s,t,fill);
this.draw_Star(click_x,click_y,Math.floor(Math.random()*10+1),v,w,fill);
this.draw_Star(click_x,click_y,Math.floor(Math.random()*10+1),-v,w,fill);
this.draw_Star(click_x,click_y,Math.floor(Math.random()*10+1),-s,t,fill);
},

Draw_Triangle_8(click_x,click_y,fill){
this.draw_Triangle(click_x,click_y,Math.floor(Math.random()*10+1),-R,0,fill);
this.draw_Triangle(click_x,click_y,Math.floor(Math.random()*10+1),-R/Math.sqrt(2),-R/Math.sqrt(2),fill);
this.draw_Triangle(click_x,click_y,Math.floor(Math.random()*10+1),0,-R,fill);
this.draw_Triangle(click_x,click_y,Math.floor(Math.random()*10+1),R/Math.sqrt(2),-R/Math.sqrt(2),fill);
this.draw_Triangle(click_x,click_y,Math.floor(Math.random()*10+1),R,0,fill);
this.draw_Triangle(click_x,click_y,Math.floor(Math.random()*10+1),R/Math.sqrt(2),R/Math.sqrt(2),fill);
this.draw_Triangle(click_x,click_y,Math.floor(Math.random()*10+1),0,R,fill);
this.draw_Triangle(click_x,click_y,Math.floor(Math.random()*10+1),-R/Math.sqrt(2),R/Math.sqrt(2),fill);
},

Draw_Triangle_10(click_x,click_y){
this.draw_Triangle(click_x,click_y,1,-R,0,Math.floor(Math.random()*2+1));
this.draw_Triangle(click_x,click_y,2,-s,-t,Math.floor(Math.random()*2+1));
this.draw_Triangle(click_x,click_y,3,-v,-w,Math.floor(Math.random()*2+1));
this.draw_Triangle(click_x,click_y,4,v,-w,Math.floor(Math.random()*2+1));
this.draw_Triangle(click_x,click_y,5,s,-t,Math.floor(Math.random()*2+1));
this.draw_Triangle(click_x,click_y,6,R,0,Math.floor(Math.random()*2+1));
this.draw_Triangle(click_x,click_y,7,s,t,Math.floor(Math.random()*2+1));
this.draw_Triangle(click_x,click_y,8,v,w,Math.floor(Math.random()*2+1));
this.draw_Triangle(click_x,click_y,9,-v,w,Math.floor(Math.random()*2+1));
this.draw_Triangle(click_x,click_y,10,-s,t,Math.floor(Math.random()*2+1));
},

②火花的移動

上述提過一個 movetimes,火花的移動無非就是坐標的變化,通過設置一個定時器,循環繪制圖案就能實現移動的效果,先構造一個被循環的函數 run_star(舉五角星的實例,三角形同理;位置,美化等的參數隨意)。

代碼如下:

run_star(){
this.Draw_Star_10(200,300,1);
this.Draw_Star_10(150,200,2);
this.Draw_Star_8(300,218);
this.Draw_Star_8(110,380);
},

然后添加定時器:

vartimer_star=null;
vartimer_triangle=null;
vartimer_mix=null;

點擊按鈕“五角星”時會釋放圖案為五角星的煙花:

click_star(){
timer_star=setInterval(this.run_star,120);
},

此時,打開模擬器,你會看到圖案移動了,但上一個圖案沒有清除:

05b09e9a-3ac5-11ec-82a9-dac502259ad0.png

所以要給被循環的函數添加一個清空操作(為了保護清空函數,要先在清空前加點東西),在 this.Draw 函數之前添加以下代碼:

this.draw_Star(0,0,0,0,0,0);
ctx.clearRect(0,0,400,800);

③煙花的結束

按上述步驟下來,會發現煙花的圓形越來越大,最終出界。為了實現煙花的結束,可以根據 movetimes 的增加次數來控制煙花綻放范圍的大小。

通過透明度的遞減,最終透明度減為 0,圖案消失:

varo=1;

在 draw 函數里的開頭位置添加以下代碼:

if((move_times>=230&&move_times<=330)){
o=o-0.01;
ctx.globalAlpha=o;
};

④煙花的循環綻放

在 draw 函數里的開頭位置添加以下代碼:

if(move_times==342){
o=1;
ctx.globalAlpha=o;
move_times=1;
};

同理可以設置“三角形”和“混合”的被循環函數:

run_triangle(){
this.draw_Triangle(0,0,0,0,0,0);
ctx.clearRect(0,0,400,800);
this.Draw_Triangle_8(200,300,1);
this.Draw_Triangle_8(150,200,2);
this.Draw_Triangle_10(300,218);
this.Draw_Triangle_10(110,380);
},

run_mix(){
this.draw_Triangle(0,0,0,0,0,0);
ctx.clearRect(0,0,400,800);
this.Draw_Triangle_8(200,300,1);
this.Draw_Star_10(150,200,2);
this.Draw_Triangle_10(300,218);
this.Draw_Star_8(110,380);
},

點擊處綻放煙花

先獲取點擊處相對于畫布組件左上角的坐標,然后作為新煙花綻放的圓心坐標傳參,這里的 click_b1,click_b2 下文會講解。

vartimer_click=null;
run_touch(){
if(click_b2==true){
this.draw_Star(x,y,0,0,0);
ctx.clearRect(0,0,400,800);
this.Draw_Star_10(x,y,1);
}
},

touchstartfunc(msg){
click_b1==true;
x=msg.touches[0].globalX;
y=msg.touches[0].globalY;
if(click_b1==true){
timer_click=setInterval(this.run_touch,120);
click_b1=false;
timer_click=null;
}
},

煙花圖案的切換

通過設定布爾型變量來控制點擊另一個按鈕時,清空上一個按鈕運行的定時器。

varstar_b=true;
varmix_b=true;
vartriangle_b=true;
varclick_b1=true;
varclick_b2=true;

click_star(){
click_b2=false;
clearInterval(timer_triangle);
timer_triangle=null;
clearInterval(timer_mix);
timer_mix=null;
ctx.clearRect(0,0,400,800);
if(star_b==true){
timer_star=setInterval(this.run_star,120);
star_b=false;
}
triangle_b=true;
mix_b=true;
},

click_triangle(){
click_b2=false;
clearInterval(timer_star);
timer_star=null;
clearInterval(timer_mix);
timer_mix=null;
ctx.clearRect(0,0,400,800);
if(triangle_b==true){
timer_triangle=setInterval(this.run_triangle,120);
triangle_b=false;
}
star_b=true;
mix_b=true;
},

click_mix(){
click_b2=false;
clearInterval(timer_star);
timer_star=null;
clearInterval(timer_triangle);
timer_triangle=null;
ctx.clearRect(0,0,400,800);
if(mix_b==true){
timer_mix=setInterval(this.run_mix,120);
mix_b=false;
}
star_b=true;
triangle_b=true;
},

背景音樂的添加

js 模板中添加音頻可以去看我之前的文章:

https://harmonyos.51cto.com/posts/7802

index.hml:

<videoid='videoId'
src='/common/flr_5_1.mp3'
autoplay='true'
controls="false"
onfinish='finishCallback'>video>

index.js:

varvideo_b=true;

在 src/common/ 下加入音頻文件:

finishCallback:function(){
if(video_b==true){
this.$element('videoId').start();
}
},

別忘了生命周期的設置,在應用啟動時自動播放音頻,在應用隱藏的時候暫停播放音頻并清空所有定時器,在應用銷毀時清空所有定時器,停止播放音頻。

onShow(){
ctx=this.$refs.canvas.getContext('2d');
this.$element('videoId').start();
},

onHide(){
clearInterval(timer_star);
timer_star=null;
clearInterval(timer_triangle);
timer_triangle=null;
clearInterval(timer_mix);
timer_mix=null;
clearInterval(timer_click);
timer_click=null;
video_b=false;
this.$element('videoId').pause();
},

onDestroy(){
clearInterval(timer_star);
timer_star=null;
clearInterval(timer_triangle);
timer_triangle=null;
clearInterval(timer_mix);
timer_mix=null;
clearInterval(timer_click);
timer_click=null;
video_b=false;
this.$element('videoId').pause();
},

結語

以上就是我這次的小分享啦!自己的第一個 demo 開發,略微粗糙!更多資料請關注我們的項目 :Awesome-Harmony_木棉花。

https://gitee.com/hiharmonica/awesome-harmony-os-kapok

點擊關注鴻蒙技術社區了解鴻蒙一手資訊 06343b4c-3ac5-11ec-82a9-dac502259ad0.gif

求分享

06343b4c-3ac5-11ec-82a9-dac502259ad0.gif

求點贊

06343b4c-3ac5-11ec-82a9-dac502259ad0.gif

求在看


原文標題:我做的第一款鴻蒙demo!

文章出處:【微信公眾號:HarmonyOS技術社區】歡迎添加關注!文章轉載請注明出處。


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 操作系統
    +關注

    關注

    37

    文章

    7091

    瀏覽量

    124962
  • 鴻蒙系統
    +關注

    關注

    183

    文章

    2639

    瀏覽量

    67708
  • HarmonyOS
    +關注

    關注

    79

    文章

    2053

    瀏覽量

    32145

原文標題:我做的第一款鴻蒙demo!

文章出處:【微信號:gh_834c4b3d87fe,微信公眾號:OpenHarmony技術社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    Kuikly鴻蒙版正式開源 —— 揭秘卓越性能適配之旅

    系統化工作,同時為了達到高性能、原生渲染、動態化等適配目標,進行了持續的探索和優化。其核心適配工作包括:對接鴻蒙UI系統,封裝原子組件,對接事件
    發表于 06-04 16:46

    開源啦?。?!基于鴻蒙ArkTS封裝的圖表組件《McCharts》,大家快來一起共創

    的地方請大家高抬貴手,寬容一下,謝謝。 這次主要是給大家帶來一個重磅消息,就是我自己使用鴻蒙ArkTS語法開發的圖表組件今日正式開源了。為什么?原因有兩點吧! 鴻蒙是國產的操作系統,
    發表于 03-15 15:21

    AIGC入門及鴻蒙入門

    JDK、配置SDK等。 3. 開發實踐: 學習鴻蒙系統的架構和API,了解其組件化、分布式等特性。 通過官方文檔和社區資源,學習和掌握鴻蒙應用的開發流程和技巧。 總結來說,AIGC作為
    發表于 01-13 10:32

    鴻蒙原生頁面高性能解決方案上線OpenHarmony社區 助力打造高性能原生應用

    高性能鴻蒙原生應用。 Nodepool:優化頁面滑動流暢性Nodepool旨在解決應用頁面滑動卡頓問題。開發,相似頁面因業務和代碼差異,組件復用性差,引發卡頓、丟幀,影響用戶體驗。Nodepool通過
    發表于 01-02 18:00

    鴻蒙Flutter實戰:14-現有Flutter 項目支持鴻蒙 II

    引言 在之前的文章鴻蒙Flutter實戰:09-現有Flutter項目支持鴻蒙,介紹了如何改造項目,適配鴻蒙平臺。 文中講述了整體的理念和思路,本文更進一步,結合可實操的項目代碼,詳
    發表于 12-26 14:59

    鴻蒙原生開發手記:01-元服務開發

    簡介 元服務是鴻蒙的一種輕量應用形態,無需下載,直接運行。類似于微信小程序,但與小程序不同的是,元服務更加輕量。 元服務使用原生開發,是系統級提供的,無論從易用性、性能、體驗上,都要比小程序好
    發表于 11-14 17:28

    AIGC在視頻內容制作的應用前景

    AIGC技術能夠顯著縮短視頻內容的制作周期。通過AI算法,可以快速生成視頻剪輯、特效、字幕和配樂等,減少人工操作的時間。例如,在短視頻制作,AIGC技術可以自動找到最佳剪輯點、裁剪
    的頭像 發表于 10-25 15:44 ?1569次閱讀

    鴻蒙ArkTS容器組件:Stack

    堆疊容器,子組件按照順序依次入棧,后一個子組件覆蓋前一個子組件。
    的頭像 發表于 07-15 18:23 ?1273次閱讀

    計算機系統的關鍵組件有哪些

    在計算機系統,關鍵組件的協同工作構成了其強大的數據處理和運算能力。這些組件不僅決定了計算機的性能,還影響著用戶的使用體驗。以下是對計算機系統
    的頭像 發表于 07-15 18:18 ?2377次閱讀

    鴻蒙ArkTS容器組件:Scroll

    可滾動的容器組件,當子組件的布局尺寸超過父組件的尺寸時,內容可以滾動。
    的頭像 發表于 07-12 15:24 ?1852次閱讀

    鴻蒙ArkTS容器組件:ListItemGroup

    組件用來展示列表item分組,寬度默認充滿[List]組件,必須配合List組件來使用。
    的頭像 發表于 07-10 09:20 ?1186次閱讀
    <b class='flag-5'>鴻蒙</b>ArkTS容器<b class='flag-5'>組件</b>:ListItemGroup

    鴻蒙ArkTS容器組件:GridCol

    柵格子組件,必須作為柵格容器組件([GridRow])的子組件使用。
    的頭像 發表于 07-08 15:17 ?718次閱讀
    <b class='flag-5'>鴻蒙</b>ArkTS容器<b class='flag-5'>組件</b>:GridCol

    鴻蒙ArkTS容器組件:Flex

    以彈性方式布局子組件的容器組件。
    的頭像 發表于 07-08 10:19 ?830次閱讀
    <b class='flag-5'>鴻蒙</b>ArkTS容器<b class='flag-5'>組件</b>:Flex

    鴻蒙基礎組件:AlphabetIndexer

    可以與容器組件聯動用于按邏輯結構快速定位容器顯示區域的組件。
    的頭像 發表于 06-19 09:30 ?600次閱讀
    <b class='flag-5'>鴻蒙</b>基礎<b class='flag-5'>組件</b>:AlphabetIndexer

    怎么調用managed_components/下面組件demo?

    想運行rgb_panel示例里lvgl組件demo, (路徑是managed_componentslvgl__lvgldemos) ESP-IDF SDK Configuration Editor
    發表于 06-11 07:37