2 Star 4 Fork 4

kan尘埃 / View-App

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MIT

view-app

  • 这是一个在原生js基础上开发的针对iptv行业的交互框架
  • 参考了android的Application和activity实现整个页面的交互及生命周期
  • 使用webpack打包
  • 区分开发模式及生产模式

说明文档在线地址

空项目、初始项目

当前没有创建项目的脚手架,使用一下两个地址拉取空项目,用以创建项目

生成页面的工具,可以用在线动态布局,也可以用在项目开发中搭建页面

环境及npm命令

  • node环境
  • 使用webpack打包

初始化工程

    npm install

本地调试运行

使用开发模式运行,可以在页面上看到打印,在F12看到源码

    npm run server

    npm run dev

生产环境运行

使用生产模式运行,取消在页面上的打印,在F12看不到源码

    npm run pro

打包

  • 测试环境使用

可以在页面上看到打印,没有.map映射文件

  npm run build-dev
  • 生产环境使用

取消在页面上的打印,没有.map映射文件

  npm run build

  npm run start

  npm run build-pro

起步

Application启动

  • 在/View-App.js确定使用哪个Application,一般会写一个Application的子类
  • 调用application的launch方法,启动应用
import './src/css' //页面对应样式,全局导入

import MyApplication from "./src/MyApplication";//Application的自定义子类

var start = new Date().getTime();//启动前的时间
window.onload = function () {//在onload中启动,是因为css文件加载是异步的
	//需要在css加载完之后才能启动app
	window.application = new MyApplication("app");//创建应用
	window.application.launch();//启动应用

	console.log(new Date().getTime() - start)//打印启动应用的时长
}

自定义Application

  • 继承Application
export default class MyApplication extends Application {
    
}
  • 重写onLaunch方法 onLaunch方法返回的Page是应用启动的第一个Page
export default class MyApplication extends Application {
    onLaunch(urlParam) {
      console.log("onLaunch,地址栏参数:", urlParam);//外部在地址栏中传递的参数
      var firstPage = null;
      var param = null;//这个是传递给第一个Page的参数
      switch (urlParam.pageKey) {//根据参数中的规定key对应的值选择哪个Page是第一个Page
        case "home":
          // firstPage = new HomePage();
          firstPage = "HomePage";//对应view.config.js中的页面,两种形式都是可以的,但建议使用这种
          break;
      }
      return {firstPage, param};//返回第一个Page,及对应的参数
    }
}
    
  • 剩余生命周期的回调方法
export default class MyApplication extends Application {
  //应用创建,启动第一个页面之前调用
  onCreate(page, param){//page为第一个Page,param为对应的参数
  }
  
  //应用停止,一般在跳转到外部,和销毁应用时调用
  onStop(){}
    
  //应用销毁,跳转到外部不会调用该方法,只有销毁时会调用
  //如果是android混合模式,可以在这里调用关闭WebView或关闭android app
  onDestroy(){}
}
    
  • 正常退出应用的
export default class MyApplication extends Application {
  //如果是android混合模式,也可以在这里调用关闭WebView或关闭android app
  exitUrl() {
    var url = "";//退出应用跳转的地址,这地址可以自定义,一般由启动应用时,地址栏中的参数,比如:backUrl、returnUrl等
    return url;
  }
}
  • 强制使用Enter模式进入app
export default class MyApplication extends Application {
  /**
   * 
   * @param param
   * @returns {boolean} true:以Enter模式进入;false:根据情况获取进入模式
   */
    forceEnter(param) {
        var flag = false;
        if (param.enter) {//当参数中key为enter有值时
            flag = true;
        }
        return flag;
    }
}

  • 全局播放器
