国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

HarmonyOS 基于ArkUI(ETS) 實現雷達掃描

系統 OpenHarmony
通過這個雷達Demo,特別是第三種方法,可以學到了顏色漸變屬性中的三種漸變,線性漸變,徑向漸變,和角度漸變。也可以學習屬性動畫的實現。

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

??https://ost.51cto.com??

前言

雷達掃描是一個比較有科技感的東西,對于科幻迷來說,科幻電影里基本都能看到的畫面,一個大大的屏幕上,可以看到雷達掃描的綠幕效果。
下面我們使用三種方式來實現這樣的雷達效果。

項目說明

  • 工具版本:DevEco Studio 3.0 Release
  • SDK版本:3.1.1.2(API Version 8 Release)
  • 主要組件:canvas, Row, Image

效果

  • 使用Image圖片組件方式實現

  • 使用canvas組件實現

  • 使用Row組件的漸變屬性實現

實現過程

需要注意,一個頁面里只能有一個@Entry修飾符,所以,下面三種方法在預覽的時候,需要注意注釋只保留一個@Entry

1、使用Image方法實現

使用Image組件的方法是最簡單的,直接制作兩張圖片,一張底圖,一張掃描的圖

#打卡不停更#  HarmonyOS 基于ArkUI(ETS) 實現雷達掃描-開源基礎軟件社區


#打卡不停更#  HarmonyOS 基于ArkUI(ETS) 實現雷達掃描-開源基礎軟件社區

將兩張圖片通過疊加,將掃描的圖片通過圓心宣旋轉即可,下面使用代碼來實現

@Entry
@Component
struct RadarImg {
@State angle:number = 0;
aboutToAppear(){
setTimeout(()=>{
this.angle = 360
},200)
}
build(){
Row(){
Stack(){
Image($r("app.media.radar_grid"))
.width(300)
.height(300)
Image($r('app.media.radar_sector'))
.width(300)
.height(300)
.rotate({
z: 1,
angle: this.angle
})
.animation({
duration: 2000,
curve:Curve.Linear,
iterations: -1,
})
}
}
.justifyContent(FlexAlign.Center)
.backgroundColor(0x111111)
.width('100%')
.height('100%')
}
}

整體比較簡單,旋轉主要用到了animation屬性,這些在官網API文檔可以查看。雖然使用Image組件實現比較簡單,但是卻是可以實現一些復雜的雷達UI。

2、使用canvas實現

使用canvas實現的需要用到兩個組件,第一個是Canvas組件,用來繪制底圖網格,第二個是Row組件,使用角漸變屬性實現旋轉的扇形。
這里為什么不都使用canvas實現呢,找了一圈,canvas只有線性漸變和徑向漸變,切沒有角度漸變屬性,所以,為了方便就用了row來實現吧。
下面直接上代碼。

Row的漸變方式在下一個方法講解,最終都還是使用animation屬性動畫實現扇形的旋轉效果

@Entry
@Component
struct RadarCanvas {
private settings: RenderingContextSettings = new RenderingContextSettings(true);
private ctx: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
@State angle:number = 0
// 繪制網格
drawGrid = (): void => {
let ctx = this.ctx;
ctx.lineWidth = 1
ctx.strokeStyle = 'green'
// arr數組是需要繪制的底圖圈圈
let arr:Array<number> = [150, 100, 50]
for(let i = 0; i < arr.length; i++){
ctx.beginPath()
ctx.arc(150, 150, arr[i] - 0.5, 0, 2 * Math.PI)
ctx.stroke()
}
// 繪制十字架
ctx.beginPath()
ctx.moveTo(0,150)
ctx.lineTo(300,150)
ctx.stroke()

ctx.beginPath()
ctx.moveTo(150,0)
ctx.lineTo(150,300)
ctx.stroke()
}
aboutToAppear(){
setTimeout(()=>{
this.angle = 360
},200)
}
build(){
Row(){
Stack(){
Canvas(this.ctx)
.onReady(()=>{
this.drawGrid()
})
.width(300)
.height(300)
Row()
.width(300)
.height(300)
.borderRadius(150)
.sweepGradient({
center: [150,150],
start: 0,
end: 359,
colors: [
['rgba(0,0,0,0)',0],
['rgba(0,0,0,0)',0.4],
['rgba(0,255,0,0.5)',1],
]
})
.rotate({
z: 1,
angle: this.angle
})
.animation({
duration: 2000,
iterations: -1,
curve: Curve.Linear
})
}
}
.justifyContent(FlexAlign.Center)
.backgroundColor(0x111111)
.width('100%')
.height('100%')
}
}

