精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

HarmonyOS基于 ArkUI 中 TS 擴(kuò)展聲明式開(kāi)發(fā)范式

OpenHarmony技術(shù)社區(qū) ? 來(lái)源:HarmonyOS技術(shù)社區(qū) ? 作者:HarmonyOS技術(shù)社區(qū) ? 2022-01-04 14:19 ? 次閱讀

本來(lái)計(jì)劃要做一個(gè)本地?cái)?shù)據(jù)庫(kù)存儲(chǔ)相關(guān)的項(xiàng)目,但是官方的小伙伴給我說(shuō),ArkUI 數(shù)據(jù)庫(kù)目前不支持最新模擬器,所以只能另想其他的。

想了大概一周,期間也在調(diào)研技術(shù)能否實(shí)現(xiàn),最終定了這個(gè)項(xiàng)目,真正的敲代碼開(kāi)發(fā)大概就用了一天,最難的就是想法和界面設(shè)計(jì)。

不得不感慨新框架真的方便、真的好用!期待下個(gè)版本能完善組件和 API 的細(xì)節(jié)。也希望 HarmonyOS 越來(lái)越好。

界面搭建基于 ArkUI 中 TS 擴(kuò)展的聲明式開(kāi)發(fā)范式,關(guān)于語(yǔ)法和概念直接看官網(wǎng)官方文檔地址。

基于 TS 擴(kuò)展的聲明式開(kāi)發(fā)范式 1:

https://developer.harmonyos.com/cn/docs/documentation/doc-guides/ui-ts-overview-0000001192705715
基于 TS 擴(kuò)展的聲明式開(kāi)發(fā)范式 2:
https://developer.harmonyos.com/cn/docs/documentation/doc-references/ts-framework-directory-0000001111581264

項(xiàng)目說(shuō)明

使用系統(tǒng)自帶的網(wǎng)絡(luò)請(qǐng)求框架,根據(jù) Tab 的類(lèi)型切換請(qǐng)求對(duì)應(yīng)的數(shù)據(jù)。列表支持下拉刷新、上拉加載更多。

模擬登錄效果,根據(jù)輸入框來(lái)確定按鈕是否啟用,登錄成功后,顯示登錄頭像和用戶(hù)信息。

①數(shù)據(jù)請(qǐng)求:聚合免費(fèi) API-新聞?lì)^條

https://www.juhe.cn/docs/api/id/235
②網(wǎng)絡(luò)請(qǐng)求:1-官方文檔、2-ArkUI 開(kāi)發(fā)基礎(chǔ):網(wǎng)絡(luò)請(qǐng)求
https://developer.harmonyos.com/cn/docs/documentation/doc-references/js-apis-net-http-0000001168304341
https://developer.huawei.com/consumer/cn/forum/topic/0203723866728880326?fid=0101591351254000314
③列表刷新:ArkUI(TS)聲明式開(kāi)發(fā):列表下拉刷新、上拉加載更多
https://developer.huawei.com/consumer/cn/forum/topic/0203729154661360497?fid=0101591351254000314

效果演示

在遠(yuǎn)程模擬器錄制的,效果不佳:

功能解析

①首頁(yè)

首頁(yè)從上至下分為三個(gè)部分:

標(biāo)題欄

Tab 標(biāo)簽

數(shù)據(jù)列表

標(biāo)題欄:布局很簡(jiǎn)單,使用 Row 布局包裹:Image 和 Swiper(搜索框中文字上下切換)。

部分代碼:

