小程序--一些工作中的比較實用的知識點

小程序-- 工作中一些比較實用的知識點

小程序中設置背景圖片

小程序中不能通過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閱讀 227,702評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,143評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,553評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,620評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,416評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,940評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,024評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,170評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,709評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,597評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,291評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,029評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,407評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,663評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,403評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,746評論 2 370

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,597評論 25 707
  • 每個人在人生的階段里,都會有一個叛逆期,可能出現在少年,青年,亦或老年,而我的叛逆期就出現在和你相遇的那一刻。 那...
    小姐姐很拽閱讀 204評論 0 0
  • 春節的那幾天里天氣一直陰沉,太陽能熱水器出不了熱水,洗澡就成了問題,母親說,橋頭的澡堂子又重新開了,就尋思著帶我去...
    禾月heyue閱讀 483評論 0 0
  • “河流,蜿蜒的從源頭到下游,村莊和集市猶如瓜果生在藤上依偎左右”我的家鄉就是一個這樣的地方,所以歷來大家喜好釣魚,...
    龍囧子閱讀 373評論 2 10
  • 觀察者模式類圖 觀察者模式也稱監聽器模式 當我們對某一個對象的某一些狀態感興趣時,希望在任何時刻獲取其狀態的改變 ...
    jackLee閱讀 320評論 0 0