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---灰度模式的更多相关文章

  1. React Native开发入门

    目录: 一.前言 二.什么是React Native 三.开发环境搭建 四.预备知识 五.最简单的React Native小程序 六.总结 七.参考资料   一.前言 虽然只是简单的了解了一下Reac ...

  2. React Native开发技术周报2

    (1).资讯 1.React Native 0.22_rc版本发布 添加了热自动重载功能 (2).技术文章 1.用 React Native 设计的第一个 iOS 应用 我们想为用户设计一款移动端的应 ...

  3. React Native开发技术周报1

    (一).资讯 1.React Native 0.21版本发布,最新版本功能特点,修复的Bug可以看一下已翻译 重要:如果升级 Android 项目到这个版本一定要读! 我们简化了 Android 应用 ...

  4. DECO 一个REACT NAtive 开发IDE工具

    DECO 一个REACT NAtive 开发IDE工具. 目前只支持 OS,NO WINDOWS https://www.decosoftware.com/ 一个方便的快速 ERXPRESS 教程:h ...

  5. React Native 开发之 (02) 用Sublime 3作为React Native的开发IDE

    Sublime Text是一个代码编辑器.也是HTML和散文先进的文本编辑器.漂亮的用户界面和非凡的功能,例如:迷你地图,多选择Python插件,代码段等等.完全可自定义键绑定,菜单和工具栏等等.漂亮 ...

  6. React Native 开发笔记

    ReactNativeDemo 学习ReactNative开发,搭建ReactNative第一个项目 React Native 开发笔记 1.安装Homebrew $ /usr/bin/ruby -e ...

  7. 【转】【React Native开发】

    [React Native开发]React Native控件之ListView组件讲解以及最齐全实例(19)  [React Native开发]React Native控件之Touchable*系列组 ...

  8. React Native开发的通讯录应用

    React Native开发的通讯录应用(使用JavaScript开发原生iOS应用,vczero) 0.前言: 项目地址:https://github.com/vczero/React-Native ...

  9. iOS程序员的React Native开发工具集

    本文整理了React Native iOS开发过程中有用的工具.服务.测试.库以及网站等. 工具 你可以选择不同的开发环境:DECO.EXPO或者你可以使用Nuclide+Atom,目前我使用EXPO ...

  10. React-Native(二):React Native开发工具vs code配置

    从网上翻阅了一些开发react-native的开发工具时,发现其实可选的工具还是比较多的Sublime Text,WebStrom,Atom+Nuclide,vs code 等.因为我用.net生态环 ...

随机推荐

  1. Flink学习(八) Flink SQL & Table 编程和案例

    Flink Table & SQL 概述背景我们在前面的课时中讲过 Flink 的分层模型,Flink 自身提供了不同级别的抽象来支持我们开发流式或者批量处理程序,下图描述了 Flink 支持 ...

  2. TypeError: Cannot read properties of null (reading 'level')

    一.分析问题 1.一个下拉框组件的更新由另一个下拉框组件控制被动更新列表,子级下拉框的值是由父级下拉框的值调用接口获取,每次父级下拉框值的改变都会改变子级下拉框的数据源也就是会改变子级下拉框的opti ...

  3. 如果服务器是 PHP,并且 GET 请求可以接收到数据,但 POST 请求接收不到数据,可能是以下原因之一

    如果服务器是 PHP,并且 GET 请求可以接收到数据,但 POST 请求接收不到数据,可能是以下原因之一: PHP 未正确解析 POST 请求体:PHP 需要通过 $_POST 或 php://in ...

  4. 分布式锁—7.Curator的分布式锁

    大纲 1.Curator的可重入锁的源码 2.Curator的非可重入锁的源码 3.Curator的可重入读写锁的源码 4.Curator的MultiLock源码 5.Curator的Semaphor ...

  5. 【Pre】预习测试-Logisim/Verilog/MIPS

    好家伙,开门挂 T2 字符自动机cscore 1.审题·惯性思维:直接输出了当前连续数,题目要求是最大连续数 -> [重新读题解决] 2.非阻塞赋值运用:若在always块内通过if(out1 ...

  6. composer 2 升级操作

    update composer composer self-update // or sudo composer self-update 回滚到版本1 composer self-update --r ...

  7. Trae 开发工具与使用技巧

    大家好,我是 V 哥. 前不久,字节重磅推出 AI 原生 IDE Trae,有了这款工具,程序员的开发效率得到了大大的提升,如何你是程序员,还没有使用起来,那 V 哥建议你即刻起马上安装上,谁用谁知道 ...

  8. 入门Dify平台:工作流节点分析

    要让智能体在实际应用中表现出色,掌握工作流的使用至关重要.今天,我们将深入探讨Dify平台中的各个节点的功能,了解它们的使用方法以及常见的应用场景.通过对这些节点的全面了解,将能够高效地设计和优化智能 ...

  9. 包装类--java进阶day05

    1.包装类 比如要让s+100,输出223.如果直接相加,结果是123100,这时就可以将s转换为包装类,然后再用包装类进行相加 2.包装类类型 3.手动拆/装箱 我们这里只介绍Integer,其他包 ...

  10. PII is hidden.

    使用 Microsoft.AspNetCore.Authentication.JwtBearer 做验证的时候报错如下: IDX10503: Signature validation failed. ...