3、使用Row組件實現

使用Row組件實現的方法稍微復雜一些,這里用到了4個Row組件,其實對于前端童鞋來說,這里可能會比較好里一些,其實就是類似通過div和css來實現的,row組件是div,其屬性是css樣式。

廢話不多說,直接上代碼開搞

(1)實現圓圈圈

首先使用徑向漸變屬性(radialGradient)來實現底部圈圈的效果
radialGradient屬性有幾個需要注意的值,radius是漸變的半徑,這里使用30。
漸變顏色colors組用了三個數據,可以看出,前兩個其實是透明度為0的。
可以理解為

  • 第一個漸變顏色到第二個漸變顏色用了90%。
  • 第二個漸變顏色到第三個漸變顏色,用了10%(100%-90%)。
  • 也就是說在漸變半徑為30的情況下,有90%是透明的,只有10%是透明到green顏色的,這樣得到了一個圈圈。
  • 然后又設置了repeating屬性(重復著色)為true。
  • 所以在半徑為150的圓內,可以設置 150 / 3 = 5個圓圈圈。
Row()
.width(300)
.height(300)
.borderRadius(150)
.radialGradient({
center: [150,150],
radius: 30,
colors: [
['rgba(0,0,0,0)', 0],
['rgba(0,0,0,0)', 0.9],
['green', 1],
],
repeating: true,
})

我們看看效果:

#打卡不停更#  HarmonyOS 基于ArkUI(ETS) 實現雷達掃描-開源基礎軟件社區

(2)實現十字架

實現十字架使用了兩個Row組件,使用線性漸變屬性(linearGradient)分別繪制了一橫一豎的效果。
可以看到顏色組colors使用了5個顏色來實現,1,2,4,5的顏色都是透明的。

  • 第一個顏色到第二個顏色都是透明的,漸變范圍是0到49%。
  • 第二個顏色到第三個顏色漸變范圍是50% - 49% = 1%,也就是在其50%(中間)的地方繪制了一個1%的green線條
  • 第三個顏色到第四個顏色不變。
  • 第三個到第五個顏色也是透明,漸變范圍也是50%。

上面繪制好之后,我們通過angle屬性將線條旋轉90度得到一個十字架。

Row()
.width(300)
.height(300)
.borderRadius(150)
.linearGradient({
angle: 0,
colors: [
['rgba(0,0,0,0)', 0],
['rgba(0,0,0,0)',0.49],
['green',0.5],
['rgba(0,0,0,0)',0.5],
['rgba(0,0,0,0)',1]
]
})
Row()
.width(300)
.height(300)
.borderRadius(150)
.linearGradient({
angle: 90,
colors: [
['rgba(0,0,0,0)', 0],
['rgba(0,0,0,0)',0.49],
['green',0.5],
['rgba(0,0,0,0)',0.5],
['rgba(0,0,0,0)',1]
]
})

來看看效果:

#打卡不停更#  HarmonyOS 基于ArkUI(ETS) 實現雷達掃描-開源基礎軟件社區

(3)實現旋轉扇形

扇形也是用到Row組件,其角度漸變屬性(sweepGradient)來實現的。

Row()
.width(300)
.height(300)
.borderRadius(150)
.sweepGradient({
center: [150,150],
start: 0,
end: 359,
colors: [
['rgba(0,0,0,0)',0],
['rgba(0,0,0,0)',this.flag],
['rgba(0,255,0,0.5)',1],
]
})

來看看效果:

#打卡不停更#  HarmonyOS 基于ArkUI(ETS) 實現雷達掃描-開源基礎軟件社區

最后設置rotate旋轉屬性,設置旋轉軸為z軸,角度angle為動態更新,這樣animation動畫屬性才會更新。
最終代碼:
扇形的代碼:

