React Native开发鸿蒙Next---灰度模式
React Native开发鸿蒙Next---灰度模式
政企相关的App在开发过程中,往往需要制作一个灰度模式,用于应对注入国家公祭日等特殊日期情况。Harmony开发中,由于基于ArkTs,处理相对比较简单---仅需要在入口文件的build方法中对最外层的组件添加grayscale属性即可。
/**
* Adds a grayscale effect to the current component.
* The value is the gray scale conversion ratio. If the input parameter is 1.0, the gray scale image is completely converted to the gray scale image. If the input parameter is 0.0, the image does not change.
* If the input parameter is between 0.0 and 1.0, the effect changes. (Percentage)
*
* @param { number } value
* @returns { T }
* @syscap SystemCapability.ArkUI.ArkUI.Full
* @crossplatform
* @form
* @atomicservice
* @since 11
*/
grayscale(value: number): T;
在Index.ets入口页面,通过@state变量控制grayscale的赋值。在RN应用的入口文件root.ts,通过定时读取读取服务器上的json变量来实现对灰度模式的实时控制。
ArkTs中Index.ets
interface GeneratedObjectLiteralInterface_1 {
key: string;
value: string;
description: string;
}
@Entry
@Component
struct Index1 {
......
// 灰度模式控制变量
@State enableMourningDay: boolean = false;
aboutToAppear() {
......
// 注册原生发送给rn的emitter
this.registerNativeToJsEmitter();
}
registerNativeToJsEmitter() {
......
// RN发送消息给App
emitter.on(ConstUtil.event_id_rn_to_app, (data) => {
console.info('event_id_rn_to_app and data = ' + JSON.stringify(data));
// let object: GeneratedObjectLiteralInterface_1 = {key:'',value:'',description:''};
// 解析参数
let temp: GeneratedObjectLiteralInterface_1;
if (data && data.data && data.data.param && data.data.param) {
let object = JSON.parse(data.data.param) as GeneratedObjectLiteralInterface_1;
if (object) {
if (object.key === 'enable_mourning_day') {
this.enableMourningDay = (object.value == 'true'?true:false);
}
}
}
});
}
......
build() {
Column() {
if (this.rnohCoreContext && this.shouldShow) {
if (this.rnohCoreContext?.isDebugModeEnabled) {
RNOHErrorDialog({ ctx: this.rnohCoreContext })
}
......
}
}
.height('100%')
.width('100%')
.grayscale(this.enableMourningDay ? 1 : 0) // 灰度模式
}
}
RN中root.ts
function App(): JSX.Element {
......
const settingTimer = setInterval(() => {
xLog(TAG + ' 每隔一分钟读取后台设用于护理悼念模式 ');
getSetting();
}, 60 * 1000);
// 获取设置
async function getSetting() {
xnService.getSetting().then(data => {
if(data && data.length > 0){
for(let temp of data){
if(temp.key === 'enable_mourning_day'){
SystemTurboModule.pushStringToHarmony(JSON.stringify(temp),990008);
}
}
}
});
}
}
回顾下Android端的灰度模式实现---利用ColorMatrix。
Paint paint = new Paint();
ColorMatrix cm = new ColorMatrix();
cm.setSaturation(0);//灰度效果
paint.setColorFilter(new ColorMatrixColorFilter(cm));
// 开启view硬件加速
/*
* 1、LAYER_TYPE_SOFTWARE
无论硬件加速是否打开,都会有一张Bitmap(software layer),并在上面对WebView进行软渲染。
好处:
在进行动画,使用software可以只画一次View树,很省。
什么时候不要用:
View树经常更新时不要用。尤其是在硬件加速打开时,每次更新消耗的时间更多。因为渲染完这张Bitmap后还需要再把这张Bitmap渲染到hardware layer上面去。
2、LAYER_TYPE_HARDWARE
硬件加速关闭时,作用同software。
硬件加速打开时会在FBO(Framebuffer Object)上面做渲染,在进行动画时,View树也只需要画一次。
两者区别:
1、一个是渲染到Bitmap,一个是渲染到FB上。
2、hardware可能会有一些操作不支持。
两者相同:
都是开了一个buffer,把View画到这个buffer上面去。
3、LAYER_TYPE_NONE
这个就比较简单了,不为这个View树建立单独的layer
* //如果页面有webView,需加上下面代码
webView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
* */
getWindow().getDecorView().setLayerType(View.LAYER_TYPE_HARDWARE,paint);
不经常在线,有问题可在微信公众号或者掘金社区私信留言
更多内容可关注
我的公众号悬空八只脚
作者:悬空八只脚
链接:https://juejin.cn/post/7470635421505159208
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
React Native开发鸿蒙Next---灰度模式的更多相关文章
- React Native开发入门
目录: 一.前言 二.什么是React Native 三.开发环境搭建 四.预备知识 五.最简单的React Native小程序 六.总结 七.参考资料 一.前言 虽然只是简单的了解了一下Reac ...
- React Native开发技术周报2
(1).资讯 1.React Native 0.22_rc版本发布 添加了热自动重载功能 (2).技术文章 1.用 React Native 设计的第一个 iOS 应用 我们想为用户设计一款移动端的应 ...
- React Native开发技术周报1
(一).资讯 1.React Native 0.21版本发布,最新版本功能特点,修复的Bug可以看一下已翻译 重要:如果升级 Android 项目到这个版本一定要读! 我们简化了 Android 应用 ...
- DECO 一个REACT NAtive 开发IDE工具
DECO 一个REACT NAtive 开发IDE工具. 目前只支持 OS,NO WINDOWS https://www.decosoftware.com/ 一个方便的快速 ERXPRESS 教程:h ...
- React Native 开发之 (02) 用Sublime 3作为React Native的开发IDE
Sublime Text是一个代码编辑器.也是HTML和散文先进的文本编辑器.漂亮的用户界面和非凡的功能,例如:迷你地图,多选择Python插件,代码段等等.完全可自定义键绑定,菜单和工具栏等等.漂亮 ...
- React Native 开发笔记
ReactNativeDemo 学习ReactNative开发,搭建ReactNative第一个项目 React Native 开发笔记 1.安装Homebrew $ /usr/bin/ruby -e ...
- 【转】【React Native开发】
[React Native开发]React Native控件之ListView组件讲解以及最齐全实例(19) [React Native开发]React Native控件之Touchable*系列组 ...
- React Native开发的通讯录应用
React Native开发的通讯录应用(使用JavaScript开发原生iOS应用,vczero) 0.前言: 项目地址:https://github.com/vczero/React-Native ...
- iOS程序员的React Native开发工具集
本文整理了React Native iOS开发过程中有用的工具.服务.测试.库以及网站等. 工具 你可以选择不同的开发环境:DECO.EXPO或者你可以使用Nuclide+Atom,目前我使用EXPO ...
- React-Native(二):React Native开发工具vs code配置
从网上翻阅了一些开发react-native的开发工具时,发现其实可选的工具还是比较多的Sublime Text,WebStrom,Atom+Nuclide,vs code 等.因为我用.net生态环 ...
随机推荐
- Flink学习(十六) ProcessFunctionAPI(底层API)
我们之前学习的转换算子是无法访问时间的时间戳信息和水位线信息的.而这些在一些应用场景下,极为重要,例如MapFunction这样的map转换算子就无法访问时间戳或者当前事件的事件时间. 基于此,Dat ...
- Kali Linux(202104)重置root账户密码
1.前言 如果忘记了Kali Linux系统的登录密码,最关键的需求就是重置root用户的登录密码, 之后使用root账户可以修改其他账户的密码. 因此, 本文就介绍一下在不知道root用户登录密码的 ...
- 如何构建多模态AI知识库?
转载:如何构建多模态AI知识库? 摘要 在科技飞速发展的当下,人工智能(AI)已成为推动各行业变革的关键力量.其中,多模态 AI 知识库作为 AI 领域的重要创新,正引领我们迈向一个全新的智能时代.它 ...
- 【 Python 】补全fibersim 导出的xml语法
fibersim导出的xml文件中,node 和mesh部分的标签会缺失.即<R></R>变成了<R/>. 以下python脚本可以自动修正 # ********* ...
- typora 标题未在大纲中显示解决方法
解决方法:切换到源代码模式(快捷键是Ctrl +/),用鼠标选择未与前文对齐的标题和内容,按Shift+Tab,将内容对齐之后,大纲就能够正常显示了.
- go kratos protobuf 接收动态JSON数据
前言 google.protobuf.Struct 是 Google Protocol Buffers 中的一种特殊类型,用于表示动态的键值对数据.它可以存储任意类型的数据,并提供了方便的方法来访问和 ...
- linux centos8 mirrorlist: No URLs in mirrorlist,更新yum源
前言 由于官方已经在2021/12/31停止了对CentOS 8的支持,所以需要更新 yum 源,才能使用 更新镜像源 这里用的是阿里的 yum 镜像源 将源文件备份 cd /etc/yum.repo ...
- Python字符串前缀u、r、b、f含义(转)
1.字符串前加 u 例子: u"字符串中有中文" 含义: 前缀u表示该字符串是unicode编码,Python2中用,用在含有中文字符的字符串前,防止因为编码问题,导致中文出现乱码 ...
- Ubuntu22.04办公环境初始设置记录
1. 前言 这周末刚从Windows办公环境切换到 Ubuntu 22.04,有些东西还是比较折腾,记录一下便于以后查找. 2. 安装时的分区设置 从一块完整的新硬盘安装Ubuntu单系统时,只需要以 ...
- 在IM即时通讯系统中接入DeepSeek等AI大模型
随着DeepSeek的热潮,越来越多的企业也开始部署并训练自己的AI大模型,这样能使企业以前沉淀的专业知识和经验能更高效地被利用起来.有客户反馈了这样的需求场景:客户私有部署了自己的AI大模型以及私有 ...