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

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

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

鴻蒙版微信聊天UI效果實(shí)現(xiàn)!

OpenHarmony技術(shù)社區(qū) ? 來(lái)源:鴻蒙技術(shù)社區(qū) ? 作者:鴻蒙技術(shù)社區(qū) ? 2021-11-15 09:35 ? 次閱讀

最近開(kāi)發(fā)中要做一個(gè)類似微信聊天的工單系統(tǒng)客服中心界面(安卓版)所以想著也模仿一個(gè)鴻蒙版(基于 Java UI 的,JS UI 版本的后期更新哈) 那么廢話不多數(shù)說(shuō)我們正式開(kāi)始。

具體實(shí)現(xiàn)

mainabiilty 布局文件:

<DependentLayout
xmlns:ohos="http://schemas.huawei.com/res/ohos"
ohos:height="match_parent"
ohos:width="match_parent"
ohos:alignment="center"
ohos:orientation="vertical">

<DependentLayout
ohos:id="$+id:company_page_dl"
ohos:height="50vp"
ohos:width="match_parent"
ohos:orientation="horizontal"
ohos:align_parent_bottom="true"
>

<Button
ohos:id="$+id:main_my_btn"
ohos:width="match_content"
ohos:height="match_content"
ohos:text="發(fā)送"
ohos:text_size="35vp"
ohos:align_parent_right="true"
ohos:background_element="$graphic:background_btn"
>
Button>
<TextField
ohos:id="$+id:main_textfiled"
ohos:width="match_parent"
ohos:height="match_parent"
ohos:hint="請(qǐng)輸入你的消息"
ohos:vertical_center="true"
ohos:text_size="50"
ohos:left_of="$id:main_my_btn"
ohos:layout_alignment="left"
>
TextField>
DependentLayout>

<ListContainer
ohos:above="$id:company_page_dl"
ohos:id="$+id:main_list"
ohos:height="match_parent"
ohos:width="match_parent"
>
ListContainer>

DependentLayout>
觀察布局文件,我們可以看到寫(xiě)了一個(gè)列表控件 ListContainer 來(lái)裝載發(fā)送出去的消息和接收到的消息。

然后底部寫(xiě)了一個(gè) TextField 控件來(lái)處理用戶的輸入和一個(gè) button 來(lái)觸發(fā)發(fā)送的動(dòng)作。

邏輯代碼

我們初始化對(duì)應(yīng)控件并且 listContainer 和適配器綁定到一起:

privatevoidinitview(){
listContainer=(ListContainer)findComponentById(ResourceTable.Id_main_list);
textField=(TextField)findComponentById(ResourceTable.Id_main_textfiled);
mainbtn=(Button)findComponentById(ResourceTable.Id_main_my_btn);
mainbtn.setClickedListener(this);
myProvider=newMyProvider(data,getAbility());
listContainer.setItemProvider(myProvider);
myProvider.notifyDataChanged();//有新消息時(shí),刷新ListView中的顯示
}

①初始默認(rèn)假數(shù)據(jù)

我們方便展示就寫(xiě)了 3 條假數(shù)據(jù)僅供展示:

privatevoidinitMsg(){
Msgmsg1=newMsg("你好",Msg.RECEIVED);
data.add(msg1);
Msgmsg2=newMsg("你好呀",Msg.SENT);
data.add(msg2);
Msgmsg3=newMsg("很高興認(rèn)識(shí)你",Msg.RECEIVED);
data.add(msg3);
}

②用戶輸入邏輯:
@Override
publicvoidonClick(Componentcomponent){
content=textField.getText().toString();
switch(component.getId()){
caseResourceTable.Id_main_my_btn:
if(!flag){
Msgmsg=newMsg(content,Msg.SENT);
data.add(msg);
flag=true;
}else{
Msgmsg=newMsg(content,Msg.RECEIVED);
data.add(msg);
flag=false;
}
myProvider.notifyDataChanged();//有新消息時(shí),刷新ListView中的顯示
textField.setText("");//清空輸入框的內(nèi)容
break;

default:
break;

}

}
我們通過(guò)一個(gè)布爾值 flag 來(lái)做一個(gè)開(kāi)關(guān)處理用戶輸入的,動(dòng)作輪流來(lái)處理是接收到消息還是發(fā)送出消息。