......
//標(biāo)題欄
@BuilderCustomTitleBar(){
Row(){
//頭像
Image(this.isLogin?$r('app.media.ic_ldd_headpic'):$r('app.media.ic_default_headpic'))
.width(30)
.height(30)
.borderRadius(15)
.margin({right:10})
.onClick(()=>{
this.openSideMenu()
})

//搜索框
Row(){
//搜索圖標(biāo)
Image($r('app.media.ic_search'))
.width(15).height(15)
.margin({left:10})

//視圖上下切換
Swiper(){
ForEach(this.listSearch,item=>{
Text(item)
.height('100%')
.fontSize(12)
.fontColor('#505050')
.margin({left:10})
},item=>item)
}
.vertical(true)//方向:縱向
.autoPlay(true)//自動(dòng)播放
.indicator(false)//隱藏指示器
.interval(3000)//切換間隔時(shí)間3秒
}
.layoutWeight(1)
.height('100%')
.backgroundColor('#F1F1F1')
.borderRadius(15)
}
.width('100%')
.height(50)
.backgroundColor(Color.White)
.padding({top:10,bottom:10,left:15,right:15})
}
......

Tab 標(biāo)簽:這個(gè)也比較簡(jiǎn)單,根據(jù)屏幕寬度、tab 標(biāo)簽的總數(shù)量,就能得出 tabItem 的寬度。

底部設(shè)置的指示器,點(diǎn)擊 tab 根據(jù) index(當(dāng)前索引) * itemWithd(每個(gè) tab 的寬度)設(shè)置屬性動(dòng)畫(huà),切換效果就可以了。

import{TabModel,getTabList}from'../../model/tabModel.ets';
importdisplayfrom'@ohos.display';
@Component
exportstructHomeTabs{
//Tab數(shù)據(jù)
privatelistTab=getTabList()
//tabItem平均寬度
@StatetabIndicatorWidth:number=152
//指示器
@StatetabIndex:number=0
//對(duì)外暴露的方法
privatetabClick:(item:TabModel)=>void

privateaboutToAppear(){
display.getDefaultDisplay((err,data)=>{
if(!err){
//獲取tabItem平均寬度
this.tabIndicatorWidth=data.width/this.listTab.length
}
})
}

build(){
Column(){
Stack({alignContent:Alignment.Bottom}){
//tab內(nèi)容
Row(){
ForEach(this.listTab,item=>{
Button(){
Text(item.name)
.fontSize(this.tabIndex==item.id?15:13)//根據(jù)當(dāng)前選中改變字體大小
.fontColor(this.tabIndex==item.id?$r('app.color.app_theme'):'#000000')//根據(jù)當(dāng)前選中改變字體顏色
}
.layoutWeight(1)
.height(35)
.type(ButtonType.Normal)
.backgroundColor(Color.White)
.onClick(()=>{
this.tabIndex=item.id//更新索引
this.tabClick(item)//提供給外部調(diào)用
})
},item=>item.tabType)
}.height(35)

//指示器
Row(){
Divider()
.width(`${this.tabIndicatorWidth}px`)//平均寬度
.strokeWidth(3)
.color($r('app.color.app_theme'))
.lineCap(LineCapStyle.Round)//圓角
.padding({left:10,right:10})
.offset({x:`${this.tabIndex*this.tabIndicatorWidth}px`,y:0})//改變偏移量
.animation({duration:300})//屬性動(dòng)畫(huà)
}.width('100%')
}.backgroundColor(Color.White)
Divider().color('#e8e8e8')
}
}
}

數(shù)據(jù)列表:根據(jù)數(shù)據(jù)的不同,展示的 item 的布局樣式也不同,分為兩種情況:?jiǎn)螐垐D片和多張圖片,下拉刷新和加載更多功能看我之前的寫(xiě)的帖子。

部分代碼:

......
List(){
ForEach(this.listNews,(item:NewsData)=>{
ListItem(){
Column(){
//根據(jù)數(shù)據(jù),展示不同的布局樣式
if(item.thumbnail_pic_s02==undefined){
//單張圖片樣式
this.ItemSinglePic(item)
}else{
//多張圖片樣式
this.ItemMorePic(item)
}
}.width('100%')
}.padding(10)
},item=>item.uniquekey)
}
.divider({strokeWidth:1,color:'#f5f5f5'})
......

②側(cè)邊欄

