webapp mui & HTML5+ (四) 之 窗口(页面初始化、跳转、传参)

在app开发中,若要使用HTML5+扩展api,必须等plusready事件发生后才能正常使用,mui将该事件封装成了mui.plusReady()方法,涉及到HTML5+的api,建议都写在mui.plusReady方法中

页面初始化

mui框架将很多功能配置都集中在mui.init方法中,要使用某项功能,只需要在mui.init方法中完成对应参数配置即可,
目前支持在mui.init方法中配置的功能包括:
创建子页面
关闭页面
手势事件配置
预加载
下拉刷新
上拉加载
设置系统状态栏背景颜色

打开新的页面

1.mui.openWindow()
在app中打开一个新的页面,可以用mui.openWindow()直接打开,以下是openWindow的一些参数

mui.openWindow({
    url:new-page-url,   // 新页面的url
    id:new-page-id,     // 新页面的id标识
    styles:{
        top:newpage-top-position,//新页面顶部位置
        bottom:newage-bottom-position,//新页面底部位置
        width:newpage-width,//新页面宽度,默认为100%
        height:newpage-height,//新页面高度,默认为100%
        ......
    },
    extras:{
        .....//自定义扩展参数,可以用来处理页面间传值
    },
    createNew:false,//是否重复创建同样id的webview,默认为false:不重复创建,直接显示
    show:{
        autoShow:true,//页面loaded事件发生后自动显示,默认为true
        aniShow:animationType,//页面显示动画,默认为”slide-in-right“;
        duration:animationTime//页面动画持续时间,Android平台默认100毫秒,iOS平台默认200毫秒;
    },
    waiting:{
        autoShow:true,//自动显示等待框,默认为true
        title:'正在加载...',//等待对话框上显示的提示内容
        options:{
            width:waiting-dialog-widht,//等待框背景区域宽度,默认根据内容自动计算合适宽度
            height:waiting-dialog-height,//等待框背景区域高度,默认根据内容自动计算合适高度
            ......
        }
    }
})

2.初始化时,mui.init()创建子页面
也可能会遇到这样一种场景,顶部有titleBar,下面是动态列表,列表是需要滚动的,就是需要局部滚动,在android上会出现滚动不流畅的问题,

借用官网的一张图片
这张图片来至官网
mui是这样解决的,将目标页面分解为主页面和内容页面,主页面显示卡头卡尾区域,比如顶部导航、底部选项卡等;内容页面显示具体需要滚动的内容,然后在主页面中调用mui.init方法初始化内容页面。

mui.init({
    subpages:[{
        url:your-subpage-url,//子页面HTML地址,支持本地地址和网络地址
        id:your-subpage-id,//子页面标志
        styles:{
            top:subpage-top-position,//子页面顶部位置
            bottom:subpage-bottom-position,//子页面底部位置
            width:subpage-width,//子页面宽度,默认为100%
            height:subpage-height,//子页面高度,默认为100%
            ......
        },
        extras:{}//额外扩展参数
    }]
});

3.页面预加载
页面预加载技术就是在用户还没有触发页面跳转的时候,提前将目标页面创建出来,当用户跳转至目标页面时就可以立即进行页面跳转,没有创建页面的时间,使app更流畅
mui有两种页面预加载的方法

第一种就是在初始话页面的时候在init里面直接用参数preloadPages进行配置

mui.init({
    preloadPages:[
        {
            url:prelaod-page-url,
            id:preload-page-id,
            styles:{},//窗口参数
            extras:{},//自定义扩展参数
            subpages:[{},{}]//预加载页面的子页面
        }
    ],
    preloadLimit:5//预加载窗口数量限制(一旦超出,先进先出)默认不限制
});

该种方案使用简单、可预加载多个页面,但不会返回预加载每个页面的引用,若要获得对应webview引用,还需要通过plus.webview.getWebviewById方式获得

第二种方式就是通过mui.preload方法预加载

var page = mui.preload({
    url:new-page-url,
    id:new-page-id,//默认使用当前页面的url作为id
    styles:{},//窗口参数
    extras:{}//自定义扩展参数
});
页面传值

1.传递参数
无论是preload、init,还是openWindow方法想在页面之间的传值都需要通过extras自定义扩展参数进行数据的传递,比如说这样一个场景,新闻列表页面
点击进入新闻详情页面,需要新闻的newsId传入到新打开的页面,根据newsId进行页面渲染

在这里有一个坑需要注意一下,扩展参数只在打开新的窗口的时候有效,如果页面先经过预加载,然后通过openWindow方法打开的话,这个参数是无法传递的

