uniapp 内使用 nvue 做原生标题

本贴最后更新于 1562 天前,其中的信息可能已经沧海桑田

nvue 页面只能使用 vue 的生命周期,uniapp 生命周期 api 支持部分,css 样式只支持 flex,很多 css 样式不支持

<template>
	<div class="controls-top" ref="controlsTop">
		<div class="title"><text class="text">{{title}}</text></div>
		<div class="fanhui" @tap="back"><text class="ios-icon">&#xe60a;</text></div>
		<div class="top-right1">
			<div class="power-view">
				<div class="power-box">
					<div class="power-header"></div>
					<div class="power-body"><div class="power-level" :style="{ width: `${16 * level}px`, backgroundColor: '#fff' }"></div></div>
				</div>
			</div>
		</div>
		<div class="top-right2">
			<text class="ios-sm-title">{{nowTime}}</text>
		</div>
	</div>
</template>

<script>
const animation = weex.requireModule('animation');
const modal = weex.requireModule('modal');
export default {
	data() {
		return {
			level:0,
			nowTime:"00:00",
			title:'',
			timer:null,
			platform:null
		}
	},
	beforeCreate() {
		// #ifdef APP-PLUS-NVUE
		var domModule = weex.requireModule('dom');
		domModule.addRule('fontFace', {
			fontFamily: 'texticons',
			src: "url('../../../static/text-icon.ttf')"
		});
		// #endif
	},
	created(){
		uni.getSystemInfo({
			success: (e) => {
				// #ifndef MP
				this.platform = e.platform
				// #endif
			}
		})
	},
	mounted() {
		this.getLevel()
		this.timer = setInterval(()=>{
			this.nowTime = this.getNowTime()
		},1000)
		uni.$on("videoTitileShow",()=>{
			this.nowTime = this.getNowTime()
			this.animateControls(0,this.$refs.controlsTop)
		})
		uni.$on("videoTitileHide",()=>{
			this.animateControls(-40,this.$refs.controlsTop)
		})
		uni.$on("videoTitileChange",(title)=>{
			this.title = title
		})
	},
	destroyed() {
		uni.$off("videoTitileShow")
		uni.$off("videoTitileHide")
		uni.$off("videoTitileChange")
		clearInterval(this.timer)
	},
	methods: {
		getLevel(){
			let promise = new Promise((resolve,reject)=>{
				//#ifdef APP-PLUS-NVUE
				if(this.platform == 'android'){
					//注意,安卓需要配置下manifest.json文件,打开后,进入模块权限配置,在右侧的Android权限设置里勾选上android.permission.BATTERY_STATS
					var main = plus.android.runtimeMainActivity();  
					var Intent = plus.android.importClass('android.content.Intent');  
					var recevier = plus.android.implements('io.dcloud.feature.internal.reflect.BroadcastReceiver', {  
					        onReceive: function(context, intent) {  
					        var action = intent.getAction();  
					        if (action == Intent.ACTION_BATTERY_CHANGED) {  
					            let level   = intent.getIntExtra("level", 0); //电量  
					            var voltage = intent.getIntExtra("voltage", 0); //电池电压  
					            var temperature = intent.getIntExtra("temperature", 0); //电池温度  
								resolve(level/100)
					        }  
					     }  
					 });  
					var IntentFilter = plus.android.importClass('android.content.IntentFilter');  
					var filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);  
					main.registerReceiver(recevier, filter);
				}else if(this.platform == 'ios'){
					var UIDevice = plus.ios.import("UIDevice");
					var dev = UIDevice.currentDevice();  
					if (!dev.isBatteryMonitoringEnabled()) {  
					    dev.setBatteryMonitoringEnabled(true);  
					}  
					let level =dev.batteryLevel();  
					
					resolve(level)
				}
				//#endif
				//#ifdef MP-WEIXIN
				wx.getBatteryInfo({
					success: function(e) {
						resolve(e.level)
					}
				})
				//#endif
			})
			promise.then(res=>{
				this.level = res
			})
		},
		getNowTime(){
			var now = new Date();
			var hh = now.getHours();            //时
			if(hh<10) hh = "0" + hh;
			var mm = now.getMinutes();          //分
			if(mm<10) mm = "0" + mm;  
			return `${hh}:${mm}`; 
		},
		back(){
			this.animateControls(-40,this.$refs.controlsTop)
			uni.$emit("exitFullscreen")
		},
		animateControls(distance,el){
			animation.transition(el, {
				styles: {
					transform: `translate(0px, ${distance}px)`,
				},
				duration: 350, //ms
				timingFunction: 'ease',
				delay: 0 //ms
				}, () => {
					
				}
			)
		}
	}
};
</script>