側(cè)邊欄沒(méi)有加入手勢(shì)控制,只是簡(jiǎn)單的點(diǎn)擊頭像動(dòng)畫(huà)打開(kāi)、點(diǎn)擊陰影部分動(dòng)畫(huà)關(guān)閉,默認(rèn)關(guān)閉狀態(tài)。

從以下代碼看下,只需要設(shè)置值,設(shè)置屬性動(dòng)畫(huà)之后,側(cè)邊欄動(dòng)畫(huà)效果就出來(lái)了,也是很方便的。

@Entry
@Component
structMainPage{
//屏幕寬度
privatescreenWidth=0
//側(cè)邊欄的x位置
@StatesideBarX:number=-2000
//側(cè)邊欄背景的透明度
@StatesideBarBgopacity:number=0
//側(cè)邊欄背景顯示值
@StatesideBarBgVisibility:Visibility=Visibility.Hidden

privateaboutToAppear(){
display.getDefaultDisplay((err,data)=>{
if(!err){
//獲取屏幕寬度
this.screenWidth=data.width
//設(shè)置側(cè)邊欄偏移量:負(fù)屏幕寬度
this.sideBarX=-this.screenWidth
}
})
}

//打開(kāi)側(cè)邊欄
privateopenSideMenu(){
this.sideBarX=0
this.sideBarBgopacity=1
this.sideBarBgVisibility=Visibility.Visible
}

//關(guān)閉側(cè)邊欄
privatecloseSideMenu(){
this.sideBarX=-this.screenWidth
this.sideBarBgopacity=0
}

build(){
Stack(){
Column(){
//主頁(yè)界面
}

//半透明背景
Stack()
.width('100%')
.height('100%')
.backgroundColor('#80000000')
.opacity(this.sideBarBgopacity)
.animation({//屬性動(dòng)畫(huà),當(dāng)透明度為0,隱藏背景
duration:300,
onFinish:()=>{
if(this.sideBarBgopacity==0){
this.sideBarBgVisibility=Visibility.Hidden
}
}
})
.visibility(this.sideBarBgVisibility)

//側(cè)邊欄
Row(){
Column(){
SideMenu({isLogin:$isLogin,closeMenu:()=>{
this.closeSideMenu()//側(cè)邊欄布局
}})
}
.width('70%')
.height('100%')
.backgroundColor(Color.White)

Blank().onClick(()=>{
this.closeSideMenu()
})
}
.width('100%')
.height('100%')
.position({x:`${this.sideBarX}px`,y:0})//動(dòng)態(tài)改變位置
.animation({duration:300})//屬性動(dòng)畫(huà)
}
.width('100%')
.height('100%')
}
}

③登錄

登錄也比較簡(jiǎn)單,只不過(guò)目前官網(wǎng)沒(méi)有輸入框的文檔資料,這個(gè)輸入框還是我從Codelabs:流式布局(eTS)上面看到的。根據(jù)輸入框是否有內(nèi)容判斷按鈕的啟用狀態(tài)。

雖然粘貼到編輯器中代碼提示有錯(cuò),但是可以正常運(yùn)行和預(yù)覽。密碼框的類(lèi)型還是我猜的!哈哈,就猜對(duì)了。

e99f038e-630c-11ec-b2e9-dac502259ad0.png

④保存登錄狀態(tài)

根據(jù)官網(wǎng)資料:輕量級(jí)存儲(chǔ)、官網(wǎng)示例還是有問(wèn)題。

https://developer.harmonyos.com/cn/docs/documentation/doc-references/js-apis-data-storage-0000001117163542

我是問(wèn)了華為的小伙伴,他給我說(shuō)這個(gè)路徑需要在 /data/data/,但是目前模擬器對(duì)這塊功能還兼容的不完善,不能持久化,如果把程序后臺(tái)殺死,數(shù)據(jù)就沒(méi)了。

importdataStoragefrom'@ohos.data.storage';
//設(shè)置存儲(chǔ)的路徑,路徑必須在/data/data/下
constSTORAGE_PATH='/data/data/info'

