文档中心 > 店铺动态卡片-开发指引

一、背景


我们支持 WebGL1.0 和 Canvas2D API;同时,也支持创建离屏 Canvas 对象。


注:请开发者自行根据使用场景选择使用。


二、使用方法


请在 app.json 里添加 enableSkia 配置:


{
  "pages": [
    "pages/index/index"
  ],
  "window": {
    "defaultTitle": "My App",
    "enableSkia":"true"
  }
}


三、同层渲染 Canvas


同层渲染 Canvas 为保证 Canvas 组件准确被创建,请在Canvas标签上绑定 onReady 事件,以保证时序。

支持 WebGL 和 Canvas2D。


1. 标签属性


属性名

类型

默认值

描述

id

String

 

组件唯一标识符

style

String

   

class

String

   

width

String

canvas width attribute

 

height

String

canvas height attribute

 

type

String

 

Web Canvas下无效。同层渲染 Canvas 下只支持webgl,默认为canvas2d。

onTap

EventHandle

(function callback)

 

点击

onTouchStart

EventHandle

(function callback)

 

触摸动作开始

onTouchMove

EventHandle

(function callback)

 

触摸后移动

onTouchEnd

EventHandle

(function callback)

 

触摸动作结束

onTouchCancel

EventHandle

(function callback)

 

触摸动作被打断,如来电提醒,弹窗

onLongTap

EventHandle

(function callback)

 

长按 500ms 之后触发,触发了长按事件后进行移动将不会触发屏幕的滚动


2. touch 参数


参数

类型

description

touches

Array<Touch>

当前所有触摸点的列表

changedTouches

Array<Touch>

触发此次事件的触摸点列表

timeStamp

Number

事件触发时的时间戳


3. touch 对象参数


在触控设备上的触摸点。通常是指手指或者触控笔在触屏设备或者触摸板上的操作。


Attributes

Description

identifier

Touch 对象的唯一标识符,只读属性。一次触摸动作(我们值的是手指的触摸)在平面上移动的整个过程中, 该标识符不变。可以根据它来判断跟踪的是否是同一次触摸过程。

x

触点相对于屏幕左上角定点的 X 坐标。

y

触点相对于屏幕左上角定点的 Y 坐标。


4. my.createCanvas


参数

属性名

类型

描述

id

String

要获取上下文的 canvas 组件 canvas-id 属性

success

Function

获取当前上下文句柄


5. WebGL 代码示例


// 注意,同层渲染 Canvas请使用 onReady 事件来获取。
<canvas id="canvas" type="webgl" onReady="canvasOnReady" style=" width: 100%; height: 250px;" />


Page({
 canvasOnReady() {
      my.createCanvas({
        id: 'canvas',
        success: (c) => {
          var canvas = c;
          var ctx = canvas.getContext('webgl');
       var height = canvas.height
     var width = canvas.width
        }
      });
   },
 })


6. Canvas2D 代码示例


// 注意,同层渲染 Canvas请使用 onReady 事件来获取。
<canvas id="canvas" onReady="canvasOnReady" style=" width: 100%; height: 250px;" />


Page({
 canvasOnReady() {
      my.createCanvas({
        id: 'canvas',
        success: (c) => {
          var canvas = c;
          var ctx = canvas.getContext('2d');
          const dpr = my.getSystemInfoSync().pixelRatio
       canvas.width = width * dpr
       canvas.height = height * dpr
        ctx.scale(dpr, dpr)
        }
      });
   },
 })


四、离屏 Canvas


创建离屏 Canvas 示例,不依赖axml文件里的组件标签描述,通过JS创建一个离屏 Canvas 对象来使用。

支持 WebGL 和 Canvas2D。


my.createOffscreenCanvas


代码示例
Page({
 onReady() {
        var offscreenCanvas = my.createOffscreenCanvas(100, 100);
   offscreenCanvas.width = 300;
      offscreenCanvas.height = 300;
     // 使用 2D 上下文
      var context2D = offscreenCanvas.getContext("2d");
     // 使用 WebGL 上下文
      var contextWebGL = offscreenCanvas.getContext("webgl");
     // ...
    });
  },
 })


五、加载图片


支持使用 WebGL 来加载图片,用法如下:


Page({
 onReady() {
        var offscreenCanvas = my.createOffscreenCanvas(100, 100);
   offscreenCanvas.width = 300;
      offscreenCanvas.height = 300;
      var contextWebGL = offscreenCanvas.getContext("webgl");
     var img = offscreenCanvas.createImage();
      img.onload = function () {
         // gl命令
         // 纹理初始化
         // ...
         // 上传图片到纹理
         gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, img);
         // 其他
      }
      img.src = "http://a.hiphotos.baidu.com/image/pic/item/838ba61ea8d3fd1fc9c7b6853a4e251f94ca5f46.jpg";
     
     // ...
    });
  },
 })


六、定时器接口


支持 Web 标准中的?requestAnimationFrame,?cancelAnimationFrame, 用法如下:

ps:此接口是挂在canvas对象下面的,对标h5的接口是挂载在window对象下的。


function draw() {
  var ctx = document.getElementById('canvas').getContext('webgl');
  ctx.clearColor();
  ctx.clear();
  //对标此接口
  window.requestAnimationFrame(draw);
}


示范代码


Page({
  demo() {
    var that = this;
    my.createCanvas({
      id: 'canvas',
      success: (c) => {
        that.canvas = c;
        gl = canvas.getContext('webgl');
        c.requestAnimationFrame(draw);
      }
    });
  },
  draw() {
    // ... gl call
    this.canvas.requestAnimationFrame(draw);
  },
  onReady() {
    this.demo();
  },
});



FAQ

关于此文档暂时还没有FAQ
返回
顶部