当前位置: 首页 > article >正文

鸿蒙中如何实现图片拉伸效果

2024年10月22日,华为发布会上,推出鸿蒙5.0。现在加入恰逢时机,你,我皆是鸿蒙时代合伙人。无论为了学习技术,还是为了谋福利,在鸿蒙的浩瀚海洋中分到一杯羹。现在学习鸿蒙正当时。

一文了解鸿蒙中图片拉伸的使用。鸿蒙中图片可以实现拉伸吗,可以像安卓的.9图一样任意拉伸吗,可以像iOS一样以任意位置拉伸吗,鸿蒙中图片怎么拉伸,目前鸿蒙中图片拉伸存在哪里问题,通过本文阅读让我们来一起了解。

一、鸿蒙中图片可以拉伸吗?

鸿蒙中图片肯定可以拉伸。

image组件不设置大小即宽度高度,不设置默认比例是任意拉伸的

二、鸿蒙中图片怎么拉伸?

目前图片拉伸有二种方法通过Image组件设置和通过设置组件背景实现。

(1)通过设置组件背景实现

backgroundImage:设置需要拉伸的图片信息

backgroundImageSize:设置图片大小宽度、高度

backgroundImageResizable:设置图片上下左右切片,表示那部分不拉伸。

设置不拉伸的位置。

slice: { top: this.top, bottom: this.bottom, left: this.left, right: this.right, }

在使用图片拉伸时候,需要确定好,slice中上下左右的数据,否则会造成图片不按照设置的拉伸。无法达到预期效果。对于left,top,right,bottom 几个值的设置是有要求的,如果超过某个值设置的将会无效。

设置图像拉伸时可调整大小的图像选项。拉伸对拖拽缩略图以及占位图有效。

设置合法的 ResizableOptions 时,objectRepeat 属性设置不生效。

当设置 top +bottom 大于原图的高或者 left + right 大于原图的宽时 ResizableOptions 属性设置不生效。

当组件的参数类型为AnimatedDrawableDescriptor时设置该属性不生效。

Text(this.message)
  .padding({
    left: 10,
    right: 10,
    top: 10,
    bottom: 10
  })
  .constraintSize({ minHeight: 40, maxWidth: 200 })
  .id('HelloWorld')
  .fontSize(14)
  .fontWeight(FontWeight.Bold)
  .alignRules({
    center: { anchor: '__container__', align: VerticalAlign.Center },
    middle: { anchor: '__container__', align: HorizontalAlign.Center }
  })
  .onSizeChange((oldValue: SizeOptions, newValue: SizeOptions) => {
    this.needWidth = newValue.width
    this.needHeight = newValue.height
    hilog.error(1, "",
      `oldValue: width :${oldValue.width}  height :${oldValue.height}  newValue: width :${newValue.width}  height :${newValue.height}`)
  })
