简介

本系列文章记录作者大三开学第一个月中学习HarmonyOS移动应用开发学习经历,此篇为《微信聊天界面》项目,实现功能有

1、聊天信息功能,包括图片、文字

2、发送定位功能

3、选择发送本机图片功能

4、拍照并发送图片功能

如果在真机调试请将config文件中包名换成自己的应用包名即可,申请权限有文件读写、位置获取、相机调用、麦克风调用。

之前文章

手把手教你用鸿蒙HarmonyOS实现微信聊天界面(一)_MarsHys的博客-CSDN博客

手把手教你用鸿蒙HarmonyOS实现微信聊天界面(二)_MarsHys的博客-CSDN博客

聊天界面效果如图

图片选择界面

在该聊天界面选择图片里主要组件是ListContainer其余就是顶栏的Text与底下的Button。

<?xml version="1.0" encoding="utf-8"?>
<DirectionalLayoutxmlns:ohos="http://schemas.huawei.com/res/ohos"ohos:height="match_parent"ohos:width="match_parent"ohos:alignment="center"ohos:orientation="vertical"><ListContainerohos:weight="11"ohos:background_element="#FFE9E9E9"ohos:id="$+id:list_container"ohos:height="match_parent"ohos:width="match_parent"ohos:layout_alignment="horizontal_center"/><Buttonohos:id="$+id:close_image_button"ohos:weight="1"ohos:width="match_parent"ohos:height="0"ohos:text_size="27fp"ohos:text="关闭"ohos:background_element="#FFFDFDFF"/>
</DirectionalLayout>

