小程序--一些工作中的比较实用的知识点

小程序-- 工作中一些比较实用的知识点

小程序中设置背景图片

小程序中不能通过css的background 设置小程序的背景图片

    .container{
        background-image:url(../back.jpg)
    }

这样小程序是识别不出来。
目前是通过image的标签进行设置背景图,但是src也只支持本地图片,不支持网络图片,如果要实用网络图片,只能通过一个wx.downloadFile这个api把图片下载到本地才可以

  <view class="head">
    <image class="head-img" src="../images/homePage/head.png"></image>
  </view>
  
.head {
  width: 100%;
  height: 492rpx;
}

.head-img {
  width: 100%;
  height: 100%;
}
如果要定位的就父层使用position:relative图片层使用position:absolute

在本页面改变上一页面的值

此需求类似于点击输入框 ( 使用text写,而不是input,会弹出小键盘的 ) 进入一个搜索的页面,搜索完成后点击选择项或者点击小键盘的右下角都会返回上一页面,点击选择项的值或者搜索的值要显示在输入框中;我做的就是在搜索框完成后把搜索完成的值传到上一页面。


image.png
image.png
image.png
wxml
<view class='input-container'>
    <text class='input-text' name='school' data-type-name='school'   bindtap ='onFocusInput' style="color:{{school?'#000':'#ddd'}}">{{school ?school : '请输入毕业学校'}}</text>
</view>
 data-type-name 是识别哪一个输入框的。
 使用三元运算符来显示空还是学校
 js

  //点击输入框后开始跳转
  onFocusInput:function(event){
    var that = this;
    console.log("eeee", event);
    // var select = event.detail.value
    if (event.currentTarget.dataset.typeName =='school'){
      var select = that.data.school;
    }else{
      var select = that.data.industry;
    }
    console.log("select",select);
    var typeName = event.currentTarget.dataset.typeName
    console.log("type", typeName);
    wx.navigateTo({
      url: '../search/search?select=' + select + "&typeName=" + typeName
    })
  },

search.wxml
<view class='wrap-container'>
  <view class='main-container'>
    <view class='search-container'>
      <input class='search-input' focus='true' placeholder="{{typeName == 'school' ? '搜索毕业学校' : '搜索所学专业'}}" bindinput='onSearchInput' focus='true'  bindconfirm='onBindConfirm' value="{{typeName == 'school' ? school : industry}}"></input>
    </view>
  </view>
  <view class='content-container'>
    <scroll-view scroll-y style="height: {{screenHeight}}px;" class='content' >
      <view class='content-li' wx:for='{{datasets}}' data-index="{{item}}" bindtap='selectIndex'>
        {{item}}
      </view>
    </scroll-view>
  </view>
</view>

search.js
//点击完成后的函数
  searchConfirmSuccess(res) {
    var that = this;
    this.setData({
      datasets: res.data.data
    })

    var pages = getCurrentPages()    //获取当前加载的页面
    pages是一个数组栈,记录着页面的状态以及data值
    console.log("pages", pages)
    var upToPage = pages[pages.length - 2]    //获取上一页面的对象
    
    // 设置上以页面的data
    if (that.data.typeName == 'school') {
      upToPage.setData({
        school: that.data.key
      })

    } else if (that.data.typeName == 'industry') {
      upToPage.setData({
        industry: that.data.key
      })
    }
    wx.navigateBack({
      // 返回的页面数
      data: 1
    })
    }
//点击搜索之后的选择项的函数
//搜索后进行点击选择
  selectIndex(options){
    console.log("eeee2222222222222", options)
    var pages = getCurrentPages()    //获取加载的页面
    console.log("pages",pages)
    var upToPage = pages[pages.length - 2]    //获取上一页面的对象

    var currentPage = pages[pages.length - 1]  //获取当前页面的对象

    var option = currentPage.options    //如果要获取url中所带的参数可以查看options

    console.log("555555555555555",option)
    //点击选择框后选择后的学校或者专业;根据option.typeName;
      let select = options.currentTarget.dataset.index
      console.log("location", select)
    // 设置上以页面的data
    if (option.typeName == 'school') {
      upToPage.setData({
        school: select
      })
   
    } else if (option.typeName == 'industry') {
      upToPage.setData({
        industry: select
      })
    }
    wx.navigateBack({
      // 返回的页面数
      data: 1
    })


    },

小程序的canvas

小程序中不支持转发到朋友圈,唯一个方式就是通过保存一张带有二维码的图片,进行发送到朋友圈,这就用到了canvas画出得到一张带有二维码的图片,进行保存。

wxml

    <canvas bindlongtap="saveImage" style="width:{{screenWidth}}px;height:{{screenHeight}}px;" canvas-id="qr-canvas" bindtouchend='bindEnd'  disable-scroll = 'true' />
 1. style是定义画布的宽高
 2. canvas-id 是定义canvas的唯一标识
 3. bindtouchend 是触摸结束之后触发的函数,当成点击函数
 4. bindlongtap是长按canvas的触发函数,可当做为长按保存
 5. disable-scroll 是当前页面禁止滚动,

比如我们就绘制一个这样的图片


image.png

其中只有可少奋斗4.1年是绘制上去的,其他的是图片

//res是后台返回的数据 小于10的数字保留一个小数,大于10 保留整数 因为canvas.measureText的计算的是字符串的长度,所以需要将数字进行数字化

    // 可少奋斗多少年
    if (Number(res.years_saved) < 10) {
      var headerTextTwo = Number(res.years_saved).toFixed(1) + '';
    } else {
      var headerTextTwo = parseInt(res.years_saved) + '';
    }
    
    var headerTextOne = '可少奋斗'
    var headerTextThree = '年'
    //根据屏幕的宽度调整系数
    var scale = that.data.screenWidth / that.data.DEF_IMAGE_HEADER_WIDTH
    //绘制图片
    const ctx = wx.createCanvasContext('qr-canvas');
    

    //计算第一个设置大小之后的长度