Row()
.width(300)
.height(300)
.borderRadius(150)
.sweepGradient({
center: [150,150],
start: 0,
end: 359,
colors: [
['rgba(0,0,0,0)',0],
['rgba(0,0,0,0)',this.flag],
['rgba(0,255,0,0.5)',1],
]
})
.rotate({
z: 1,
angle: this.angle
})
.animation({
duration: 2000,
iterations: -1,
curve: Curve.Linear
})

這里添加一個掃描周邊設備的效果,動態設置了一個數據源,通過ForEach來動態渲染。

ForEach(this.scanData,(item: any) => {
Column(){
Image($r('app.media.icon'))
.width(28)
.height(28)
.backgroundColor('#fff')
.borderRadius(19)
Text(item.name)
.fontColor('#fff')
.margin({top: 5})
.fontSize(10)
}
.alignItems(HorizontalAlign.Center)
.position({x: item.x, y: item.y})
.scale({x: this.w, y: this.h})
.animation({
duration: 1000,
iterations: 1,
curve: Curve.Friction
})
.opacity(this.opt)
})

最終的代碼:

// 雷達掃描組件
@Entry
@Component
struct Radar {
@State angle:number = 0;
@State scanData: any = []
@State w:number = 0;
@State h:number = 0;
@State opt:number = 1
@State flag:number = 0.4
aboutToAppear(){
setTimeout(()=>{
this.angle = 360
},200)
setTimeout(()=>{
animateTo({
duration: 1000, // 動畫時長
curve: Curve.Linear, // 動畫曲線
iterations: -1, // 播放次數
playMode: PlayMode.AlternateReverse, // 動畫模式
onFinish: () => {
console.info('play end')
}
}, () => {
this.opt = 0.3
})
},2000)
setTimeout(()=>{
this.scanData = [
{
id: 1,
x: 190,
y: 200,
name: '空調'
},
{
id: 1,
x: 80,
y: 240,
name: '插座'
},
]
setTimeout(()=>{
this.w = 1;
this.h = 1;
},200)
},1000)

}
build(){
Row(){
Stack(){
Row()
.width(300)
.height(300)
.borderRadius(150)
.radialGradient({
center: [150,150],
radius: 30,
colors: [
['rgba(0,0,0,0)', 0],
['rgba(0,0,0,0)', 0.9],
['green', 1],
],
repeating: true,
})
Row()
.width(300)
.height(300)
.borderRadius(150)
.linearGradient({
angle: 0,
colors: [
['rgba(0,0,0,0)', 0],
['rgba(0,0,0,0)',0.49],
['green',0.5],
['rgba(0,0,0,0)',0.5],
['rgba(0,0,0,0)',1]
]
})
Row()
.width(300)
.height(300)
.borderRadius(150)
.linearGradient({
angle: 90,
colors: [
['rgba(0,0,0,0)', 0],
['rgba(0,0,0,0)',0.49],
['green',0.5],
['rgba(0,0,0,0)',0.5],
['rgba(0,0,0,0)',1]
]
})
Row()
.width(300)
.height(300)
.borderRadius(150)
.sweepGradient({
center: [150,150],
start: 0,
end: 359,
colors: [
['rgba(0,0,0,0)',0],
['rgba(0,0,0,0)',this.flag],
['rgba(0,255,0,0.5)',1],
]
})
.rotate({
z: 1,
angle: this.angle
})
.animation({
duration: 2000,
iterations: -1,
curve: Curve.Linear
})
ForEach(this.scanData,(item: any) => {
Column(){
Image($r('app.media.icon'))
.width(28)
.height(28)
.backgroundColor('#fff')
.borderRadius(19)
Text(item.name)
.fontColor('#fff')
.margin({top: 5})
.fontSize(10)
}
.alignItems(HorizontalAlign.Center)
.position({x: item.x, y: item.y})
.scale({x: this.w, y: this.h})
.animation({
duration: 1000,
iterations: 1,
curve: Curve.Friction
})
.opacity(this.opt)
})
}
.width(300)
.height(300)
}
.justifyContent(FlexAlign.Center)
.width('100%')
.height('100%')
.backgroundColor(0x111111)
}
}