發(fā)送消息:

Msgmsg=newMsg(content,Msg.SENT);
data.add(msg);

接收消息:

Msgmsg=newMsg(content,Msg.RECEIVED);
data.add(msg);

bena 類

packagecom.example.imdemo.bean;

publicclassMsg{

publicstaticfinalintRECEIVED=0;//收到一條消息

publicstaticfinalintSENT=1;//發(fā)出一條消息

privateStringcontent;//消息的內(nèi)容

privateinttype;//消息的類型

publicMsg(Stringcontent,inttype){
this.content=content;
this.type=type;
}

publicStringgetContent(){
returncontent;
}

publicintgetType(){
returntype;
}
}
我們分別定義了 2 個(gè)常量和 2 個(gè)變量來(lái)處理我們的消息邏輯。

適配器

適配器 item.xml 布局:


<DirectionalLayout
xmlns:ohos="http://schemas.huawei.com/res/ohos"
ohos:height="match_content"
ohos:width="match_parent"
ohos:orientation="vertical">
<DirectionalLayout
ohos:id="$+id:left_layout"
ohos:height="match_content"
ohos:width="match_content"
ohos:layout_alignment="left"
ohos:background_element="$graphic:background_blue"
ohos:left_margin="5vp"
ohos:visibility="visible"
ohos:top_margin="10vp"
>

<Text
ohos:id="$+id:left_msg"
ohos:height="match_content"
ohos:width="match_content"
ohos:text="哈哈哈測(cè)試"
ohos:text_color="#fff"
ohos:text_size="20vp"
ohos:margin="10vp"
>
Text>

DirectionalLayout>



<DirectionalLayout
ohos:id="$+id:right_Layout"
ohos:height="match_content"
ohos:width="match_content"
ohos:layout_alignment="right"
ohos:background_element="$graphic:background_red"
ohos:right_margin="5vp"
ohos:visibility="visible"
>
<Text
ohos:id="$+id:right_msg"
ohos:height="match_content"
ohos:width="match_content"
ohos:text="哈哈哈測(cè)試"
ohos:text_color="#fff"
ohos:text_size="20vp"
ohos:margin="10vp"
>
Text>
DirectionalLayout>
DirectionalLayout>

item 布局預(yù)覽效果:

19f2e066-458d-11ec-b939-dac502259ad0.png適配器邏輯代碼:
packagecom.example.imdemo.provider;
importcom.example.imdemo.ResourceTable;
importcom.example.imdemo.bean.Msg;
importohos.aafwk.ability.Ability;
importohos.agp.components.*;

importjava.util.List;