<style>
.controls-top {
	/* width: 750upx; */
	/* #ifndef APP-PLUS-NVUE */
	display: flex;
	/* #endif */
	position: relative;
	background-image: linear-gradient(to top, rgba(0, 0, 0, 0), rgba(0, 0, 0, 0.8));
	height: 40px;
	transform: translateY(-40px);
	align-items: center;
	justify-content: space-between;
	text-align: left;
	padding: 0 40px 0 40px;
}
.ios-icon {
	font-size: 18px;
	color: #fff;
	font-family: texticons;
}
.title {
	/* width: 750upx; */
	height: 40px;
	/* #ifndef APP-PLUS-NVUE */
	display: flex;
	/* #endif */
	position: absolute;
	left: 40px;
	right: 80px;
	top: 0px;
	justify-content: center;
	text-align: left;
	align-items: flex-start;
	/* background-color: #007aff; */
	padding: 0 10px 0 10px;
}
.text {
	color: #fff;
	font-size: 14px;
}
.fanhui {
	/* #ifndef APP-PLUS-NVUE */
	display: flex;
	/* #endif */
	width: 40px;
	height: 40px;
	position: absolute;
	top: 0;
	left: 0;
	justify-content: center;
	align-items: center;
}
.top-right1 {
	/* #ifndef APP-PLUS-NVUE */
	display: flex;
	/* #endif */
	align-items: center;
	font-size: 12px;
	color: #fff;
	position: absolute;
	top: 14px;
	right: 2px;
	width: 40px;
}
.top-right2 {
	/* #ifndef APP-PLUS-NVUE */
	display: flex;
	/* #endif */
	align-items: center;
	font-size: 12px;
	color: #fff;
	position: absolute;
	top: 12px;
	right:38px;
	width: 40px;
}
.power-view {
	/* #ifndef APP-PLUS-NVUE */
	display: flex;
	/* #endif */
	align-items: center;
}
.power-box {
	flex-direction: row;
	align-items: center;
}
.power-header {
	height: 4px;
	width: 2px;
	background-color: #fff;
}
.power-body {
	height: 9px;
	width: 20px;
	border-width: 1px;
	border-color: #fff;
	padding: 1px;
	flex-direction: row;
	justify-content: flex-end;
}
.power-level {
	height: 5px;
}
.ios-sm-title{
	font-size: 10px;
	color: #fff;
}
</style>

image.png

pages.josn 配置 nvue
image.png

vue 页面里获取 nvue 组件,使用

this.videoTitleNvue = uni.getSubNVueById('title');
this.videoTitleNvue.setStyle({
	top: 44 + uni.getSystemInfoSync().statusBarHeight + 'px',
	left: '0px',
	width: '100%',
	height: '40px'
});
this.videoTitleNvue.show('auto', 0, function() {
	// 打开后进行一些操作...
	//
});

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
gjTool
欢迎博客互链 https://www.gjtool.cn/ 武汉

推荐标签 标签

  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    532 引用 • 3528 回帖 • 1 关注
  • 负能量

    上帝为你关上了一扇门,然后就去睡觉了....努力不一定能成功,但不努力一定很轻松 (° ー °〃)

    85 引用 • 1201 回帖 • 450 关注
  • IPFS

    IPFS(InterPlanetary File System,星际文件系统)是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。请浏览 IPFS 入门笔记了解更多细节。

    20 引用 • 245 回帖 • 229 关注
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 511 关注
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    53 引用 • 85 回帖
  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    57 引用 • 22 回帖 • 4 关注
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 512 关注
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    103 引用 • 126 回帖 • 447 关注
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 89 关注
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 403 关注
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 21 关注
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    333 引用 • 323 回帖 • 67 关注
  • Ubuntu

    Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。

    123 引用 • 168 回帖
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 37 关注
  • WebComponents

    Web Components 是 W3C 定义的标准,它给了前端开发者扩展浏览器标签的能力,可以方便地定制可复用组件,更好的进行模块化开发,解放了前端开发者的生产力。

    1 引用 • 26 关注
  • SQLite

    SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是全世界使用最为广泛的数据库引擎。

    4 引用 • 7 回帖 • 3 关注
  • VirtualBox

    VirtualBox 是一款开源虚拟机软件,最早由德国 Innotek 公司开发,由 Sun Microsystems 公司出品的软件,使用 Qt 编写,在 Sun 被 Oracle 收购后正式更名成 Oracle VM VirtualBox。

    10 引用 • 2 回帖 • 6 关注
  • Sillot

    Sillot (汐洛)孵化自思源笔记,致力于服务智慧新彖乄,具有彖乄驱动、极致优雅、开发者友好的特点
    Github 地址:https://github.com/Hi-Windom/Sillot

    15 引用 • 6 回帖 • 26 关注
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    34 引用 • 37 回帖 • 497 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    10 引用 • 85 回帖
  • CodeMirror
    1 引用 • 2 回帖 • 116 关注
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖 • 1 关注
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    238 引用 • 224 回帖
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖 • 8 关注
  • LaTeX

    LaTeX(音译“拉泰赫”)是一种基于 ΤΕΧ 的排版系统,由美国计算机学家莱斯利·兰伯特(Leslie Lamport)在 20 世纪 80 年代初期开发,利用这种格式,即使使用者没有排版和程序设计的知识也可以充分发挥由 TeX 所提供的强大功能,能在几天,甚至几小时内生成很多具有书籍质量的印刷品。对于生成复杂表格和数学公式,这一点表现得尤为突出。因此它非常适用于生成高印刷质量的科技和数学类文档。

    9 引用 • 32 回帖 • 166 关注
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖 • 4 关注
  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    40 引用 • 40 回帖 • 1 关注