來看看最終完整的效果:

#打卡不停更#  HarmonyOS 基于ArkUI(ETS) 實現雷達掃描-開源基礎軟件社區

git地址

https://gitee.com/yango520/yg-radar。

總結

通過這個雷達demo,特別是第三種方法,可以學到了顏色漸變屬性中的三種漸變,線性漸變,徑向漸變,和角度漸變。也可以學習屬性動畫的實現。

??想了解更多關于開源的內容,請訪問:??

??51CTO 開源基礎軟件社區??

??https://ost.51cto.com??。

責任編輯:jianghua 來源: 51CTO開源基礎軟件社區
相關推薦

2022-10-24 14:49:54

ArkUI心電圖組件

2022-09-05 15:22:27

ArkUIets

2022-02-23 15:07:22

HarmonyOS常用控制ArkUI-eTS

2022-07-04 16:34:46

流光按鈕Stack

2022-02-23 15:36:46

ArkUI-eTS事件監聽鴻蒙

2021-11-26 10:08:57

鴻蒙HarmonyOS應用

2022-07-13 16:24:12

ArkUI(JS)打地鼠游戲

2022-09-21 14:51:21

ArkUI信件彈出

2022-09-14 15:17:26

ArkUI鴻蒙

2022-10-17 14:36:09

ArkUI虛擬搖桿組件

2022-08-05 19:27:22

通用API鴻蒙

2022-09-16 15:34:32

CanvasArkUI

2022-01-25 17:05:44

ArkUI_eTS操作系統鴻蒙

2022-08-22 17:28:34

ArkUI鴻蒙

2022-07-05 16:13:37

ArkUI-eTS智能晾曬系統

2024-01-11 15:54:55

eTS語言TypeScript應用開發

2022-04-13 11:24:18

ETS開發HarmonyOS鴻蒙

2023-03-13 15:03:05

鴻蒙ArkUI

2022-08-12 19:13:07

etswifi連接操作

2015-09-22 10:43:37

微信雷達
點贊
收藏

51CTO技術棧公眾號