exportclassInfoStorage{
//保存用戶(hù)ID
setUserId(userId:string){
letstore=dataStorage.getStorageSync(STORAGE_PATH)
store.putSync('userId',userId)
}

//獲取用戶(hù)ID
getUserId(){
letstore=dataStorage.getStorageSync(STORAGE_PATH)
returnstore.getSync('userId','').toString()
}

}

項(xiàng)目地址如下(需要登錄才能看到演示圖):

https://gitee.com/liangdidi/NewsDemo.git

作者:梁青松

原文標(biāo)題:HarmonyOS版“新聞?lì)^條”APP開(kāi)發(fā)實(shí)戰(zhàn)

文章出處:【微信公眾號(hào):HarmonyOS技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

審核編輯:彭菁

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)庫(kù)
    +關(guān)注

    關(guān)注

    7

    文章

    3765

    瀏覽量

    64276
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4748

    瀏覽量

    68355
  • HarmonyOS
    +關(guān)注

    關(guān)注

    79

    文章

    1967

    瀏覽量

    30018

原文標(biāo)題:HarmonyOS版“新聞?lì)^條”APP開(kāi)發(fā)實(shí)戰(zhàn)

文章出處:【微信號(hào):gh_834c4b3d87fe,微信公眾號(hào):OpenHarmony技術(shù)社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    HarmonyOS開(kāi)發(fā)ArkUI案例:【常用布局容器對(duì)齊方式】

    基于ArkTS擴(kuò)展聲明開(kāi)發(fā)范式,實(shí)現(xiàn)Flex、Column、Row和Stack四種常用布局容器對(duì)齊方式。
    的頭像 發(fā)表于 05-08 16:47 ?1521次閱讀
    <b class='flag-5'>HarmonyOS</b><b class='flag-5'>開(kāi)發(fā)</b><b class='flag-5'>ArkUI</b>案例:【常用布局容器對(duì)齊方式】

    HarmonyOS應(yīng)用開(kāi)發(fā)-關(guān)于TS語(yǔ)言的整體理解

    基于TS擴(kuò)展聲明開(kāi)發(fā)范式的方舟開(kāi)發(fā)框架是為
    發(fā)表于 11-30 11:03

    HarmonyOS應(yīng)用開(kāi)發(fā)-ArkUI聲明UI工程體驗(yàn)與分享

    2.組件和裝飾器@Component在自定義組件之前,需要先了解什么是組件和裝飾器,并進(jìn)行初始化組件。然后通過(guò)修改組件屬性和構(gòu)造參數(shù),實(shí)現(xiàn)一個(gè)自定義組件。在聲明UI,所有的頁(yè)面都是由組件構(gòu)成。組件
    發(fā)表于 12-08 10:22

    課程預(yù)告丨12月15日官方直播帶你領(lǐng)略ArkUI聲明開(kāi)發(fā)范式之美

    HarmonyOS系列課程的第五期“Hello Codelabs:分布新聞客戶(hù)端實(shí)戰(zhàn)(eTS)”線上直播來(lái)啦!華為軟件開(kāi)發(fā)工程師Jacky將帶你領(lǐng)略ArkUI
    發(fā)表于 12-10 17:52

    HarmonyOS快速入門(mén)資料分享

    Studio官方安裝指導(dǎo)地址2.文檔預(yù)覽相關(guān)組件指導(dǎo)openharmony基于TS擴(kuò)展聲明開(kāi)發(fā)范式
    發(fā)表于 03-11 17:16

    Hello HarmonyOS學(xué)習(xí)筆記:分布新聞客戶(hù)端實(shí)戰(zhàn)(JS、eTS)

    開(kāi)發(fā)框架(ArkUI),其中JAVA UI框架是基于Java拓展的命令開(kāi)發(fā),方舟開(kāi)發(fā)框架是基于JS拓展的類(lèi)Web
    發(fā)表于 06-23 20:08

    HDD杭州站?ArkUI開(kāi)發(fā)更靈活

    應(yīng)用UI開(kāi)發(fā)時(shí)所必須的能力,幫助提升HarmonyOS應(yīng)用界面開(kāi)發(fā)效率。隨著HarmonyOS的版本更新迭代,ArkUI的能力也在不斷
    發(fā)表于 08-05 11:33

    4天帶你上手HarmonyOS ArkUI開(kāi)發(fā)

    本次HarmonyOS ArkUI入門(mén)訓(xùn)練營(yíng)課程--健康生活實(shí)戰(zhàn)篇,手把手教大家如何制作一個(gè)合理膳食的APP前端Demo!課程實(shí)戰(zhàn)樣例通過(guò)ArkUI聲明
    發(fā)表于 09-09 14:44

    4天帶你上手HarmonyOS ArkUI開(kāi)發(fā)——《HarmonyOS ArkUI入門(mén)訓(xùn)練營(yíng)之健康生活實(shí)戰(zhàn)》

    框架實(shí)現(xiàn)。ArkUI采用極簡(jiǎn)的聲明UI描述界面語(yǔ)法,只需用幾行簡(jiǎn)單直觀的聲明代碼,即可完成界面功能,內(nèi)置了豐富而精美
    發(fā)表于 01-05 11:49

    HarmonyOS/OpenHarmony應(yīng)用開(kāi)發(fā)-ArkTS的聲明開(kāi)發(fā)范式

    語(yǔ)法的解析能力、跨語(yǔ)言調(diào)用支持的能力和TS語(yǔ)言高性能運(yùn)行環(huán)境。聲明UI后端引擎****后端引擎提供了兼容不同開(kāi)發(fā)范式的UI渲染管線,提供多
    發(fā)表于 01-17 15:09

    HarmonyOS/OpenHarmony應(yīng)用開(kāi)發(fā)-聲明開(kāi)發(fā)范式組件匯總

    組件是構(gòu)建頁(yè)面的核心,每個(gè)組件通過(guò)對(duì)數(shù)據(jù)和方法的簡(jiǎn)單封裝,實(shí)現(xiàn)獨(dú)立的可視、可交互功能單元。組件之間相互獨(dú)立,隨取隨用,也可以在需求相同的地方重復(fù)使用。聲明開(kāi)發(fā)范式目前可供選擇的組件如
    發(fā)表于 01-19 11:14

    OpenHarmony應(yīng)用開(kāi)發(fā)-ArkUI方舟開(kāi)發(fā)框架簡(jiǎn)析

    聲明UI語(yǔ)法擴(kuò)展而來(lái)的ArkTS語(yǔ)言,從組件、動(dòng)畫(huà)和狀態(tài)管理三個(gè)維度提供UI繪制能力。 類(lèi)Web開(kāi)發(fā)范式:采用經(jīng)典的HML、CSS、Jav
    發(fā)表于 04-23 09:35

    HarmonyOS優(yōu)選主力應(yīng)用開(kāi)發(fā)語(yǔ)言-ArkTS概述

    之前,建議開(kāi)發(fā)者具備TS語(yǔ)言開(kāi)發(fā)能力。 當(dāng)前,ArkTS在TS的基礎(chǔ)上主要擴(kuò)展了如下能力: 基本語(yǔ)法:ArkTS定義了
    發(fā)表于 06-09 10:52

    如何在鴻蒙上實(shí)現(xiàn)聊天列表滑動(dòng)刪除功能

    ?? 本項(xiàng)目基于 ArkUI TS 擴(kuò)展聲明開(kāi)發(fā)
    的頭像 發(fā)表于 12-03 10:55 ?3079次閱讀

    ETS是否適合金融界面的開(kāi)發(fā)

    HarmonyOS 在去年年底已經(jīng)更新了 API7,最大的更新就是基于 TS 擴(kuò)展聲明開(kāi)發(fā)
    的頭像 發(fā)表于 04-21 07:48 ?1255次閱讀