1.如何使用view实现常见的UI布局

(1)先来看view常见的属性
在这里插入图片描述
hover-class:按住元素会加一个bc_red的类样式
hover-stop-propagation:阻止父节点出现单击态,默认为false不阻止
这样点击子组件,父组件就不会触发了
在这里插入图片描述
catchtap同bindtap事件一样,也是绑定事件,但是可以阻止冒泡事件,这样点击子元素就不会触发父元素的点击事件。

(2)接下来了解下flex布局
先来了解下主轴辅轴,这两个概念是通过flex-direction设置的值来判断的,值为row(从左到右)或者row-reverse(从右到左)时,表示元素横向排列,主轴为X辅轴为Y。值为colum(从上到下)或者colum-reverse(从下到上)的时候,纵向排列,主轴为Y辅轴为X。
ps:接下来的例子默认主轴为X辅轴为Y
1.justify-content:调整内容在主轴方向的排列方式
- flex-start:元素向主轴的起点看齐
在这里插入图片描述

  • flex-end:元素向主轴的尾部看齐

  • center:居中对齐

  • space-between:向首尾对齐,子元素中间间隔相等,两端没有间隔,(如果发现两端有间隔,可以看看父元素有没有伪类)。
    在这里插入图片描述

  • space-around:空白在周围均匀分布
    在这里插入图片描述
    2.align-items:对齐元素在辅轴方向的对齐方式

  • stretch:拉伸填满整个容器(子元素不能有height和min-height的束缚)
    在这里插入图片描述

  • flex-start:横向的时候就是顶部对齐
    在这里插入图片描述

  • flex-end:横向的时候就是底部对齐
    在这里插入图片描述

  • center:居中对齐
    在这里插入图片描述

  • baseline:以子元素的第一行文字对齐的
    在这里插入图片描述
    3.align-content:对齐多行内容再辅轴方向上的排列方式

  • 同justify-content的值作用相同
    4.flex-wrap:主轴一行显示不了的时候的换行策略

  • no-wrap不换行(默认)

  • wrap:换行
    在这里插入图片描述

  • wrap-reverse:反向换行,第一行在最下面

2.如何把view上的内容绘制到画布上,生成一张海报

1.先用wx.createCanvasContext创建一个画布,
2.在画布上绘制内容、文本或者是图片。
3.接着通过wx.canvasToTempFilePath保存到本地并获取一个临时图片路径
4.最后通过wx.saveImageToPhotosAlbum保存临时文件到本地相册里
这里只是一个简单的例子,如果想看内容丰富一点的例子,可以移步到这个链接[https://www.cnblogs.com/lingXie/p/10609530.html](https://www.cnblogs.com/lingXie/p/10609530.html)

在这里插入图片描述
保存后的图片
在这里插入图片描述

具体代码:
<view class="container">
<!-- 画布 -->
<!-- canvas -->
<canvas bindlongpress='baocun' canvas-id="myCanvas" style="width:300px;height:320px;position:fixed;top:40px;"></canvas>
<!-- 要保存至相册的图片 -->
</view>
//index.js
const app = getApp()

Page({
  data: {
    imagePath:''
  },

  onLoad: function() {
    // 调用画布
    // this.createNewImg();
    var that=this;
    setTimeout(function(){
      that.createNewImg(); 
    },500);
  },

   /*
   1.绘制画布
   2.将canvas转换为图片保存到本地,然后将图片路径传给image图片的src
   */
  createNewImg: function () {
    var that = this;
    var ctx = wx.createCanvasContext('myCanvas');
    //绘制文本
    //语法:fillText(text, x, y, [maxWidth]) strokeText(text, x, y, [maxWidth])
    ctx.font = "normal 18px Arial";
    ctx.textAlign = 'center';
    ctx.textBaseline = 'bottom';
    ctx.fillStyle = 'blue';
    ctx.fillText("我是一张图,长按可以保存", 150, 250);
    //图片绘制
    var img='../../mock/images/test.jpg';
    ctx.drawImage(img, 0, 0, 300, 200);
    ctx.save(); // 保存当前ctx的状态 ctx.restore();
    ctx.draw();
    setTimeout(function () {
      wx.canvasToTempFilePath({
        x: 0,
        y: 0,
        width: 300,
        height: 320,
        destWidth: 300 * 2,//生成图片的大小设置成canvas大小的二倍解决模糊
        destHeight: 320 * 2,
        canvasId: 'myCanvas',
        fileType: 'jpg',
        success: function (res) {
          var tempFilePath = res.tempFilePath;
          that.setData({
            imagePath: tempFilePath
          });
          wx.hideToast();
          console.log('canvas图片地址:' + that.data.imagePath);
        }
      });
    }, 600);
  },
   
  //点击保存到相册
  baocun: function () {
    var that = this;
    wx.saveImageToPhotosAlbum({
      filePath: that.data.imagePath,
      success(res) {
        wx.showModal({
          content: '图片已保存到相册,赶紧晒一下吧~',
          showCancel: false,
          confirmText: '好的',
          confirmColor: '#333',
          success: function (res) {
            if (res.confirm) {
              console.log('用户点击确定');
            }
          }, fail: function (res) {
            console.log(res)
          }
        })
      }
    })
  },
})

Logo

一站式 AI 云服务平台

更多推荐