是通过对话框弹出的界面CommonDialog组件,由图片Button的点击事件触发

    imageButton.setClickedListener(component1 -> {dialog = new CommonDialog(getContext());initImageData();DirectionalLayout directionalLayout = new DirectionalLayout(getContext());Component component2;component2 = LayoutScatter.getInstance(this).parse(ResourceTable.Layout_image_main, null, false);imagelistContainer= (ListContainer) component2.findComponentById(ResourceTable.Id_list_container);closeimagebutton = (Button) component2.findComponentById(ResourceTable.Id_close_image_button);closeimagebutton.setClickedListener(component3 -> {dialog.destroy();});directionalLayout.addComponent(component2);initImageListContainer();dialog.setContentCustomComponent(directionalLayout);dialog.setTitleText("图片");dialog.setSize(MATCH_PARENT,MATCH_PARENT);//dialog.setContentText("This is CommonDialog Content area.");dialog.setButton(IDialog.BUTTON3, "CONFIRM", (iDialog, i) -> iDialog.destroy());dialog.show();//addAndUpdateMessage(messageData.size(),"message","image");});

在第二篇中我们讲到图片是通过Uri访问的图片资源,Uri的资源获取类PictureManager 在上篇已经讲过。在展示里在ListContainer的实体类中是按行存储Uri,在Provider里转换为图片。

图片资源实体类

public class ImageLineItem {private int index;private Uri[] uris;public ImageLineItem(int index) {this.index = index;}public int getIndex() {return index;}public void setIndex(int index) {this.index = index;}public Uri[] getUris() {return uris;}public void setUris(Uri[] uris) {this.uris = uris;}
}

Provider里加载图片布局,对每一个Image组件都添加了点击方法调用发送并更新消息方法addAndUpdateMessag实现点击发送图片。

public class ImageLineProvider extends BaseItemProvider {private static final String TAG = ImageLineProvider.class.getSimpleName();private List<ImageLineItem> list;private AbilitySlice slice;private MainAbilitySlice mainAbilitySlice;public void setMainAbilitySlice(MainAbilitySlice mainAbilitySlice){this.mainAbilitySlice = mainAbilitySlice;}public ImageLineProvider(List<ImageLineItem> list, AbilitySlice slice) {LogUtil.info(TAG,"list.size() : "+list.size());this.list = list;this.slice = slice;}@Overridepublic int getCount() {return list == null ? 0 : list.size();}@Overridepublic Object getItem(int position) {if (list != null && position >= 0 && position < list.size()){return list.get(position);}return null;}@Overridepublic long getItemId(int position) {return position;}private Component getItemComponent(int position) {return getComponent(position);}private Component getComponent(int position) {LogUtil.info(TAG,"list.size()"+list.size());final Component cpt;cpt = LayoutScatter.getInstance(slice).parse(ResourceTable.Layout_images_line, null, false);ImageLineItem imageLineItem = list.get(position);Image image1,image2,image3;image1 = (Image) cpt.findComponentById(ResourceTable.Id_image1);image2 = (Image) cpt.findComponentById(ResourceTable.Id_image2);image3 = (Image) cpt.findComponentById(ResourceTable.Id_image3);DataAbilityHelper helper=DataAbilityHelper.creator(slice.getContext());//定义图片来源对象ImageSource imageSource;Uri[] uris = imageLineItem.getUris();FileDescriptor fd = null;image1.setClickedListener(component1 -> {mainAbilitySlice.addAndUpdateMessage(mainAbilitySlice.getMessageDataSize(), String.valueOf(uris[0]),"image");mainAbilitySlice.getDialog().destroy();});image2.setClickedListener(component1 -> {mainAbilitySlice.addAndUpdateMessage(mainAbilitySlice.getMessageDataSize(), String.valueOf(uris[1]),"image");mainAbilitySlice.getDialog().destroy();});image3.setClickedListener(component1 -> {mainAbilitySlice.addAndUpdateMessage(mainAbilitySlice.getMessageDataSize(), String.valueOf(uris[2]),"image");mainAbilitySlice.getDialog().destroy();});try {fd = helper.openFile(uris[0], "r");} catch (DataAbilityRemoteException | FileNotFoundException e) {e.printStackTrace();}imageSource = ImageSource.create(fd, null);//创建位图PixelMap pixelMap = imageSource.createPixelmap(null);image1.setPixelMap(pixelMap);imageSource.release();helper.release();try {fd = helper.openFile(uris[1], "r");} catch (DataAbilityRemoteException | FileNotFoundException e) {e.printStackTrace();}imageSource = ImageSource.create(fd, null);//创建位图pixelMap = imageSource.createPixelmap(null);image2.setPixelMap(pixelMap);imageSource.release();helper.release();try {fd = helper.openFile(uris[2], "r");} catch (DataAbilityRemoteException | FileNotFoundException e) {e.printStackTrace();}imageSource = ImageSource.create(fd, null);//创建位图pixelMap = imageSource.createPixelmap(null);image3.setPixelMap(pixelMap);imageSource.release();helper.release();return cpt;}@Overridepublic Component getComponent(int position, Component convertComponent, ComponentContainer componentContainer) {return getItemComponent(position);}
}

图片获取与布局就讲完了,最后看一下发送效果吧

(Preview:下篇讲如何实现发送定位功能)

Gitee链接

WeChatPage: 鸿蒙版微信界面

手把手教你用鸿蒙HarmonyOS实现微信聊天界面(三)相关推荐

  1. 手把手教你用鸿蒙HarmonyOS实现微信聊天界面(二)

    简介 本系列文章记录作者大三开学第一个月中学习HarmonyOS移动应用开发学习经历,此篇为<微信聊天界面>项目,实现功能有 1.聊天信息功能,包括图片.文字 2.发送定位功能 3.选择发 ...

  2. 手把手教你用鸿蒙HarmonyOS实现微信聊天界面(一)

    简介 本系列文章记录作者大三开学第一个月中学习HarmonyOS移动应用开发学习经历,此篇为<微信聊天界面>项目,实现功能有 1.聊天信息功能,包括图片.文字 2.发送定位功能 3.选择发 ...

  3. 手把手教你生成你的独家微信聊天年度报告

    大家好,我是机灵鹤. 今天是跟女朋友在一起 10 个月的纪念日,作为一名会 Python 的程序员,我决定将和女朋友的聊天记录导出来,生成一份专属于我们的<2021 恋爱年度报告>. 感兴 ...

  4. 手把手教你做短视频去水印微信小程序(2-首页)

    手把手教你做短视频去水印微信小程序系列教程(2-首页) 文章目录 手把手教你做短视频去水印微信小程序系列教程(2-首页) 前言 一.顶部banner 二.地址解析 1.整体代码 2. input框输入 ...

  5. php写的微信聊天界面,浅谈 聊天界面 核心架构设计

    本文以一个小例子简单的演示在微信小程序中使用环信SDK收发消息.官网demo 下载后把整个utils目录下的文件复制到咱自己工程的目录下.在WebIMConfig.js中将AppKey替换成自己应用的 ...

  6. Swift - 自定义单元格实现微信聊天界面

    1,下面是一个放微信聊天界面的消息展示列表,实现的功能有: (1)消息可以是文本消息也可以是图片消息 (2)消息背景为气泡状图片,同时消息气泡可根据内容自适应大小 (3)每条消息旁边有头像,在左边表示 ...

  7. jquery 背景特效实现_html5实现的仿网页版微信聊天界面效果源码

    码农那点事儿 关注我们,一起学习进步 这是一款基于html5实现的仿网页版微信聊天界面效果源码,可实现微信网页版聊天界面效果,在编辑框编辑文字之后按Ctrl+Enter键即可提交文字到聊天对话框上.整 ...

  8. 高仿微信聊天界面长按弹框样式

    效果图 背景 在公司做的项目里面,刚好有需要用到微信聊天界面长按弹框样式这种UI的. 网上找了一下,没找到. Android现成的 ListPopupWindow又不能满足需求. 因此在非上班时间撸一 ...

  9. android 仿微信聊天界面 以及语音录制功能,Android仿微信录制语音功能

    本文实例为大家分享了Android仿微信录制语音的具体代码,供大家参考,具体内容如下 前言 我把录音分成了两部分 1.UI界面,弹窗读秒 2.一个类(包含开始.停止.创建文件名功能) 第一部分 由于6 ...

最新文章

  1. WCF系列(一) -- 完全不使用配置文件构建和使用WCF服务
  2. Linux C编程--操作文件结束和错误的判断方法(函数)
  3. 谷歌开源下一代推荐系统模拟器:RecSim NG
  4. LeetCode每日一题 24. 两两交换链表中的节点
  5. chrome源代码目录结构简介
  6. Arrays 的copyOf() - JDK 6 和操作符 instanceof
  7. java 蓝牙4.0_《蓝牙4.0 BLE开发完全手册---物联网开发技术实战
  8. InfluxDB学习之InfluxDB的基本操作
  9. git 每次都要输入用户名密码_Git向GitHub提供代码
  10. solid测序列原理_SOLID原理简介
  11. 数通手稿留档——Frame Relay
  12. php 连接 onenet,arduino一直连接不上onenet
  13. span标签的鼠标滑入提示_彻底搞懂拖拽——基于鼠标事件的拖拽以及基于HTML5 API的拖拽...
  14. php数组插入mysql,php mysql:将一个php数组插入mysql
  15. 2018年技术直播PPT干货分享
  16. 引入组件时的错误:Module not found: Error: Can‘t resolve ‘@/pages/Search‘
  17. [HCNA] IP地址和子网划分
  18. 方维众筹网站源码V1.71 PC+WAP+商业版
  19. 终极卸载PC奇安信天擎
  20. 计算机专业综合理论模拟测试卷五,2020银保监会考试题库:计算机类模拟试题练习(五)...

热门文章

  1. 神经网络拟合二元函数曲面实践
  2. 毕业设计 - 基于java web的新闻发布及管理系统的设计与实现 【源码+论文】
  3. Android 12 强制使用分屏模式
  4. uniapp:常用跨端业务组件(ts版本)
  5. Java视频教学从入门到精通(2022最新版)
  6. 从申请到调用:空号检测 API 使用教程
  7. 如何设置MacOS的菜单栏和dock栏的透明度,如何设置为不透明
  8. 014-HTML-区块(不是区块链)
  9. 电子束光刻胶 (正胶SX AR-P 6200,AR-P617PMMA/MA共聚物),负胶AR-N 7700
  10. 0102数据结构和图处理算法-无向图-数据结构和算法(Java)