publicclassMyProviderextendsBaseItemProvider{

privateListlist;
privateAbilityability;


publicMyProvider(Listlist,Abilityability){
this.list=list;
this.ability=ability;
}

@Override
publicintgetCount(){
returnlist.size();
}

@Override
publicObjectgetItem(inti){
returnlist.get(i);
}

@Override
publiclonggetItemId(inti){
returni;
}

@Override
publicComponentgetComponent(inti,Componentcomponent,ComponentContainercomponentContainer){

ViewHodlerhodler=null;
Msgmsg=list.get(i);
if(component==null){
component=LayoutScatter.getInstance(ability).parse(ResourceTable.Layout_item,null,false);
hodler=newViewHodler();
hodler.leftLayout=(DirectionalLayout)component.findComponentById(ResourceTable.Id_left_layout);
hodler.rightLayout=(DirectionalLayout)component.findComponentById(ResourceTable.Id_right_Layout);
hodler.leftMsg=(Text)component.findComponentById(ResourceTable.Id_left_msg);
hodler.rightMsg=(Text)component.findComponentById(ResourceTable.Id_right_msg);
component.setTag(hodler);
}else{
hodler=(ViewHodler)component.getTag();
}
System.out.println("type--->"+msg.getType());
if(msg.getType()==Msg.RECEIVED){
System.out.println("左邊消息");
//如果是收到的消息,則顯示左邊消息布局,將右邊消息布局隱藏
hodler.leftLayout.setVisibility(0);
hodler.rightLayout.setVisibility(1);
hodler.leftMsg.setText(msg.getContent());
}elseif(msg.getType()==Msg.SENT){
System.out.println("右邊消息");
//如果是發(fā)出去的消息,顯示右邊布局的消息布局,將左邊的消息布局隱藏
hodler.rightLayout.setVisibility(0);
hodler.leftLayout.setVisibility(1);
hodler.rightMsg.setText(msg.getContent());
}
returncomponent;
}

classViewHodler{
DirectionalLayoutleftLayout;
DirectionalLayoutrightLayout;
TextleftMsg;
TextrightMsg;

}
}
我們通過(guò)在 getComponent 方法中通過(guò)小標(biāo) i 來(lái)遍歷集合然后拿到里面每一個(gè)對(duì)應(yīng)里面的 type 屬性來(lái)判斷是顯示左邊布局還是右邊布局。 也就是對(duì)應(yīng)的發(fā)送消息和接收消息的 UI,我們通過(guò)簡(jiǎn)單布局顯示影藏來(lái)實(shí)現(xiàn)消息的左右兩邊顯示效果,到此整個(gè)仿微信聊天的布局 UI 效果就講完了 。

總結(jié)

鴻蒙的仿微信聊天 UI 效果實(shí)現(xiàn)起來(lái)相對(duì)比較簡(jiǎn)單,其實(shí)還有一種辦法那就是 ListContainer 的多布局也是通過(guò) bean 里面的標(biāo)識(shí)來(lái)顯示左右不同的布局實(shí)現(xiàn)聊天界面的效果。

因?yàn)槠邢捱@里就不展開(kāi)講了有興趣的同學(xué)可以私下研究。最后希望我的文章能幫助到各位解決問(wèn)題,以后我還會(huì)貢獻(xiàn)更多有用的代碼分享給大家。

項(xiàng)目地址:

https://gitee.com/qiuyu123/hms_im_demo
編輯:jq

聲明:本文內(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)投訴
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    2987

    瀏覽量

    107243
  • JS
    JS
    +關(guān)注

    關(guān)注

    0

    文章

    78

    瀏覽量

    18410
  • ui
    ui
    +關(guān)注

    關(guān)注

    0

    文章

    206

    瀏覽量

    21703
  • 鴻蒙
    +關(guān)注

    關(guān)注

    59

    文章

    2542

    瀏覽量

    43834

