nativeobj_animation.html 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <head>
  5. <meta charset="utf-8"/>
  6. <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
  7. <meta name="HandheldFriendly" content="true"/>
  8. <meta name="MobileOptimized" content="320"/>
  9. <title>Hello H5+</title>
  10. <script type="text/javascript" src="../js/common.js"></script>
  11. <script type="text/javascript">
  12. var nWaiting,nTitle; // 原生view的等待界面和title
  13. var touchX; // nWaiting的点击坐标的x数值
  14. var backPressed; //返回箭头是否处于按下状态
  15. var contentWebview=null; //准备打开网址的webview
  16. var bitmap=null; // 返回图标
  17. var topoffset=0;
  18. // H5 plus事件处理
  19. function plusReady(){
  20. if(plus.navigator.isImmersedStatusbar()){// 兼容沉浸式状态栏模式
  21. topoffset=Math.round(plus.navigator.getStatusbarHeight());
  22. }
  23. var bdata = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABYCAYAAAADWlKCAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAKwwAACsMBNCkkqwAAABZ0RVh0Q3JlYXRpb24gVGltZQAwOS8xMi8xM5w+I3MAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzVxteM2AAACcklEQVR4nO3a0XESURiG4TeO99iBWoGZ+RvADtKBpAPtwBLsANJBrEAs4MyYDmIHSQXkgk0mMLK7ILt8/+F778ici394OGfDsher1Qqn05tTD+A2M4hYBhHLIGIZRCyDiGUQsQwilkHEMohYBhHLIGIZRCyDiGUQsQwilkHEMohYBhHLIGIZRCyDiGUQsQwilkHEMohYb089wNCVUq6Ay+blfUQsTjhOZxc1P9tbSlkAX7b+/C0ifpxgnF5Ve2TtwAD4OvIoe1UlSAsGwPsRR9m76kA6MAD+jjTKQVUF0gMD4HaEUQ6umot6T4ybiJgNP83hVbFDasGACnZIT4yfEXE1wjj/Xeod0hPjDpgNPsyRSguyB8Y0Ih6Gn+g4pQSpFQMSgtSMAclAaseARCDngAFJQM4FAxKAnBMGiH8xLKVMgV89ln6MiPthpxkn6R0SEUvgusfSZSnlsnuZftI75LlSygyYdyx7ZH1s/Rl+ouFKAQIvx9ctMGlZlh4lDQhAcywtqRhF+hqyXfMmT1m/6buasL6mzMaY6dilAoENlLuWZRNgnhEl1ZH1ulLKO9bH16eOpdfqz2K9Lt0Oea75EjilfadAsp2SFgQ2UH53LJ2XUr4PPtARSntkbVfL7+rVgEBvlM/NHQDJUh9Z2zWf/puOZbPhJzm8qkDgBaXt/teHcSY5rOpAAJp/c/vclJSrShDYifKI+NPvVV3U/1VzU3LavFyo/25SPUi2qj2ysmYQsQwilkHEMohYBhHLIGIZRCyDiGUQsQwilkHEMohYBhHLIGIZRCyDiGUQsQwilkHEMohYBhHLIGIZRCyDiGUQsZ4Ak9fPFwUy/HsAAAAASUVORK5CYII=';
  24. bitmap = new plus.nativeObj.Bitmap('back');
  25. bitmap.loadBase64Data(bdata, function(){
  26. bitmap.isLoadSuccess = true;
  27. nWaiting&&nWaiting.drawBitmap(bitmap,null,{top:topoffset+'px',left:'0px',width:'44px',height:'44px'},'backicon');
  28. console.log('Back bitmap load success');
  29. }, function(e){
  30. console.log('Back bitmap load failed: '+JSON.stringify(e));
  31. });
  32. //创建nWaiting
  33. creatWaiting();
  34. }
  35. if(window.plus){
  36. plusReady();
  37. }else{
  38. document.addEventListener('plusready',plusReady,false);
  39. }
  40. // 创建原生View控件
  41. function creatWaiting(){
  42. console.log('creatWaiting: '+topoffset);
  43. //判断view是否已存在,避免重复创建,尤其调试刷新网页时很容易触发重复创建
  44. nWaiting = plus.nativeObj.View.getViewById('nWaiting');
  45. if(nWaiting){
  46. return;
  47. }
  48. nWaiting = new plus.nativeObj.View('nWaiting',{top:'0px',left:'0px',height:'100%',width:'100%'});
  49. nWaiting.interceptTouchEvent(true);
  50. //初始化绘制nwaiting界面
  51. nWaiting.drawRect('#D74B28',{top:'0px',left:'0px',height:(topoffset+44)+'px',width:'100%'}) //绘制title背景色
  52. bitmap&&bitmap.isLoadSuccess&&nWaiting.drawBitmap(bitmap,null,{top:topoffset+'px',left:'0px',width:'44px',height:'44px'},'backicon');
  53. nWaiting.drawText( '标题', {top:topoffset+'px',left:'0px',width:'100%',height:'44px'}, {size:'17px',color:'#CCCCCC'});
  54. nWaiting.drawRect('#EEEEEE',{top:(topoffset+44)+'px',left:'0px',width:'100%'}) //绘制等待内容区背景色
  55. nWaiting.drawText( '加 载 中 ...', {top:(topoffset+44)+'px',left:'0px',width:'100%',height:'50%'}, {size:'12px',color:'rgb(100,100,100)'});
  56. }
  57. // 使用原生View控件作为动画模板显示窗口
  58. function showWithWaiting(){
  59. var bShow=bUpdate=false;
  60. contentWebview = plus.webview.create('http://m.weibo.cn/u/3196963860', 'contendWebview', {
  61. titleNView:{
  62. autoBackButton: true,
  63. backgroundColor: '#D74B28',
  64. titletText: '标题',
  65. titleColor: '#CCCCCC',
  66. }
  67. });
  68. contentWebview.addEventListener('close', function(){
  69. contentWebview=null;
  70. });
  71. contentWebview.addEventListener('titleUpdate', function(){
  72. bUpdate=true;
  73. bShow&&nWaiting.hide();
  74. }, false);
  75. contentWebview.addEventListener('loaded', function(){// 兼容titleUpdate事件不触发的情况
  76. bUpdate||(bUpdate=true,bShow&&nWaiting.hide());
  77. }, false);
  78. contentWebview.show('pop-in', null, function(){
  79. bShow=true;
  80. bUpdate&&nWaiting.hide();
  81. }, {capture:nWaiting});
  82. }
  83. // 重写返回处理
  84. var _back=window.back;
  85. function safeback(){
  86. contentWebview?contentWebview.close('pop-out'):(bitmap&&bitmap.clear(),nWaiting&&nWaiting.clear(),_back());
  87. }
  88. window.back=safeback;
  89. </script>
  90. <link rel="stylesheet" href="../css/common.css" type="text/css" charset="utf-8"/>
  91. </head>
  92. <body>
  93. <p class="des">
  94. 使用nview来做转场动画,以及使用原生view做标题栏。
  95. </p>
  96. <div class="button" onclick="showWithWaiting()">演示</div>
  97. <p class="des" style="font-weight:bold;text-indent:0;">
  98. 逻辑简述:
  99. </p>
  100. <p class="des">
  101. 启动后先创建一个原生waiting界面,但不显示。
  102. 点击show按钮后,原生waiting做动画进来,同时然后创建一个带原生View控件导航栏的contentWebview加载网络页面,等titleUpdate后显示contentWebview并关闭原生waiting界面。
  103. </p>
  104. </body>
  105. </html>