.backgroundImageResizable({
  slice: {
    top: this.top,
    bottom: this.bottom,
    left: this.left,
    right: this.right,
  }
})
.backgroundImageSize({
  width: this.needWidth,
  height: this.needHeight
})
.backgroundImage($r("app.media.message_right_bubble")

(2)通过设置完全相同大小的Image组件实现

利用设置完全相同的Image组件实现,和通过设置组件背景实现基本相同,这里只讲叙其中的差异。

首先获取组件大小,把组件大小设置给Image大小,对Image设置resizable切片实现效果。与设置背景基本上完全一致。达到的效果和存在的问题也基本上一致。

Image($r("app.media.message_right_bubble"))
  .width(this.needWidth)
  .height(this.needHeight)
  .resizable({
    slice: {
      top: this.top,
      bottom: this.bottom,
      left: this.left,
      right: this.right,
    }
  })
  .alignRules({
    bottom: { anchor: "HelloWorld", align: VerticalAlign.Bottom },
    top: { anchor: "HelloWorld", align: VerticalAlign.Top },
    left: { anchor: "HelloWorld", align: HorizontalAlign.Start },
    right: { anchor: "HelloWorld", align: HorizontalAlign.End }
  })
  .backgroundColor(Color.Red)
三、鸿蒙中图片拉伸在App中有哪些用途?

在聊天消息中,我们经常消息泡泡,或者一些背景图片需要通过拉伸设置,因为消息泡泡需要根据文字数量确定,长度宽度都是不固定的,所以需要通过图片的拉伸来实现泡泡的效果。

四、鸿蒙图片拉伸目前存在哪里问题?

我们在使用图片拉伸过程中想实现完全类似安卓.9图片的效果或者实现类似IOS中以某个位置拉伸,是达不到的。目前鸿蒙的图片拉伸存在一定问题,简单的图片拉伸功能基本可以实现,但是如果想以中间某个位置拉伸,现在是达不到。

我写的例子中分别以可以调整左上右下的切片距离。

当图片1左右分别为10时候,看着拉伸还算凑合,能看。

当图片2左右15,20时候,才看着正常。

当图片3,左边15,右边继续拉伸,到35 时候整个图片拉伸就失效。

虽然没有超过官文文档提示的, left + right 大于原图的宽时 ResizableOptions 属性设置不生效。

此时:left+right = 15 + 35 = 50 小于当前实际宽度是194,但是此时已经失效了。

此问题已经反馈给华为,但是此时还没有解决方案。这是很多问题用它无法达到 预期的效果。

阅读本文章,我们已经了解了鸿蒙中图片拉伸的的实现,可以按照上边的方法实现简单的图片拉伸效果,对于复杂的图片拉伸还需要研究,华为暂时也没有提供更好的解决方案,如果你有好的解决方案欢迎一起探讨;利用backgroundImage,设置图片的背景,通过backgroundImageSize设置图片的大小,通过backgroundImageResizable设置图片的切片左上右下达到我们要求的图片拉伸效果。本章节就介绍这些东西。后续章节我将依次从简入深,讲解鸿蒙的开发中遇到各种问题。欢迎大家一起交流。如果你在鸿蒙开发中遇到难点,不会的可以私信我,根据我最近的开发经历,已经基本踩完大部分坑,一起交流使我们共同进步。


http://www.kler.cn/a/398314.html

相关文章:

  • [241115] Debian 12.8 发布 | Mistral AI 推出批量 API,成本降低 50%
  • java 读取 有时需要sc.nextLine();读取换行符 有时不需要sc.nextLine();读取换行符 详解
  • CPU执行指令的过程
  • SOP搭建:企业标准化操作程序构建与实施指南
  • FFmpeg 4.3 音视频-多路H265监控录放C++开发十四,总结编码过程,从摄像头获得数据后,转成AVFrame,然后再次转成AVPacket,
  • 【Linux】Ubuntu中muduo库的编译环境安装
  • 计算机网络 (4)计算机网络体系结构
  • 分享一个小米手环自定义表盘安装教程与下载(支持最新小米手环9pro)
  • day01(单片机高级)单片机控制ESP8266连接TCP
  • 自制C++游戏头文件:C++自己的游戏头文件!!!(后续会更新)
  • JMeter中添加请求头
  • 3. Django中的URL调度器 (re_path 和正则表达式)
  • Linux运维篇-iscsi存储搭建
  • 每日练习(字节青训)
  • Windows配置域名映射IP
  • 软考教材重点内容 信息安全工程师 第 3 章 密码学基本理论
  • 【redis】—— 初识redis(redis基本特征、应用场景、以及重大版本说明)
  • 【第二课】Rust变量与数据类型(一)
  • Android OpenGL ES详解——立方体贴图
  • 电子电气架构 -- 下一代整车电网
  • 微服务即时通讯系统的实现(客户端)----(3)
  • React学习05 - redux
  • MATLAB实现GARCH(广义自回归条件异方差)模型计算VaR(Value at Risk)
  • Spring:纯注解开发模式-Ioc对bean的管理
  • 聊天服务器(8)用户登录业务
  • Java项目实战II基于微信小程序的课堂助手(开发文档+数据库+源码)