原文標(biāo)題:鴻蒙版微信聊天UI效果實(shí)現(xiàn)!

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    鴻蒙Next實(shí)現(xiàn)瀑布流布局

    為了實(shí)現(xiàn)類似真實(shí)瀑布流不斷加載新數(shù)據(jù)的效果,可以結(jié)合鴻蒙的 LazyForEach 組件,在滾動(dòng)到列表底部時(shí)觸發(fā)數(shù)據(jù)加載邏輯 六、網(wǎng)絡(luò)權(quán)限 // config.json { \"module
    發(fā)表于 06-10 14:17

    HarmonyOS實(shí)戰(zhàn):快遞信息時(shí)間軸效果實(shí)現(xiàn)

    前言 快遞信息時(shí)間軸在購(gòu)物軟件中是必不可少的功能,通過(guò)時(shí)間軸可以展示快遞從發(fā)貨到派送的每一個(gè)環(huán)節(jié)。本篇文章通過(guò)代碼的形式詳細(xì)講解在鴻蒙日常開(kāi)發(fā)中如何實(shí)現(xiàn)時(shí)間軸的效果。(篇尾附有完整源碼) 實(shí)現(xiàn)
    的頭像 發(fā)表于 06-09 16:05 ?92次閱讀
    HarmonyOS實(shí)戰(zhàn):快遞信息時(shí)間軸<b class='flag-5'>效果實(shí)現(xiàn)</b>

    Kuikly鴻蒙版正式開(kāi)源 —— 揭秘卓越性能適配之旅

    的 ArkUI 來(lái)編寫(xiě)的,UI組件由數(shù)據(jù)和UI描述組成,UI更新只能通過(guò)修改其綁定的數(shù)據(jù)來(lái)實(shí)現(xiàn)。渲染層怎樣驅(qū)動(dòng)聲明式的ArkUI成為了鴻蒙
    發(fā)表于 06-04 16:46

    國(guó)科受邀出席2025開(kāi)源鴻蒙開(kāi)發(fā)者大會(huì)

    近日,開(kāi)源鴻蒙開(kāi)發(fā)者大會(huì)2025在深圳舉行,開(kāi)源鴻蒙5.1 Release版本正式發(fā)布。作為開(kāi)源鴻蒙生態(tài)核心建設(shè)力量,國(guó)科受邀出席開(kāi)源鴻蒙
    的頭像 發(fā)表于 05-29 11:28 ?403次閱讀

    RV1126 實(shí)現(xiàn)簡(jiǎn)單的UI開(kāi)發(fā)示例

    在RV1126上實(shí)現(xiàn)簡(jiǎn)單的UI開(kāi)發(fā)實(shí)例
    的頭像 發(fā)表于 04-09 16:08 ?319次閱讀
    RV1126 <b class='flag-5'>實(shí)現(xiàn)</b>簡(jiǎn)單的<b class='flag-5'>UI</b>開(kāi)發(fā)示例

    第二篇 RA8889 實(shí)現(xiàn)酷炫車(chē)載液晶儀表系列視頻: UI類界面介紹

    本系列文章介紹 RA8889 實(shí)現(xiàn)液晶儀表HMI UI界面,分為兩大部分來(lái)介紹,本期介紹如何制作UI類界面,其中包括使用PS軟件制作靜態(tài)類UI界面,Ae軟件制作動(dòng)態(tài)類的
    的頭像 發(fā)表于 02-25 15:27 ?406次閱讀
    第二篇 RA8889 <b class='flag-5'>實(shí)現(xiàn)</b>酷炫車(chē)載液晶儀表系列視頻: <b class='flag-5'>UI</b>類界面介紹

    HarmonyOS NEXT 原生應(yīng)用開(kāi)發(fā):社交聊天對(duì)話過(guò)程實(shí)現(xiàn)

    一、實(shí)現(xiàn)思路 本DEMO旨在展示如何在HarmonyOS NEXT平臺(tái)上,利用ArkTS開(kāi)發(fā)語(yǔ)言構(gòu)建一個(gè)簡(jiǎn)易的社交聊天對(duì)話界面。用戶可以在此界面上查看聊天記錄,并發(fā)送新的消息。此示例中,聊天
    發(fā)表于 01-07 10:55

    自動(dòng)化創(chuàng)建UI并解析數(shù)據(jù)

    Labview實(shí)現(xiàn)動(dòng)態(tài)增加控件效果 - *附件:32960_auto.rar 備注:Main.vi是ui自動(dòng)化2.1.vi,配置文件為32960.B.ini。 目前可以實(shí)現(xiàn)根據(jù)配置文件
    發(fā)表于 11-29 11:26

    鴻蒙系統(tǒng)專用版信內(nèi)測(cè)即將啟動(dòng)

    近日,有知情人士稱鴻蒙系統(tǒng)專用版的開(kāi)發(fā)工作現(xiàn)已基本完成。這一消息標(biāo)志著在適配鴻蒙系統(tǒng)方面
    的頭像 發(fā)表于 11-07 10:58 ?1361次閱讀

    Linux4.0.0版發(fā)布,功能再升級(jí)

    近日,備受矚目的Linux4.0.0版本終于迎來(lái)了正式發(fā)布。此次版本更新不僅帶來(lái)了多項(xiàng)實(shí)用功能,還實(shí)現(xiàn)了與Windows、macOS公測(cè)版本的功能一致和更新同步,為用戶帶來(lái)了更加便捷
    的頭像 發(fā)表于 11-06 10:59 ?712次閱讀

    名單公布!【書(shū)籍評(píng)測(cè)活動(dòng)NO.47】HarmonyOS NEXT啟程:零基礎(chǔ)構(gòu)建純血鴻蒙應(yīng)用

    本期評(píng)測(cè)名單如下 趙龍、華為開(kāi)發(fā)者論壇 、鄧文權(quán)、iwpgk、夜孤影 請(qǐng)以上幾位大佬聯(lián)系工作人員(:elecfans123)領(lǐng)取書(shū)籍進(jìn)行評(píng)測(cè),如在5個(gè)工作日內(nèi)未聯(lián)系,視為放棄本次試用評(píng)測(cè)資格
    發(fā)表于 10-14 14:36

    基于鴻蒙Next模擬掃圖識(shí)物的一個(gè)過(guò)程

    一、功能介紹(基礎(chǔ)) 基于鴻蒙Next模擬掃圖識(shí)物的一個(gè)過(guò)程,掃描到圖片,提示出相關(guān)的圖片內(nèi)容,是一個(gè)什么東西。 二、使用場(chǎng)景(大類) 支付、社交、信息獲取、在線調(diào)查、教育學(xué)習(xí)等等。 三、實(shí)現(xiàn)步驟
    發(fā)表于 08-21 15:04

    VA段碼COG液晶屏可個(gè)性化靈活設(shè)計(jì)UI實(shí)現(xiàn)創(chuàng)意UI的高對(duì)比高亮多色彩炫酷顯示。

    VA段碼COG液晶屏可個(gè)性化靈活設(shè)計(jì)UI,實(shí)現(xiàn)創(chuàng)意UI的高對(duì)比高亮多色彩炫酷顯示。
    的頭像 發(fā)表于 07-11 10:50 ?1055次閱讀
    VA段碼COG液晶屏可個(gè)性化靈活設(shè)計(jì)<b class='flag-5'>UI</b>,<b class='flag-5'>實(shí)現(xiàn)</b>創(chuàng)意<b class='flag-5'>UI</b>的高對(duì)比高亮多色彩炫酷顯示。

    國(guó)科旗艦芯片獲頒鴻蒙生態(tài)產(chǎn)品兼容性證書(shū)

    ? 7月9日,國(guó)科宣布旗下超高清視頻解碼及商顯芯片通過(guò)OpenHarmony4.0版本兼容性測(cè)評(píng),獲頒鴻蒙生態(tài)產(chǎn)品兼容性證書(shū)。其中,國(guó)科GK6323V100C是業(yè)界首款通過(guò)鴻蒙4.
    的頭像 發(fā)表于 07-10 16:37 ?1737次閱讀

    深耕鴻蒙生態(tài),國(guó)科旗艦芯片獲“鴻蒙4.0”首款認(rèn)證

    7月9日,國(guó)科宣布旗下超高清視頻解碼及商顯芯片通過(guò)OpenHarmony4.0版本兼容性測(cè)評(píng),獲頒鴻蒙生態(tài)產(chǎn)品兼容性證書(shū)。其中,國(guó)科GK6323V100C是業(yè)界首款通過(guò)鴻蒙4.0兼
    的頭像 發(fā)表于 07-10 13:10 ?772次閱讀
    深耕<b class='flag-5'>鴻蒙</b>生態(tài),國(guó)科<b class='flag-5'>微</b>旗艦芯片獲“<b class='flag-5'>鴻蒙</b>4.0”首款認(rèn)證

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品