my.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. // 支付宝小程序的context适配
  2. var CAPITALIZED_ATTRS_MAP = {
  3. fillStyle: 'FillStyle',
  4. fontSize: 'FontSize',
  5. globalAlpha: 'GlobalAlpha',
  6. opacity: 'GlobalAlpha',
  7. lineCap: 'LineCap',
  8. lineJoin: 'LineJoin',
  9. lineWidth: 'LineWidth',
  10. miterLimit: 'MiterLimit',
  11. strokeStyle: 'StrokeStyle',
  12. textAlign: 'TextAlign',
  13. textBaseline: 'TextBaseline',
  14. shadow: 'Shadow',
  15. font: 'Font'
  16. };
  17. function strLen(str) {
  18. var len = 0;
  19. for (var i = 0; i < str.length; i++) {
  20. if (str.charCodeAt(i) > 0 && str.charCodeAt(i) < 128) {
  21. len++;
  22. }
  23. else {
  24. len += 2;
  25. }
  26. }
  27. return len;
  28. }
  29. export default (function (ctx) {
  30. Object.keys(CAPITALIZED_ATTRS_MAP).map(function (key) {
  31. Object.defineProperty(ctx, key, {
  32. set: function (value) {
  33. // 记录最新设置的值
  34. ctx["__" + key] = value;
  35. if (key === 'shadow' && ctx.setShadow && Array.isArray(value)) {
  36. ctx.setShadow(value[0], value[1], value[2], value[3]);
  37. return;
  38. }
  39. var name = 'set' + CAPITALIZED_ATTRS_MAP[key];
  40. if (!ctx[name]) {
  41. return;
  42. }
  43. ctx[name](value);
  44. }
  45. });
  46. return key;
  47. });
  48. // 钉钉钉钉小程序框架不支持 measureText 方法,用此方法 mock
  49. if (!ctx.measureText) {
  50. ctx.measureText = function (text) {
  51. var fontSize = 12;
  52. var font = ctx.__font;
  53. if (font) {
  54. fontSize = parseInt(font.split(' ')[3], 10);
  55. }
  56. fontSize /= 2;
  57. return {
  58. width: strLen(text) * fontSize
  59. };
  60. };
  61. }
  62. return ctx;
  63. });