export default class MyApplication extends Application {
  getPlayerInstance() {
    var player = {};
    try{
      player = new IptvPlayer();//iptv的播放器
    }catch (e){
      //其他播放器创建
      player = new AliWebPlayer();//阿里web播放器
    }
    return player;
  }
}
  • 页面配置

    在view.config.js文件中配置页面

    • 1.跳转到外部返回应用后,恢复page
    • 2.page.startPage("HomePage");//可以这么使用了
  /**
   * 定义PageName对应的Page,舍去在Page子类中赋值pageName步骤
   */
  export var PageConfig = {
            "HomePage": HomePage,
            "ListPage": ListPage,
            "FramePage": FramePage,
            "TestPage": TestPage,
            "PlayerPage": PlayerPage
          }
  
  /**
   * 默认的page
   * 当未获取到第一个页面时,会使用该页面
   * @type {string}
   */
  export var LaunchPage = "HomePage";

Page构建

说明:控制页面渲染、操作,及业务逻辑的所在

  • 定义,继承Page
export default class HomePage extends Page {
}
  • Page生命周期回调
export default class HomePage extends Page {
  //Page创建回调
  //页面的节点及滚动器创建
  //内部没有内容,需要在这个方法中调用this.html = "";设置布局
  onCreate(param){//param是传入的参数,param由application或上一个Page组装
    this.html = "<div></div>";//这里的html一般由import引入
  }
  
  //Page执行到前台,页面已显示
  //1.从创建之后到前台
  //2.从其他Page返回当前Page
  onResume(){}
      
  //Page执行进入后台状态,页面已隐藏
  //跳转到其他页面时,有两种状态
  //1.当前页面暂停
  //2.当前页面关闭,紧接着会调用停止方法
  onPause(){
    //一般播放暂停在这里调用
  }
      
  //Page执行到停止
  onStop(){
    
  }
      
  //Page执行到销毁
  //页面回收、数据销毁
  onDestroy(){
    
  }    
}
  • Page之间的数据传递

1.跳转到新的Page

export default class HomePage extends Page {
  //页面默认的点击监听
  onClickListener(view) {
    console.log(view.pageName, "-onClickListener", view);
    var listPage = new ListPage();//ListPage是另一个Page
    this.startPage(listPage, {data: "llllll"});//第二个参数是传递到ListPage的数据
  }
}
  
export default class ListPage extends Page {
  onCreate(param){//由HomePage中传递的数据 {data: "llllll"}
    
  }
}

2.返回到上一个页面

export default class ListPage extends Page {
  //重写返回键
  key_back_event() {
    this.setResult({data: "来自ListPage的数据"});
    this.finish();//回到上一个Page(HomePage)
  }
}
	
export default class HomePage extends Page {
  onResult(backResultData){//由ListPage回传的数据,{data: "来自ListPage的数据"}
    
  }
}
  
  • 播放器使用
export default class HomePage extends Page {
  onCreate(param) {
    this.html = html;

    this.player = new VideoPlayer(this);
  }
    
  onResume(){
    var playInfo = new PlayInfo("", 0, 0, 1280, 720);//播放地址,及视频位置
    this.player.play(0, playInfo);//从0开始播放
  }
}

编写扩展控件的模式

例如需要创建Button扩展控件

  • 1.在/src/custom-view文件夹中创建Button文件夹
  • 2.在/src/custom-viewButton/下创建Button.js
export default class Button extends ItemView{
    //...
    //其他功能性代码省略
    //...

  static parseByEle(ele, viewManager, listenerLocation) {
    var button = new Button(viewManager, listenerLocation);
    button.ele = ele;
    return button;
  }
}
  • 3.在Button.js中定义一个继承ViewBuilder的class
export class ButtonBuilder extends ViewBuilder {
  constructor() {
    super();
    this.viewType = "button";
  }

  buildView(ele, viewManager, listenerLocation) {
    return Button.parseByEle(ele, viewManager, listenerLocation);
  }
}
  • 4.在main.js的application.launch()方法执行之前调用
window.onload = function () {
  ViewManager.addCustomViewBuilder([ButtonBuilder]);//ButtonBuilder为对应的扩展控件

  //...
  //其他代码省略
  //...
}

组件介绍

未完待续,暂时可以参考Demo下的样例

注意点