2.自定义事件
有这么一个场景,列表页有一条数据,点击展开进入详情页,在详情页编辑之后回到列表页,列表页刷新展示新编辑的数据。back之后只会返回到列表页面,
但是返回之后只会返回到列表页,并不会刷新,这样就需要用到mui.fire()方法来自定义一个事件。具体如下

这是详情页面

// 获取列表页面
var list = plus.webview.getWebviewById('list');
//触发列表页面的自定义事件 reload
mui.fire(list, 'reload');

列表页面

//添加reload自定义事件监听
window.addEventListener('newsId',function(event){
    // 执行页面刷新逻辑
});
关闭页面

1.mui.back
mui封装了窗口后退及关闭的方法,可以直接用mui.back()返回之前的窗口,而且back方法监听手机的back返回按键,自动执行返回逻辑,若是不想监听返回按键
可以使用一下方法禁止监听

mui.init({
    keyEventBind: {
        backbutton: false  //关闭back按键监听
    }
});

mui.back支持页面的右滑关闭。默认是未启用的。可以使用以下方法开启

mui.init({
    swipeBack:true //启用右滑关闭功能
});

而且mui.back有一个beforeback参数,结合上面的fire方法可以封装一个返回刷新的逻辑,代码如下

mui.init({
    beforeback: function() {
        // 获取列表页面
        var list = plus.webview.getWebviewById('list');
        //触发列表页面的自定义事件 reload
        mui.fire(list, 'reload');
        // true 继续页面逻辑
        return true;
    }
});

2.mui.currentWebview.close()
mui.currentWebview.close方法可以直接关闭当前webview

本文纯手打,有不当之处请留言!希望能帮到小伙伴们,谢谢!

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WebApp mui&H5+ 可以结合使用 Native.js for Android 完成视频录制和处理。以下是大致的实现步骤: 1. 引入 Native.js for Android 插件,该插件可以在 H5+ 中使用 Native 方法。 2. 使用 H5+ API 调用 Android 摄像头,获取视频流,并且使用 Native 方法将视频流递给 Android Native 代码。 3. 在 Android Native 代码中,使用 Camera2 API 获得视频流,并且使用 MediaRecorder API 将视频流录制为 MP4 格式的视频。 4. 将录制好的视频文件保存到指定的路径,并且使用 Native 方法将视频文件路径递给 H5+ 代码。 5. 在 H5+ 代码中,使用 HTML5 Video 标签来播放录制好的视频。 示例代码如下: H5+ 代码: ``` // 引入 Native.js for Android 插件 document.addEventListener('plusready', function() { var nativeApi = plus.android.importClass('io.dcloud.NativeApi'); var nativeObj = new nativeApi(); // 使用 H5+ API 调用 Android 摄像头 var cmr = plus.camera.getCamera(); cmr.startVideoCapture(function(path) { // 使用 Native 方法将视频流递给 Android Native 代码 nativeObj.exec('com.example.camera', 'startRecording', [path], function(result) { console.log(result); // 使用 Native 方法将视频文件路径递给 H5+ 代码 nativeObj.exec('com.example.camera', 'getVideoPath', [], function(path) { console.log(path); var video = document.getElementById('video'); video.src = path; video.play(); }, function(e) { console.log(e); }); }, function(e) { console.log(e); }); }, function(e) { console.log(e); }, {filename:'_doc/video/', index:1}); }); ``` Android Native 代码: ``` public class CameraPlugin extends CordovaPlugin { private CameraDevice cameraDevice; private MediaRecorder mediaRecorder; private String videoFilePath; @Override public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { if ("startRecording".equals(action)) { startRecording(args.getString(0), callbackContext); return true; } else if ("getVideoPath".equals(action)) { getVideoPath(callbackContext); return true; } return false; } private void startRecording(String path, CallbackContext callbackContext) { try { mediaRecorder = new MediaRecorder(); mediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); mediaRecorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); mediaRecorder.setOutputFile(path); mediaRecorder.setVideoEncodingBitRate(10000000); mediaRecorder.setVideoFrameRate(30); mediaRecorder.setVideoSize(1280, 720); mediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); mediaRecorder.prepare(); mediaRecorder.start(); videoFilePath = path; callbackContext.success(); } catch (Exception e) { callbackContext.error(e.getMessage()); } } private void getVideoPath(CallbackContext callbackContext) { callbackContext.success(videoFilePath); } // ... } ``` 需要注意的是,在 Android 6.0 及以上版本的系统中,需要动态请求摄像头和存储权限。同时,在录制视频时,需要使用新版的 Camera2 API 替换旧版的 Camera API。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值