//大写的都是事先设置好的字号    ctx.setFontSize(that.data.DEF_HEADER_TEXT_SIZE * scale)
    var headerTextWidthOne = ctx.measureText(headerTextOne).width

    //计算第三个设置大小之后的长度
    ctx.setFontSize(that.data.DEF_HEADER_TEXT_SIZE * scale)
    var headerTextWidthThree = ctx.measureText(headerTextThree).width

    console.log("headerTextWidthThree", headerTextWidthThree)
    //计算第二个设置大小之后的长度
    ctx.setFontSize(that.data.DEF_HEADER_HEIGHT * scale)
    var headerTextWidthTwo = ctx.measureText(headerTextTwo).width
    console.log("headerTextWidthTwo6666666666666", headerTextWidthTwo)
    
    //设置左外边距 为了居中显示
    var marginLeftOne = (that.data.screenWidth - headerTextWidthOne - headerTextWidthTwo - headerTextWidthThree) / 2

//setFontSize 是设置字号的,setFillStyle 是设置字体颜色,每次设置都要设置一下字号和颜色,除非都一样的字号和颜色。    ctx.setFontSize(that.data.DEF_HEADER_TEXT_SIZE * scale)
    ctx.fillText(headerTextOne, marginLeftOne, that.data.DEF_HEADER_MARGIN_TOP * scale + 100 * scale)

    //设置第二个文字的颜色
    ctx.setFillStyle(that.data.canvasFontColor);

    ctx.setFontSize(that.data.DEF_HEADER_HEIGHT * scale)

    ctx.fillText(headerTextTwo, marginLeftOne + headerTextWidthOne, that.data.DEF_HEADER_MARGIN_TOP * scale + 100 * scale + 5 * scale)

    //设置第三个文字的颜色
    ctx.setFontSize(that.data.DEF_HEADER_TEXT_SIZE * scale)
    ctx.setFillStyle('black');

    ctx.fillText(headerTextThree, marginLeftOne + headerTextWidthOne + headerTextWidthTwo, that.data.DEF_HEADER_MARGIN_TOP * scale + 100 * scale)


 //背景图片的大小
    ctx.drawImage(canvasHeader, 0, 0, that.data.DEF_IMAGE_HEADER_WIDTH * scale, that.data.DEF_IMAGE_HEADER_HEIGHT * scale);

//draw 可有可无里面的布尔值,当为false时,时清空画布的内容,true是保留画布的内容,也有回调函数。表示当画布绘制完成
ctx.draw(true,function(res){
    console.log("绘制完成")
})

 //保存图片
  saveImage() {
    console.log("我要保存图片了")
    var that = this
    //小程序弹出的一个数组,最上层的index为0 
    wx.showActionSheet({
      itemList: ['保存'],
      success: res => {
        if (res.tapIndex == 0) {
            //小程序的图片输出一个路径
          wx.canvasToTempFilePath({
            canvasId: 'qr-canvas',
            success: res => {
              console.log(res)
              //保存图片到相册
              wx.saveImageToPhotosAlbum({
                filePath: res.tempFilePath,
                success: res => {
                  console.log('saveImageToPhotosAlbum success', res)
                  wx.showToast({
                    title: '保存成功',
                    icon: 'success',
                    duration: 3000
                  })
                  // that.cancel()
                },
                fail: res => {
                  console.log(JSON.stringify(res))
                }
              })
            },
          }, that)
        }
      }
    })

  },
  

是在工作当中出现的有canvas的一个bug存在,就是设定disable-scroll 之后,canvas的长按(bindlongtap)失效,所以如果设定start事件和end事件之间的差值做长按功能就会导致只有end结束之后才会触发事件,有点傻,所以就只能去掉disable-scroll 事件,使用position定位使得canvas处于不同视线内。

<!--pages/analysis-canvas/analysis-canvas.wxml-->
<!-- <text>pages/analysis-canvas/analysis-canvas.wxml</text> -->
<view class='container' disable-scrool>
    <canvas disable-scroll= 'true' style="width:{{screenWidth}}px;height:{{canvasCodeHeight}}px;position:absolute;top:-2000px;left:0;" canvas-id="qr-code-canvas"  />

    <canvas style="width:500px;height:400px;position:absolute;top:0;left:-5000px;" canvas-id="qr-share-canvas"  />

    <canvas   bindlongtap="saveImage"  style="width:{{screenWidth}}px;height:{{screenHeight}}px; position:absolute;top:0;left:0;" canvas-id="qr-canvas" bindtouchend='bindEnd' />
</view>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,028评论 25 707
  • 每个人在人生的阶段里,都会有一个叛逆期,可能出现在少年,青年,亦或老年,而我的叛逆期就出现在和你相遇的那一刻。 那...
    小姐姐很拽阅读 202评论 0 0
  • 春节的那几天里天气一直阴沉,太阳能热水器出不了热水,洗澡就成了问题,母亲说,桥头的澡堂子又重新开了,就寻思着带我去...
    禾月heyue阅读 464评论 0 0
  • “河流,蜿蜒的从源头到下游,村庄和集市犹如瓜果生在藤上依偎左右”我的家乡就是一个这样的地方,所以历来大家喜好钓鱼,...
    龙囧子阅读 369评论 2 10
  • 观察者模式类图 观察者模式也称监听器模式 当我们对某一个对象的某一些状态感兴趣时,希望在任何时刻获取其状态的改变 ...
    jackLee阅读 310评论 0 0