监听器注意点

  • 监听器一般有点击、焦点变化、显示变化、滚动监听器
  • 可以是用监听器设置,
    • 直接设置方法本体
    • 方法名设置,就是设置字符串,会寻找对应的方法作为监听器
    • 寻找对应的方法作为监听器,这个在listenerLocation(Page、Fragment或dialog内)
  • 监听触发后,内部this指向,指向listenerLocation

方法寻找和监听器内部this指向的规则

this.html = "";//这个this,可以在监听器内部打印下this,来查看this具体是什么

播放器对接注意点

  • 实现RealPlayer的所有方法,播放器的基本功能就可以使用了
  • 调教播放器,提升播放器体验,需要了解VideoPlayer的工作机制
  • 在@src/util/AliWebPlayer是使用阿里h5播放器实现的,具体对接可以参考这个

图片注意点

  • 在html直接设置的图片要放置在images文件夹,直接使用
<img src="../images/bg.jpg" alt="">

在js中,可以直接引用

  require("../images/bg.jpg")
  • 建议:在js中使用时,将图片放在images文件夹,使用require引入,使用比import方便,可以不用images-js文件夹

文字跑马灯注意点

  • 会自动加上overflow:hidden;line-height:{height}
  • white-space: nowrap;判定为横向跑马灯
  • 其他情况为纵向跑马灯;多个单词可能为多行,或者使用<br>强制换行,当多行时可执行纵向跑马灯

全局滚动开关

State.ScrollAnimation值: true:打开 false:关闭

  • 在main.js
var start = new Date().getTime();
window.onload = function () {
    State.ScrollAnimation = true;//控制滚动动画开关
    //需要在css加载完之后才能启动app
    window.application = new MyApplication("app");
    window.application.launch();

    //调试结束后,可以改成这样的写法,全局无法获取到application对象,安全性更高
    // var application = new MyApplication("app");
    // application.launch();

    console.log(new Date().getTime() - start)
}

打印注意点

  • 每个Page都会默认带一个LogView,使用开发模式和打测试包时默认显示,正式包默认不生效
  • 在Page 调用this.html = "";之后调用
  • 默认显示位置在左上角,可以设置显示位置(9宫格的位置)
  • 调用方式
  class HomePage extends Page{
      onCreate(){
          this.html = require("../html/home.html");//实际的布局文件
          
          //必须在this.html = "";之后使用
          this.i("显示绿色的提示信息");
          this.w("显示黄色的警告信息");
          this.e("显示红色的错误信息");
      }
  
  }

版本注意点

  • 0.3.* -> 0.4.*及以上版本,需要新增page配置文件(view.config.js),该配置可以在继承Page时,不用写构造方法,在继承Application中不用写构造方法
  • 0.4.1及以上版本不需要在webpack.config.js中切换环境,只需执行不同的命令即可

代码现存问题

  • Fragment中不能嵌套FrameView,预计在后续版本中优化
  • 打包的文件,在部分盒子中黑屏,正在定位中

开发者须知

  • 1.该框架的运行环境 node,使用webpack打包
  • 2.当前版在适配中需要调整编译的es版本,在必要时需要舍弃某些写法,使用其他写法,故版本中的框架核心代码都是源码
  • 3.开发者有任何疑问,可以留言
  • 4.如果有建议,也可留言,
  • 5.目前作者只有一人,在IPTV行业有者5年开发经验,熟悉各种盒子的适配
  • 6.该框架之前有一个前置版本
    • 目前仍在线使用,但适配经验在本框架中适应,
    • 该前置版本在(2020-2021)2年时间里已落地50个左右的项目,分别在全国不同地区、不同运营商落地
    • github地址:https://github.com/kanchenai/View.git
    • 该版本具有极强的适配性及功能非常稳定,可以适配当前所有盒子
    • 该版本为多页面,不同的页面之间需要通过url跳转串联
MIT License Copyright (c) 2022 kan尘埃 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

简介

目标受众EPG开发,这是一个在原生js基础上开发的针对iptv行业的交互框架 展开 收起
JavaScript 等 4 种语言
MIT
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
JavaScript
1
https://gitee.com/kanchenai/View-App.git
git@gitee.com:kanchenai/View-App.git
kanchenai
View-App
View-App
main

搜索帮助