uni-app plus.nativeObj.View解析

发布于 1周前 作者 itying888 来自 Uni-App

uni-app plus.nativeObj.View解析

HBuilder7.2起,提供了plus.nativeObj.View,简称nview,http://html5plus.org/doc/zh_cn/nativeobj.html,它是一个灵活的底层组件,可以通过js控制样式的原生画布,写字、贴图、做动画,它不属于dom,可盖在webview和各种原生控件上面。

业内有些人认为HTML5渲染不敌原生渲染,确实在非预载的情况下HTML渲染慢于原生,那nview其实就是纯原生渲染了,nview的出现,补齐了HTML5的短板,满足了对体验有苛刻要求的开发者。

合理运用nview的应用,其加载速度已经毫无逊色于原生应用,这里有些视频对比http://ask.dcloud.net.cn/article/12576

nview可灵活运用于多种情况。

举例:

  1. 更高性能的窗体切换动画 我们知道div动画效果不好,webview的动画效果要好很多,但追求极致的话,nativeobj的动画是效果最好的。 从HBuilder8.8起,提供了subnview。加载一个webview时,可以把webview的界面部分原生化。这样动画期间,其实webview是不渲染不移动的,移动的是原生绘制的subnview。 subnview绘制极快,可以在100毫秒渲染,所以动画期间就能看到内容。而普通HTML文件渲染不预载的话是无法在100毫秒渲染的。

  2. 始终悬浮在webview上的圆球按钮

  3. 使用nativeObj.view来做title,不再使用父子双webview,节省更多内存资源,提升加载速度。此需求已经于HBuilder8.8起封装为webview的titleNView,可以在创建webview时配置一个参数,就可以生成一个nview的title,同时这个nview的title也可以继续使用nview的api进行文字图片的绘制。参考http://www.html5plus.org/doc/zh_cn/webview.html#plus.webview.WebviewTitleNViewStyles

  4. 自定义原生控件
    扫码、地图…很多HTML5+里提供的原生控件,之前是难以自定义界面的,需要使用github上的5+runtime代码自己改源码、本地打包新引擎。有了nview,可以自由的在这些原生控件上贴图、写字、增加按钮,实现界面的自定义。

  5. 全屏遮罩
    子webview里的popover,弹出时无法全屏遮罩,其实我们可以不用popover的遮罩,直接用plus.nativeObj.View在popover四周贴蒙灰半透明图。

  6. webview选项卡上面多一个弧形
    以前,下图样式通过5+的webview选项卡并不好实现,或者改用div选项卡,或者在中间的webview底部fix一个图。

开发环境 版本号 项目创建方式
HBuilder 7.2
HBuilder 8.8 subnview

plus.nativeObj.View还支持点击事件,还可以在图上继续贴图,应用场景非常多。

plus.nativeObj.View可以盖在webview上面,从HBuilder7.3起,view还支持内嵌于webview,可跟随webview一起动。

plus.nativeObj.View的引入极大的提升了5+app的性能和ui自定义性,对父子双webview的使用产生很大替代作用,但注意mui封装过的父子webview是可以兼容到非5+的普通浏览器里使用的,而native view则必须依赖5+环境。


1 回复

关于uni-app中的plus.nativeObj.View,这是一个用于在原生层创建自定义视图对象的API,它允许开发者在H5页面中嵌入原生组件,实现更加高效和复杂的界面交互。plus.nativeObj.View常用于需要高性能渲染或者访问原生系统能力的场景,比如视频播放、地图展示等。

以下是一个简单的代码案例,展示如何在uni-app中使用plus.nativeObj.View来嵌入一个原生视图组件。

1. 创建原生视图组件(假设在原生Android或iOS代码中实现)

由于这部分涉及原生开发,这里不展开具体代码,但通常你需要在原生项目中创建一个自定义视图类,并在其中实现你的逻辑。例如,在Android中可能是一个View子类,在iOS中可能是一个UIView子类。

2. 在uni-app中使用plus.nativeObj.View

// 引入uni-app相关模块
const view = plus.webview.currentWebview();

// 创建NativeObjectView实例
let nativeView = new plus.nativeObj.View('nativeViewId', {
    top: '0px',
    left: '0px',
    height: '300px',
    width: '100%'
});

// 将原生视图添加到当前webview中
view.append(nativeView);

// 监听原生视图加载完成事件(可选,根据实际需求)
nativeView.addEventListener('loaded', function() {
    console.log('Native view loaded');
    // 在这里可以执行一些初始化操作,比如与原生视图进行通信
});

// 与原生视图通信的示例(假设原生视图已暴露相关接口)
function sendMessageToNativeView(message) {
    if (nativeView) {
        nativeView.evalJS(`
            // 这里是原生视图中的JavaScript代码,假设原生视图支持evalJS
            console.log('Received message from H5: ' + ${JSON.stringify(message)});
        `);
    }
}

// 调用示例
sendMessageToNativeView({ type: 'greet', content: 'Hello, Native View!' });

注意事项

  • 在实际开发中,原生视图的创建和管理通常需要在原生代码中完成,uni-app端主要负责与原生视图进行通信和布局。
  • plus.nativeObj.View的使用依赖于5+ App(即DCloud的HBuilderX打包的原生应用),在纯Web环境中无法运行。
  • 与原生视图的通信可能涉及JSON序列化/反序列化,确保数据格式的一致性。
  • 根据具体需求,可能需要处理原生视图的生命周期事件,如页面隐藏/显示、内存管理等。

以上代码提供了一个基础的框架,具体实现需结合你的原生开发环境和业务需求进行调整。

回到顶部