成人小视频免费观看| 精品一区二区三区免费毛片爱| 亚洲白拍色综合图区| 一级日本免费的| 国产成人免费视频网站高清观看视频| 国产乱码一区| 久久裸体网站| 日韩视频免费在线观看| 中文精品一区二区三区| 伊人久久亚洲热| 国产美女久久久| 成人免费观看在线网址| 久久综合久久99| 美女av免费观看| 麻豆精品久久久| 亚洲草草视频| 久久精品国产精品亚洲精品| 日韩欧美激情一区二区| 国产欧美日本| 就去色蜜桃综合| 久久精品人人| 中文字幕99| 国产成人亚洲精品青草天美| 免费观看中文字幕| 成人自拍视频在线观看| 五十路熟女丰满大屁股| 91偷拍与自偷拍精品| 啊啊啊一区二区| 国产视频911| 97公开免费视频| 国产精品传媒入口麻豆| 91大神影片| 午夜久久久影院| 1769视频在线播放免费观看| 日韩欧美资源站| 性欧美18一19sex性欧美| 日韩视频在线免费| 国产精品自在| 国产91免费观看| 亚洲成人男人天堂| 91官网在线观看| yellow91字幕网在线| 91网站视频在线观看| 免费男同深夜夜行网站| 亚洲乱码国产乱码精品精的特点| 一级一片免费视频| 欧美色爱综合网| 丁香花电影在线观看完整版| 亚洲午夜av电影| 久久a级毛片毛片免费观看| 91精品久久久久久久久| 久久久久看片| 国产免费观看高清视频| 亚洲韩国一区二区三区| 在线观看男女av免费网址| 日韩一区二区av| 韩日一区二区三区| 久久国产精品久久精品国产| 丁香婷婷综合色啪| 日韩国产伦理| 网站一区二区| 欧美专区在线视频| 亚洲伦伦在线| 欧美日本视频在线观看| 亚洲韩日在线| 黄色一级片国产| 亚洲综合一区二区| 国模雨婷捆绑高清在线| 久久久极品av| 偷拍欧美精品| 久久久久久久9| 亚洲综合在线视频| 国精产品一区一区三区mba下载| 久久精品99久久久久久久久| 婷婷久久国产对白刺激五月99| 欧美日韩在线免费观看视频| 亚洲另类在线制服丝袜| 鲁鲁在线中文| 国产精品久久久久久影视| 久久9热精品视频| 毛片视频免费观看| 亚洲欧美国产一区二区三区| 欧美大黑bbbbbbbbb在线| 天堂av免费看| 第一福利永久视频精品| 亚洲免费一区| 日本一区二区精品视频| 一区二区视频在线看| 快播电影网址老女人久久| 亚洲r级在线观看| 2023国产精品| japanese色国产在线看视频| 国产精品自拍视频| 久久亚洲二区三区| 999精品网| 99影视tv| 亚洲日本丝袜连裤袜办公室| 日韩伦理在线一区| 91精品国产99久久久久久红楼| 国产亚洲人成网站| 日本不良网站在线观看| 国产一区免费视频| 亚洲影视在线播放| 欧美午夜在线播放| 毛片在线视频观看| 日韩欧美国产综合| 天天操综合网| 又黄又爽无遮挡| 久久久久久国产三级电影| 国产精品资源网| 午夜激情在线| 国产精品乱码视频| 午夜久久福利影院| 日韩欧美国产大片| 亚欧在线免费观看| zzjj国产精品一区二区| 极品少妇xxxx偷拍精品少妇| 日本美女在线中文版| 成人免费在线网址| 亚洲综合激情网| 啄木系列成人av电影| 亚洲 激情 在线| 欧美黑人视频一区| 久久精品在线观看| 亚洲免费看片| 免费无码毛片一区二三区| 亚洲老司机av| 国产大陆精品国产| 成人在线观看免费播放| 亚洲五码在线观看视频| 亚洲精品美女久久久| 久久99精品久久只有精品| 主播国产精品| 欧美一进一出视频| 欧美一区二区视频免费观看| 激情文学一区| 麻豆tv在线| 日韩理论片在线观看| 日韩一区二区三区av| 久久综合五月| heyzo在线欧美播放| 色撸撸在线观看| 色偷偷av一区二区三区乱| 91麻豆高清视频| 黄色欧美网站| 最近中文字幕mv免费高清在线| 国产欧美日韩中文字幕| 色婷婷久久一区二区三区麻豆| 怡红院精品视频在线观看极品| 国产网站在线免费观看| 亚洲最新在线| 最新中文字幕亚洲| 国产亚洲一区二区三区在线观看| 欧美日韩一本| 在线视频资源站| 欧美亚洲丝袜| 中文国产亚洲喷潮| 国产精品久久久久久一区二区三区| 欧美调教在线| 亚洲高清成人影院| 青青草成人网| 日韩专区在线播放| 亚洲另类在线一区| 亚洲美女黄色| 偷拍中文亚洲欧美动漫| 日韩精品视频一二三| 国产日韩欧美91| 欧美一区二区日韩一区二区| 国产一区二区伦理| 香蕉国产成人午夜av影院| 污视频在线观看免费| 午夜欧美一区二区三区免费观看| 亚洲欧美在线播放| 亚洲精品美国一| 久久久久99| 亚洲精品一二三**| 狠狠色伊人亚洲综合网站l| 亚洲欧美日本国产有色| 日韩中文字幕在线看| 亚洲电影激情视频网站| 日本视频一区二区| 久久资源综合| a视频网址在线观看| 亚洲熟妇无码av在线播放| 欧美一区三区三区高中清蜜桃| 欧美日韩一级黄| 久久嫩草精品久久久精品一| 亚洲国产精品成人| 日韩精品麻豆| 久久久久国产精品嫩草影院| 成人免费播放器| 不卡一区二区三区视频| 久久精品国产电影| 欧美色男人天堂| 国产色婷婷亚洲99精品小说| 国产精品毛片一区二区三区| 97久久综合精品久久久综合| 成人片在线看| 毛片.com| 给我免费播放片在线观看|